Render time
A 3D render draws every camera at every one of its frames, so its time grows with the number of cameras x pixels x frames, plus a fixed cost to load the map. Lidar and radar add ray casts and a review video each. Measured on an RTX 5080 with the three example rigs on easterbrook-discovery-school, a 10 second scenario:
Peak GPU memory stayed under 2.5 GiB for all three, with full textures. Most of the rest of the time is encoding the videos (10.9 s for the seven cameras) and loading the map and actors (about 3 s). A single
simforge preview frame took 9 s.
To render faster: use --preset training, lower width and height, render a part of the scenario with the rig’s clip, ask only for the passes you need (--passes rgb), and skip videos you do not need (--video off). Check a mount with simforge preview frame before a full render.
GPU memory
GPU memory depends far more on the map and the texture tier than on the cameras. On san-ramon-phase-1 with full textures, one 1280x720 camera peaks at 11.3 GiB and six 1920x1080 cameras at 11.9 GiB; with 512 px textures (--textures bc7-512), 3.8 and 4.5 GiB. The full table per map is in Preview and render. A render that does not fit fails with native_gpu_out_of_memory: use --textures bc7-512, fewer or smaller cameras, or --cloud.
Cloud price
A cloud render’s price does not depend on the rig: more cameras, lidar or radar do not change it, and 2D renders are free.--dry-run shows the price before anything runs, and --max-cost caps it (Run in the cloud). A cloud render returns each sensor’s video, render.json and results.json; render locally for the per-frame images, depth and point clouds.
Limits
Rig errors and fixes
simforge rig validate prints one JSON error and exits 2. These are its real messages:
A render then checks what the renderer supports; its errors are listed in the rig file reference. The most common:
FAQ
My images are mirrored left to right, or a side camera shows the wrong side. The frame is x forward, y up, z left, and yaw is positive to the left. A calibration in a right-handed frame needs converting.simforge rig show names each sensor’s facing.
Can I give fx, fy, cx and cy? Not yet. A pinhole camera is square-pixelled with the principal point at the centre: set horizontalFovDeg = 2 x atan(width / (2 x fx)). For a lens with distortion, fit an f-theta polynomial.
Which distortion models are supported? The f-theta polynomial only. Brown-Conrady (OpenCV), Kannala-Brandt and equidistant fisheye are not supported yet.
Do I need one rig per scenario? No. A rig names no scenario: pass the same file to every render. Every source is mounted on the scenario’s ego.
Do I need one rig per vehicle? Positions are absolute metres, so a car rig on a truck keeps the car’s mount heights. Write one rig per vehicle class, or start from simforge rig init --preset <preset> --class <class>.
Can Studio use my rig file? Not yet: Studio offers the built-in rigs and the rig a scenario last rendered with. Render your rig with the CLI, locally or with --cloud.
Why does my cloud render have no PNGs or point clouds? A cloud 3D render returns the videos, render.json and results.json. Render locally for the per-frame files.
Every radar detection is a few centimetres away. The radar is inside the vehicle’s body and sees only the body. Move it just outside: the example’s front radar sits 0.2 m ahead of the box’s front edge.
My lidar wrote more scans than it made revolutions. It writes one full scan per rendered frame, at the camera rate, not one per revolution. See lidar files.
Are IMU or GNSS supported? Not as sensors. The ego’s exact pose at every frame is in observed-frames.jsonl.
Still stuck? Ask on the SimForge Discord with the rig file and the command you ran.