BeamNG uses a Z-up coordinate system with SI units (meters, kilograms, and so on). Positions in JBeam, most vehicle logic, and BeamNG.tech sensor placement all use the same vehicle frame, which is defined by refnodes .
Important — BeamNG vehicle axes are not ISO / robotics convention.
In vehicle space: +X = left, +Y = backward, +Z = up, and forward = −Y (not +X). Many tools, textbooks, and other simulators use +X forward and +Y lateral instead. Using that assumption in JBeam, Lua, or sensor placement will place nodes and directions incorrectly—often rotated by 90° or more. World (map) space is also Z-up but uses fixed map axes, not the vehicle’s heading.
The vehicle frame is anchored at the vehicle refnode (near the center and lowest point of the body). Its axes are set explicitly in JBeam:
left:Forward (direction of travel) is −Y, not +X.
Right is −X.
This matches the refnodes
definitions: the left: node lies on +X, the back: node on +Y, and the up: node on +Z from the ref: node.
forward (−Y)
↑
|
left (+X) ←----------● ref ----------→ right (−X)
|
↓
backward (+Y)
Nodes coordinates in JBeam files are expressed in this same vehicle frame (meters relative to the vehicle structure). When you add or move nodes, increasing X moves left, increasing Y moves toward the rear, and increasing Z moves up.
The world (map) frame is also Z-up. The map origin is at world position (0, 0, 0). Horizontal map axes are world X and Y; Z is elevation.
World axes are fixed to the level, not rotated with each vehicle. A vehicle’s world position and orientation come from where it is spawned and how it is rotated on the map. To convert between world and vehicle frames you must use the vehicle’s current pose (position and orientation), not assume world X/Y align with the vehicle’s forward/lateral directions.
BeamNG.tech sensors often accept positions in vehicle space (relative to the vehicle, using the table above) or world space (fixed to the map). See each sensor’s pos argument and flags such as is_dir_world_space in the sensor documentation
.
Props
use a per-prop local frame built from three nodes (idRef, idX, idY): +X points from idRef to idX, +Y from idRef to idY, and +Z from the cross product of those two directions.
Refnode leftCorner and rightCorner nodes mark the front corners of the vehicle (for checkpoints and similar gameplay). They do not redefine the X/Y/Z axes; they only indicate where the front of the body is relative to the ref frame.
Research and ADAS workflows use the same vehicle frame as modding:
pos values attached to a vehicle are usually in vehicle space (left / back / up as above).If you use BeamNGpy , ROS 2 , or the ADAS Sensor Configuration Editor , read the sensor documentation together with this page before placing sensors or interpreting logged data in the simulation.
Was this article helpful?