PIMP MY IDEBack to dispatches
October 11, 2026 / interaction craft / playable prototypes

Make the force fun before the world is finished.

A tiny vehicle model can teach more than a polished scene. Put one useful force under a live control, draw what it does, and tune by feel.

Start with the behavior the player should feel. Keep the approximation visible. Add realism only when it fixes a measured problem.

The hack has a job

Pat Kerr rebuilt a 1996 vehicle experiment in JavaScript for its thirtieth anniversary. Kerr says the original GFA BASIC prototype later became the basis of the vehicle system in the first Grand Theft Auto. The current Motion Lab runs three behaviors on one rigid body: Car, Ship, and Brick.[1]

The car model is the useful part. Each tyre reads velocity at its position. The model splits that velocity into forward and sideways components. It applies light resistance along the wheel and stronger resistance across it. Steering rotates the front wheel directions. The handbrake changes the rear resistance.[1]

The shortcut is not "fake physics." It is a small force model chosen for a specific feel.

Name the lie

Kerr calls the tyre model approximate and technically incorrect. The resistance is proportional to velocity and has no force cap. Real tyre friction does not work that way. In the Hacker News discussion, Kerr compared the model to viscous drag and said the conscious hack was chosen to get playable behavior with little machinery.[2]

That disclosure makes the model useful. A prototype can be wrong about the world and right about the question. This one asks whether strong sideways resistance, steering at the front, and a rear-grip release produce a controllable top-down car.

Keep input, simulation, and drawing apart

The current recreation separates browser controls, fixed simulation steps, vehicle updates, and Canvas drawing. That structure lets input change the force model without tying motion to the display refresh rate.[1]

The browser still supplies useful machinery. Pointer Events give mouse, pen, and touch one event model. Pointer capture can keep a drag alive after the pointer leaves the original target.[3] requestAnimationFrame() schedules drawing before a repaint, but MDN warns that frame progress must use the callback timestamp or another clock. Otherwise high-refresh displays run faster.[4]

Test the feel in public

We opened Motion Lab version 0.8.2, switched between Car and Ship, and inspected the live settings. The car exposes acceleration and handbrake strength. The ship replaces those controls with a choice between a rotating head and side thrusters. That is good prototype hygiene. Each behavior gets the controls that explain it.

The test bay below is our own teaching model. It does not copy Motion Lab's solver and it is not a vehicle simulator. It turns three design choices into a visible path: steering response, sideways grip, and rear release. Use it to decide which behavior deserves a real implementation.

Interactive teaching fixture

Playable force test bay

Traditional purpose: tuning sliders, an animated preview, force readouts, and a test note. The rig combines them so each control changes the path and the named behavior in one place.

InputForceMotionFeel

Set the behavior

The animation starts parked. Change the controls, then run or step the teaching loop.

PARKED0.0 s teaching loop

Path and force readout

Balanced grip. The rear rotates without losing the whole path.

Teaching proxy / not a tyre simulation
Turn55
Hold72
Slide38
BALANCED ARCThe path bends and the tail moves, but the teaching car keeps a readable line.
Copyable build note

Keep the first rig small

This is a planning card, not test evidence. Replace every bracketed field with values from the real prototype.

PLAYABLE_PHYSICS_PROTOTYPE
DESIRED_FEEL=[one sentence]
CONTROL_INPUTS=[keyboard / pointer / touch]
FIXED_STEP_MS=[value]
PRIMARY_FORCE=[name and units]
KNOWN_APPROXIMATION=[what the model omits]
TUNING_CONTROLS=[maximum three]
VISIBLE_STATE=[motion plus numeric readout]
BOUNDARY_TESTS=[minimum / default / maximum]
HIGH_REFRESH_CHECK=[result]
REDUCED_MOTION_PATH=[result]
REAL_DEVICE_RUNS=[devices and results]
STATUS=PLAN ONLY / RUN EVIDENCE REQUIRED
Sources read / October 11, 2026 UTC

Source log

Open the evidence boundary
  1. Pat Kerr, "2D Vehicles", read October 11, 2026. This supplies the author's project history, rigid-body and tyre-model descriptions, control list, and architecture of the JavaScript recreation. Historical claims are attributed to Kerr.
  2. Hacker News discussion, item 49991852, verified through the official item route and read October 11, 2026. We used it as the current-interest signal and for Kerr's own clarification that the tyre forces behave more like viscous drag than physical friction.
  3. MDN, "Pointer events", read October 11, 2026. This supports the input-model and pointer-capture statements.
  4. MDN, "Window: requestAnimationFrame() method", read October 11, 2026. This supports the repaint scheduling, background pause, and timestamp guidance.

Evidence boundary: Pimp My IDE read the named project page, discussion, and browser API references. We opened Motion Lab version 0.8.2 and exercised its mode and settings controls. We did not inspect the original 1996 source, verify the Grand Theft Auto production lineage, audit the current solver, or measure physical accuracy. The test bay above is an original teaching proxy.