Coordinate systems

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.

Vehicle coordinate system

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:

Axis
Positive direction
Typical use
Axis
+X
Positive direction
Left (driver’s left on a left-hand-drive car)
Typical use
Lateral offset — refnode left:
Axis
+Y
Positive direction
Backward (toward the rear of the vehicle)
Typical use
Longitudinal offset behind the ref
Axis
+Z
Positive direction
Up
Typical use
Height above the ref

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.

Top view (vehicle frame)

                    forward (−Y)
                         |
    left (+X) ←----------● ref ----------→ right (−X)
                         |
                    backward (+Y)

Node positions in JBeam

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.

World coordinate system

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 .

Other frames on a vehicle

Prop local coordinates

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.

Checkpoint corners

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.

BeamNG.tech and sensors

Research and ADAS workflows use the same vehicle frame as modding:

  • Sensor pos values attached to a vehicle are usually in vehicle space (left / back / up as above).
  • Map-fixed sensors use world space.
  • GPS relates map coordinates to a user-defined geographic reference at the map origin.

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.

Related pages

Last modified: June 8, 2026

Any further questions?

Join our discord
Our documentation is currently incomplete and undergoing active development. If you have any questions or feedback, please visit this forum thread.