# Traffic orientation and wheel-anchor audit (r291)

## Result

I found no source-backed transform or sign defect in the traffic models rendered
in the current packaged L4RA view. No viewer motion, axis, or tire-placement
code was changed. This is a targeted check of six live cars on the captured
routes; it does not establish citywide orientation or retail traffic fidelity.

## Evidence checked

- `tools/export_nfsu2_traffic_cars.py` records each BODY_A/B/C transform after
  baking the retail `+X` forward, `+Z` up, `+Y` lateral frame into GLB `(Y,Z,-X)`
  coordinates. It retains a separate signed `local_axes` mapping and baked
  bounds per body variant. `traffic-ambient-models.json` has these values for
  all 15 type-2 definitions.
- The active viewer chooses the selected variant's axes in
  `loadTrafficBodyVariant`; `trafficVehicleMatrix` maps its signed semantic
  forward/up/side axes to the route frame. PARCELVAN A versus B/C have opposite
  forward and up signs, but their separately exported per-variant axis records
  are used, so the known variant difference is accounted for. BODY_A is selected
  in the captured default view.
- The exporter records the four `GLOBALB.BUN` wheel anchors after applying the
  same BODY variant transform. `makePlacedTrafficTireBatches` uses the
  corresponding `wheel_positions_baked` when present, and transforms the
  selected authored tire object into the body frame before placing it. Tire
  detail-slot selection and steering remain unknown; the captured run uses tire
  variant B. This supports wheel location in the preview, but is not evidence
  of exact retail tire attachment.
- The packaged Chrome debug state had six cars on routes 450, 744, 741, 739,
  740, and 738. Every car reported `frameUpZ` from `0.99988` to `1.00000`,
  `roadSurfaceSupported: true`, and `journeyDirection: 1`. Their body bases
  were within 0.052 world units of the sampled road surface. The capture is
  [`427-r291-traffic-orientation-audit.png`](../webgl-city/review/images/427-r291-traffic-orientation-audit.png).
- `routeDirectionDot` in the debug state is negative (roughly `-0.97` to
  `-1.00`) because it records agreement with original waypoint file order
  before `loadTrafficRoutes` reverses point arrays when their vectors oppose
  increasing order. It is not the rendered travel direction. These six cars
  had `journeyDirection: 1` after that canonicalization.

The capture shows the rear of the player car and a few distant traffic cars.
Their scale and distance make visual direction hard to judge, so it cannot
close the user's report of cars appearing backward or inverted elsewhere. The
remaining useful reproduction is a close, route-specific live capture of an
actually inverted/backward traffic instance, including its model name, body
variant, route key, direction, frame axes, and tire centers. Until such a case
is observed, changing the global axis or wheel-placement rules would risk
breaking the already checked body frames.


## Close model follow-up (r292)

I captured side views of all twelve density-eligible BODY_A models using the
packaged viewer's debug trafficModel override at Route 450, distance 525.
They all rendered with journeyDirection 1, road support true, and
frameUpZ from 0.99999997 to 1.00000004. Their visible noses face the same
Route 450 direction. This checks twelve meshes against one route frame; it
does not verify other road directions or runtime route transitions.

I also captured the known exceptional PARCELVAN BODY_B and BODY_C variants
individually. Both remain upright and point along the route when their recorded
per-variant axes are used. BODY_B/C for the other eleven active models remain
unchecked. The BODY_C tires look square/very low detail in the close frame;
this is an appearance concern, not evidence of an inverted transform.

The per-model gallery and exact telemetry are in
[traffic-orientation-r292.html](../webgl-city/review/traffic-orientation-r292.html).
The tire surfaces in these captures are nearly black. No viewer transform or
wheel-placement code was changed because this pass did not reproduce an
inverted or reversed car.
