SceneFactory-3D: Lifting 2D Traffic Scenes into 3D Physical Counterfactuals for Scalable Physically Grounded Safety Evaluation
Organizations: Rochester Institute of Technology · City University of Hong Kong · New York University
Abstract
Scalable driving simulators typically execute vehicle commands using prescribed behavioral or kinematic rules, overlooking the physics of tire-road interfaces, thereby limiting their ability to capture how adverse road and environmental conditions alter vehicle execution and propagate through traffic. To address this limitation, we present SceneFactory-3D, a GPU-batched, physics-grounded multi-agent driving simulator. Vehicles execute acceleration and steering commands via suspension- and friction-limited forces evaluated at each wheel-contact point. Spatially varying friction, per-world 3D heightfields, gravity, and rigid contact consistently govern wheel motion and chassis collisions. Per-world terrain isolation and GPU batching enable SceneFactory-3D to run matched physical counterfactuals in parallel: traffic scenario setup and vehicle controllers remain fixed while only the road condition changes, enabling the resulting closed-loop effects to be evaluated across parallel worlds. To demonstrate the advantage of the SceneFactory-3D-enabled counterfactual evaluation, we conduct an empirical study on vehicle controllers' sensitivity to road conditions. We study three learned-policy families on 1,024 matched 12-vehicle worlds per condition, and two classical planners on a shared 32-world subset, across 21 friction and grade conditions. When friction drops from 1.0 to 0.18, the share of vehicles that clear the work zone safely falls by 6 to 90 percentage points across learned policies (18-19 for classical planners), and near-collision situations become more frequent for every learned policy. Code: https://github.com/SmallWorldLab/SceneFactory_3D
Figures & tables
| Valid passage | Speed | |||||||
| Regime | Worlds | Ref. | grade | (m/s) | ||||
| Tier 2: 1,024 worlds per checkpoint; mean over 4 training seeds (min, max over seeds) | ||||||||
| Frozen L0 | 1,024 | .81 (.28, .99) | .27 ( .70, .01) | .57 ( .90, .21) | .69 ( .93, .12) | .05 ( .10, +.00) | .06 (.01, .14) | 16.3 (14.7, 17.5) |
| L0-T | 1,024 | .87 (.53, 1.00) | .12 ( .36, .00) | .49 ( .83, .07) | .70 ( .89, .42) | .03 ( .13, +.00) | .15 (.01, .51) | 14.9 (12.0, 20.1) |
| L1 | 1,024 | .86 (.48, 1.00) | .05 ( .18, .00) | .26 ( .47, .06) | .65 ( .93, .35) | .06 ( .15, +.00) | .07 (.01, .20) | 14.8 (11.0, 19.9) |
| Tier 1: classical controllers on the first 32 Tier-2 worlds (learned rows: Table 18 ) | ||||||||
Appendix figures & tables20 assets
Supplementary material from the paper’s appendix.
Appendix
| System | Vehicle execution | Surrounding traffic | Local friction | Non-flat road | Parallel execution |
|---|---|---|---|---|---|
| SUMO | behavioral models | same | n.v. | n.v. | n.v. |
| Waymax | kinematic bicycle or position delta | same | no tire model | n.v. | accelerator |
| GPUDrive | kinematic bicycle (default) | same | no tire model | n.v. | GPU, steps/s |
| CommonRoad | planar models incl. dynamic single-track; friction-circle checks | scenario agents | n.v. | n.v. | n.v. |
| CARLA | engine vehicle physics | physics; optional hybrid mode teleports distant vehicles | friction triggers | n.v. | n.v. |
| SMARTS | Bullet for vehicles of interest | SUMO | n.v. | n.v. | n.v. |
| Aspect | SceneFactory | SceneFactory-3D |
|---|---|---|
| Batching | Isaac Lab, many worlds per GPU | Inherited; Newton XPBD backend |
| Vehicle | Articulated PhysX body, no explicit tire model | Rigid chassis, raycast suspension, per-wheel tire forces (Sec. 4.2 ) |
| Friction | One coefficient per world, from weather | Spatial patches evaluated at each wheel contact |
| Road geometry | Waymo topologies, flattened to | Per-world heightfields; procedural road in this study |
| Policy interface | Goal-reaching RL with weather context | Canonical routes shared by classical and learned controllers |
| Comparison | Friction-aware vs. friction-blind policy | Matched reference/changed worlds with recorded checks |
| Mass | 1400 kg | Spring rate | 34,000 N/m |
|---|---|---|---|
| Length width | m | Damping | 3,400 N s/m |
| Wheelbase / track | 2.62 / 1.54 m | Wheel inertia | 1.3 kg m 2 |
| Wheel radius | 0.32 m | Drive torque (total) | 2,200 N m |
| Suspension rest length | 0.38 m | Power | 135 kW |
| Grip factor | 1.05 | Brake torque (per wheel) | 1,800 N m |
| Steering limit | 0.55 rad | Drag area | 0.65 m 2 |
| Condition | Wheel | Slope (%) | Brake (m/s 2 ) | Stop (m) | Coast (m/s 2 ) |
|---|---|---|---|---|---|
| Reference | 1.00 | 0.00 | 10.02 | 12.5 | |
| 0.70 | 0.00 | 7.23 | 17.3 | — | |
| 0.50 | 0.00 | 5.17 | 24.2 | — | |
| 0.35 | 0.00 | 3.63 | 34.5 | — | |
| 0.25 | 0.00 | 2.60 | 48.1 | — | |
| 0.18 | 0.00 | 1.88 | 66.5 | — |
| Controller | Decision mechanism | Terrain training | Preview |
|---|---|---|---|
| IDM-17 | IDM longitudinal law + Stanley route tracking | — | No |
| PDM-Closed-17 | Published PDM proposals/scoring + LQR tracking | — | No |
| Frozen L0 | Route-conditioned policy, nominal roads | No | No |
| L0-T | Frozen L0 continued on terrain-diverse roads | Yes | No |
| L1 | As L0-T, with physical preview inputs | Yes | Yes |
| Block | Width | Content (scale) |
|---|---|---|
| Ego | 9 | speed (12), lateral speed (5), yaw rate (1), steering angle (0.55), previous acceleration and steering actions (1), cross-track error (2), heading error (1), route curvature (0.02) |
| Route preview | 12 | route points 2, 5, 10, 15, 20, 30 m ahead, forward and left (30) |
| Acceleration | 1 | speed change over the last decision divided by 0.1 s (4) |
| Route leader | 6 | presence, gap (50), relative speed (12), lateral offset (2), sine and cosine of relative heading |
| Neighbors | 60 | six nearest vehicles within 40 m, each: valid, (30), (10), (12), (5), sine and cosine of relative heading, distance (30), route-arc offset (30), lateral offset (5) |
| Semantics | 24 | held at zero |
| Variable | Continuation training | Final benchmark |
|---|---|---|
| Friction mode | none 40%, road band 40%, lane band 10%, whole road 10% | closing-lane patch |
| Friction value | bands ; whole road | 0.70 to 0.05 |
| Patch length | 25–70 m (25% add a second band) | 140 m |
| Grade | half flat, half rolling fields: three plane waves, wavelength 90–220 m, maximum grade 4–9% | constant to with 20 m transitions |
| Road and task | procedural single routes, following, platoons, lane shifts, merges, crossings | straight two-lane closure |
| Vehicles per world | 1 (first stage) or 6 | 12 |
| Study | Task and controllers | Sample | Horizon | Role |
|---|---|---|---|---|
| Probes | One vehicle, fixed commands, 21 conditions | one run per condition | to stop or exit | verification (App. C ) |
| Development | Held-out training-family scenes; three learned families, 4 seeds, plus nominalized preview | 256 scenes 6 vehicles per cell | 35 s | preliminary evidence |
| Final Tier 1 | Closure task; all five regimes; 21 conditions | 32 worlds 12 vehicles | 66 s | cross-controller comparison |
| Final Tier 2 | Closure task; three learned families, 4 seeds; 21 conditions | 1,024 worlds 12 vehicles | 66 s | learned-controller statistics |
| Condition | Controller | Success | Failure | Speed (m/s) |
|---|---|---|---|---|
| Nominal | Frozen L0 | |||
| L0-T | ||||
| L1 | ||||
| L1 (nominal preview) | ||||
| Road band | Frozen L0 | |||
| L0-T |
| Vehicle-steps/s (millions) | 21 terrains | Loop (s) | Peak GPU | Efficiency | |||
|---|---|---|---|---|---|---|---|
| Worlds | no log | log | log+safety | log+safety | log+safety | (GB) | log+safety |
| 64 | 0.15 | 0.13 | 0.11 | 0.10 | 27.0 | 0.56 | 1.00 |
| 128 | 0.30 | 0.25 | 0.23 | 0.19 | 27.0 | 1.10 | 1.00 |
| 256 | 0.59 | 0.51 | 0.45 | 0.39 | 26.9 | 2.18 | 1.00 |
| 512 | 1.15 | 0.99 | 0.89 | 0.75 | 27.3 | 4.35 | 0.99 |
| 1,024 | 2.24 | 1.92 | 1.71 | 1.40 | 28.4 | 8.67 | 0.95 |
| Condition | Same-batch reruns | Across batch sizes 64–1,024 | ||
|---|---|---|---|---|
| vehicle flips (max) | vehicle flips | worlds changed | mean VP (max) | |
| Reference | 0 of 768 | 11–28 of 768 | 6–14 of 64 | 0.010 |
| 2 of 768 | 70–112 of 768 | 22–34 of 64 | 0.029 | |
| Checkpoint | Ref. | ..70 | ..50 | ..35 | ..25 | ..18 | ..12 | ..08 | ..05 | ,.18 | ,.18 | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Frozen L0 s0 | 0.98 | 0.09 | 0.34 | 0.70 | 0.89 | 0.90 | 0.87 | 0.86 | 0.82 | +0.00 | 0.00 | 0.01 | 0.90 | 0.89 |
| Frozen L0 s1 | 0.99 | 0.00 | 0.02 | 0.17 | 0.48 | 0.85 | 0.93 | 0.94 | 0.92 | +0.01 | 0.04 | 0.09 | 0.90 | 0.79 |
| Frozen L0 s2 | 0.98 | 0.00 | 0.00 | 0.01 | 0.08 | 0.30 | 0.66 | 0.85 | 0.87 | +0.00 | +0.00 | +0.00 | 0.47 | 0.20 |
| Frozen L0 s3 | 0.28 | 0.05 | 0.16 | 0.20 | 0.22 | 0.21 | 0.17 | 0.14 | 0.11 | +0.08 | 0.06 | 0.10 | 0.20 | 0.21 |
| L0-T s0 | 0.98 | 0.01 | 0.02 | 0.10 | 0.52 | 0.83 | 0.86 | 0.86 | 0.84 | +0.00 | 0.00 | 0.01 | 0.91 | 0.78 |
| L0-T s1 | 1.00 | 0.00 | +0.00 | 0.03 | 0.19 | 0.60 | 0.86 | 0.88 | 0.89 | +0.00 | +0.00 | 0.00 | 0.71 | 0.48 |
| Family | VP closing | VP open | coll. | off-road | incurs. | own term. | censored | no pass | world reset | open on patch | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Frozen L0 | Ref. | 0.797 | 0.819 | 0.016 | 0.002 | 0.000 | 0.004 | 0.168 | 0.000 | 0.254 | 0.011 |
| .35 | 0.518 | 0.557 | 0.026 | 0.031 | 0.002 | 0.007 | 0.393 | 0.000 | 0.489 | 0.004 | |
| .18 | 0.198 | 0.276 | 0.042 | 0.055 | 0.004 | 0.015 | 0.641 | 0.000 | 0.823 | 0.004 | |
| .08 | 0.025 | 0.178 | 0.092 | 0.056 | 0.021 | 0.019 | 0.697 | 0.000 | 0.951 | 0.009 | |
| L0-T | Ref. | 0.872 | 0.876 | 0.010 | 0.000 | 0.000 | 0.001 | 0.115 | 0.000 | 0.247 | 0.002 |
| .35 | 0.731 | 0.769 | 0.032 | 0.020 | 0.000 | 0.001 | 0.194 | 0.000 | 0.260 | 0.001 |
| Contrast | Seed | Ref. | ..50 | ..35 | ..25 | ..18 | ..12 | ..08 | ..05 | |
|---|---|---|---|---|---|---|---|---|---|---|
| L1 L0-T | s0 | 0.02 | +0.01 | +0.07 | +0.47 | +0.72 | +0.45 | +0.27 | +0.15 | 0.14 |
| s1 | +0.00 | +0.00 | +0.02 | +0.13 | +0.13 | 0.04 | 0.05 | 0.03 | 0.00 | |
| s2 | +0.00 | 0.00 | 0.00 | 0.00 | +0.01 | 0.16 | +0.02 | 0.07 | +0.00 | |
| s3 | 0.06 | +0.10 | +0.18 | +0.12 | +0.05 | +0.04 | +0.06 | +0.07 | +0.03 | |
| L0-T Frozen L0 | s0 | 0.01 | +0.32 | +0.60 | +0.37 | +0.07 | +0.01 | +0.00 | 0.03 | +0.00 |
| s1 | +0.00 | +0.02 | +0.14 | +0.29 | +0.25 | +0.07 | +0.05 | +0.03 | +0.09 |
| Checkpoint | 4.5%, =0..35 | 4.5%, =0..18 | +3.0%, =0..35 | +3.0%, =0..18 |
|---|---|---|---|---|
| Frozen L0 s0 | 0.12 | +0.00 | +0.11 | +0.01 |
| Frozen L0 s1 | 0.09 | 0.01 | +0.05 | +0.06 |
| Frozen L0 s2 | 0.02 | 0.16 | +0.00 | +0.10 |
| Frozen L0 s3 | +0.06 | +0.07 | 0.05 | 0.07 |
| L0-T s0 | 0.12 | 0.07 | +0.02 | +0.05 |
| L0-T s1 | 0.01 | 0.11 | +0.01 | +0.12 |
| Indicator (1–2 s earlier) | Family | .25 | .18 | .12 | .08 | .05 |
|---|---|---|---|---|---|---|
| braking need residual capacity | Frozen L0 | (2/14) | 29 [12, 51]; 12/56 | 29 [19, 42]; 25/84 | 21 [13, 34]; 24/102 | 18 [12, 27]; 33/150 |
| L0-T | (2/4) | (2/25) | 21 [10, 40]; 14/66 | 15 [10, 22]; 34/165 | 11 [8, 14]; 53/340 | |
| L1 | (0/3) | (1/11) | 11 [3, 25]; 5/50 | 13 [8, 18]; 26/149 | 11 [8, 15]; 36/212 | |
| TTC s | Frozen L0 | 26 [14, 44]; 21/174 | 25 [16, 36]; 33/193 | 36 [29, 45]; 99/310 | 30 [23, 38]; 89/303 | 21 [16, 27]; 69/294 |
| L0-T | 30 [21, 40]; 65/687 | 37 [28, 50]; 82/452 | 29 [23, 36]; 113/473 | 24 [20, 28]; 167/634 | 19 [16, 23]; 175/744 | |
| L1 | 39 [18, 70]; 27/367 | 15 [7, 26]; 22/444 | 17 [12, 23]; 68/510 | 22 [18, 27]; 175/700 | 19 [16, 23]; 184/740 |
| Checkpoint | Ref. | ..70 | ..50 | ..35 | ..25 | ..18 | ..12 | ..08 | ..05 | ,.18 | ,.18 | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| IDM-17 | 0.68 | +0.01 | +0.01 | 0.01 | 0.04 | 0.18 | 0.31 | 0.43 | 0.49 | 0.08 | +0.04 | +0.05 | 0.20 | 0.18 |
| PDM-Closed-17 | 1.00 | +0.00 | +0.00 | 0.06 | 0.16 | 0.19 | 0.32 | 0.46 | 0.48 | 0.04 | 0.01 | 0.01 | 0.36 | 0.14 |
| Frozen L0 s0 | 0.98 | 0.10 | 0.36 | 0.62 | 0.84 | 0.91 | 0.89 | 0.84 | 0.81 | +0.01 | 0.01 | 0.01 | 0.91 | 0.90 |
| Frozen L0 s1 | 0.99 | +0.00 | 0.03 | 0.06 | 0.46 | 0.86 | 0.90 | 0.96 | 0.92 | +0.00 | 0.01 | 0.08 | 0.88 | 0.80 |
| Frozen L0 s2 | 0.98 | 0.02 | +0.01 | 0.03 | 0.06 | 0.24 | 0.64 | 0.84 | 0.87 | 0.01 | +0.02 | +0.02 | 0.42 | 0.15 |
| Frozen L0 s3 | 0.26 | 0.03 | 0.13 | 0.18 | 0.20 | 0.18 | 0.14 | 0.12 | 0.08 | +0.11 | 0.05 | 0.10 | 0.16 | 0.20 |