Skip to content

Cars in 3D ​

2026-10-23, seventh session.

All nine cars, drawn by the viewer's command line

The nine cars from their .BV4 files, drawn by pod-viewer render NAME --yaw 0.9 --pitch 0.4. Only Arc and AV1 have wheels: the others' wheel positions are not decoded yet. © Ubi Soft; shown from our own viewer.

From bytes to a car ​

The car loader, FUN_0046fb14, reads a block of car parameters, the texture pages, and then 26 objects through one routine, FUN_0046b78c. An object is a list of vertices in 16.16 fixed point, a list of faces, and a normal for each vertex. A face names its material and its render type (TEXGOU for textured and smoothly shaded), lists three or four vertex indices, and gives a texture page and coordinates for each corner.

The first walk through a car broke on its tenth face: a quad. The face reader branches on the number of corners, and on the quad path it reads 12 more bytes. With that, all 18 car files walk to the end of their objects with every index in range.

The drawings answered what the objects are. Eighteen of them are the body, three sets of six pieces, so the car can swap panels, perhaps for damage. Four are wheels, each built around its own centre, and four make a flat outline of the car at ground level.

Arc, textured and on its wheels, in the viewer window

VOITURES/ARC.BV4 in the 3D view. © Ubi Soft; shown from our own viewer.

Where the wheels go ​

The wheels need placing. The car parameters hold four records 0xD8 bytes apart, and the loader walks them with that stride. In Arc they read as clean positions: plus and minus 1.59 along the car, about 1.2 to 1.3 across, a radius of 0.49. In seven of the nine cars the same bytes do not read as numbers at all, in fixed point or in floating point. The parameter block looks scrambled in those cars, so the game must unscramble it while loading. That is the next thing to trace, and it will also give the cars' handling values.

Scorpion without its wheels

VOITURES/SCORP.BV4: the body draws, the wheels wait for the parameters. © Ubi Soft; shown from our own viewer.

A smaller find on the way: the 8-bit .BV3 texture block has room for a palette, filled with zeros. Its pixels start after that gap, three rows later than the first viewer drew them.

A viewer an agent can drive ​

Taking screenshots through a browser was slow, so the viewer now has a command line:

  • pod-viewer list prints every file with its kind and size;
  • pod-viewer info NAME says what a file holds;
  • pod-viewer export NAME OUT_DIR writes its pictures, sounds or text to files;
  • pod-viewer render NAME OUT.png draws a car in 3D with a small software renderer, the same picture as the window, with options for the body set and the angle.

In the browser, links choose the view the same way, for example ?data=http://127.0.0.1:5182&file=ARC.BV4&set=1. The picture at the top of this entry came from nine render commands.

The cars page has the format.

Next ​

The scrambled car parameters, then the track geometry, on the way to the track viewer.

Prose CC0 1.0, code Apache 2.0. POD: Planet of Death is © Ubi Soft; none of its files are on this site.