Work / The sim rig

It didn't stop
at a seat.

The sim I run isn't a racing game. It models tyre temperature, grip state, downforce and track conditions in real time, and it hands all of that back out as live telemetry. So the actual project is a hardware one: get that data onto your body, where you can react to it faster than you can read it. And because the cockpit has no extrusion to bolt to, every single mount doing that had to be designed and printed from scratch.

5
Haptic channels,
spatially coded
2
Wind pods,
fully custom
0
Off-the-shelf
brackets used
ASA
Default structural
filament
SYSTEM 00

What the sim
already knows.

In service

This is the part people miss. The sim is doing real physics — every tyre has a temperature and a grip state, the aero load changes with speed, the surface changes with the weather and with how many cars have been over it. And all of that is available as telemetry, live, every frame.

Which means the car already knows your left front is about to let go. The information exists. It just has nowhere to go, because a screen can only show you so much and you're busy looking at the corner.

So every system on this rig is a channel. Something the car knows, delivered somewhere on your body, fast enough to react to before you'd have read it. The hardware is: a Playseat Formula Instinct cockpit, a Moza R12 V2 direct drive base with the KS formula wheel and SRP2 load-cell pedals, on a 9950X3D and RTX 5080.

Although that's the second set. I started on an R5 with the CS wheel and SRP Lite pedals, and returned the lot almost immediately for something stronger — which tells you roughly everything about how this project has gone. It has never once stopped at the thing I actually bought.

Display is an Apple Vision Pro over CloudXR, and nothing else — no monitor at all. Which raises the stakes on everything below, because there's no dash light in the corner of your eye to fall back on. If you're going to know something, you're going to feel it.

Core
CockpitPlayseat Formula InstinctNo extrusion — the defining constraint
WheelbaseMoza R12 V2 direct driveUpgraded from an R5
WheelMoza KS formulaUpgraded from the CS
PedalsMoza SRP2, load cell brakeUpgraded from SRP Lite
DisplayApple Vision Pro via CloudXRExclusive — no monitor
Host9950X3D · RTX 5080
FabricationCreality K2 Plus

And none of it bolts on. The Formula Instinct has no 8020 extrusion — no rails, no slots, nowhere to hang anything. Most rigs you buy a bracket for. Here every transducer, every fan pod, every motor mount gets measured, modelled and printed before it can exist at all. That's the constraint the whole build runs on, and honestly it's the part I enjoy most: it stopped being an accessory build about ten minutes in and turned into a fabrication project.

SYSTEM 01

Five channels,
five places on the body.

Design complete · hardware ordered

One big transducer under the seat is the easy version, and it works right up until two things happen at once — which in a car is constantly. Everything sums into one undifferentiated rumble and you've learned nothing.

So each cue gets its own address on your body. A BST-1 under the seat pan does the whole-body low end: you feel the engine's RPM through the middle of the rig, and every gearshift lands as an actual clunk through the seat.

Then four TT25-8 pucks. One under the brake pedal, one under the throttle — so when your left front starts to go and you're a heartbeat from locking it, you feel that in the foot that's doing it. And two at the rear seat corners at shoulder-blade height, so when you clip a kerb on the way through a turn, it arrives in the shoulder on that side.

That's the whole reason for the layout. Pelvis, shoulders and soles stay separate, so a lockup under braking doesn't get buried under road surface. You register two things because they land in two different places — which is how bodies actually separate simultaneous sensations.

A Douk Audio M4 drives the four pucks, a Nobsound Mini drives the BST-1, and everything runs through a Cubilux 7.1 USB card so SimHub can address each channel on its own. Next up is deepening the ShakeIt library: per-car profiles, plus cues that specifically replace the dash events a monitor rig would just show you.

TT25-8 ×2 shoulder blade BST-1 pelvis · whole body LF TT25-8 ×2 brake · ABS + lockup throttle · wheelspin SPATIAL CHANNEL CODING
Each cue owns a location. Effects that would mask each other in a single transducer stay separable because they land on different parts of the body.
SYSTEM 02

Wind, and where
the jet stops working.

Pods locked · brackets in redesign

The idea is simple and stupid in the best way: at 200 mph it should be blowing a lot of air in your face, and when you brake for a turn it should drop off. Two Noctua NF-A14 iPPC-3000 fans, an Arduino Nano taking PWM straight off SimHub telemetry, and pods I designed — honeycomb flow straightener into a Bell–Mehta contraction nozzle, 125 mm bore down to a 90 mm outlet over 190 mm.

To be straight about what it is: a speed and onset cue, not a recreation of actual airflow at racing speed. Nothing on a desk is doing that. But what your face reads is change — how fast it builds, how fast it dies — and change is most of the value anyway.

The number that decided the design: a free jet is down to about 60% of centreline velocity by ten outlet diameters. On a 90 mm outlet that's roughly 900 mm. Past that, entrainment has eaten the gains and no amount of fussing with the nozzle gets them back.

So the effort moved off perfecting the contraction and onto mounting close and aiming precisely, which is where it should have been. Pod geometry is locked — exit centres, axis vectors, toe-in and pitch-up all fixed. What's open is the brackets tying the pods to the wheelbase, currently being rebuilt in Plasticity.

honeycomb Bell–Mehta contraction 125 90 190 mm 60% at 10D ≈ 900 mm out POD SECTION · MOUNT CLOSE, AIM PRECISELY
The decay curve, not the nozzle, set the strategy. Ten outlet diameters is only about 900 mm — so distance is the variable worth spending on.

The datum I had wrong. The first bracket concepts referenced the R12's fin-tip plane, because that is the obvious surface when you look at the base. It is also not the right one. The real mounting datum is the flat annular ring at Y = 23.44, r = 36.5–49.5 mm — a genuinely flat, continuous, machined face. Fin tips are neither coplanar enough nor continuous enough to locate a bracket that has a vibrating fan hanging off it. Finding that ring is what turned the design into a collar that clamps around the base, and it is the reason the brackets are being redrawn rather than adjusted.

SYSTEM 03

Two motors,
and an honest limit.

Parts ordered · not yet built

You put a harness on when you sit down. You brake hard for a turn, and where you'd normally just pitch forward against nothing, the belt pulls tight across your chest — so it actually feels like the car is stopping. Come back on the throttle and it lets go.

Two NEMA 23 steppers on 15:1 planetary gearboxes, DM556T drivers, a 350 W 48 V supply, and an Arduino Nano reading linear hall sensors for position. Firmware is the free SimHub Belt Tensioner plugin. Every motor mount is custom CAD, obviously.

Left and right run independently, which gives two axes. Both together is longitudinal — the braking and acceleration surge. One harder than the other is lateral.

And here's the honest bit, because it changes how you'd tune it: asymmetric belt tension is a directional cue, not a lateral G simulator. It tells you which way the car is loading up. It does not make you feel pushed sideways in the seat, and nothing pulling on a shoulder strap ever will. Treat it as information and it reads beautifully. Chase realism with it and you've just built something that's uncomfortable to sit in.

One measurement still owed before anything gets printed: harness strap width, 50 or 76 mm, which picks the clamp variant.

Drivetrain
MotorsNEMA 23 × 2Independent left / right
Reduction15:1 planetary
DriversDM556T
Supply350 W · 48 V
FeedbackLinear hall sensorsPosition, via Arduino Nano
FirmwareSimHub Belt Tensioner plugin
Blocked onStrap width, 50 vs 76 mmSelects the clamp variant
SYSTEM 04

What isn't
solved yet.

Planned

The rear pucks have nowhere flat to sit. They go on the hard moulded Playseat shell, which curves in two directions and isn't documented anywhere. So: scan the shell back, design contoured adapter plates against the scan. Guessing at a compound curve and printing it twice costs more than scanning it once, and I've already learned that one the expensive way.

The seating position still isn't formula. Proper single-seater posture puts your heels up near hip level, which means lifting the pedal deck three to five inches. Order matters here — recline and seat drop first, pedal deck second, wheel height last — because each one moves the reference for the next one. Do it out of order and you'll set the wheel to a position that no longer exists.

Those raising brackets get made in metal, not printed. This is the one hard line on the whole rig: a load cell measures force, so any flex or overhang anywhere in its mounting path turns into mushy pedal feel and calibration that quietly drifts as the plastic creeps. I'd print almost anything on this build. Not that. Knowing which parts not to print is most of the skill.

1 Recline + seat drop sets every later reference 2 Pedal deck raise 3–5 in · metal brackets 3 Wheel height last, once posture is fixed SEATING GEOMETRY · ORDER MATTERS
SYSTEM 05

The showpiece,
eventually.

On the horizon

The end state is a body shell. Scan the finished rig, drop the scan into Fusion 360 as a reference body at around 100–150k triangles, then crop an actual F1 car body around it — cut off at the pedals, keep the left-side profile, airscoop if it earns its place.

Which is just where this was always going. Printed parts on this build get sanded, primed and finished — nothing stays in raw layer lines. If every bracket on a thing was designed on purpose, it should look like it was on purpose, and a shell is that idea applied to the whole object at once.

Sooner: a Moza RS V2 round wheel for GT and casual driving, and a Tesla Model 3 OEM wheel adapter — mostly because bolting a real car's steering wheel onto a sim rig to play Forza is funny, and the adapter is an afternoon. Long term it's an R21 Ultra on an aluminium profile rig, which would finally hand me the extrusion this entire build has been working around.

Queued
Body shellScan → Fusion 360 crop~100–150k tri reference body
Round wheelMoza RS V2GT and casual
For funTesla Model 3 OEM wheel adapter
Long termR21 Ultra · aluminium profileThe extrusion this rig never had
06What the build taught

Things worth
knowing first.

ASA for anything structural

Creep resistance and a glass transition near 100 °C, which matters when a bracket lives next to a stepper that gets warm. CF-PLA is fine as a bolt-through consumable. PLA is for test fits and nothing else.

Stiffness fails before strength

Printed brackets under cyclic haptic load don't snap — they go compliant, and the effect you tuned quietly stops transmitting. Design for stiffness and fatigue resistance, not for the number on the filament spool.

Scan before you model

Any surface you didn't manufacture and can't measure flat — a moulded seat shell, a curved base — gets scanned first. Two failed prints cost more than one scan, every time.

Test fit, then commit

Cheap material for the fit check, real material once the geometry is proven. Almost every part on this rig exists in at least two versions, and the first one was always wrong somewhere.

Know what not to print

A load cell measures force, so any compliance in its mounting path becomes measurement error. Some parts have to be metal, and recognising which ones is the difference between a rig that holds calibration and one that drifts.

Find the real datum

The obvious surface is often not the one to reference. Look for the face that is actually flat, actually continuous, and actually machined — then build the bracket around that, not around what's easiest to see.

Building something
similar?

I do the research part for other people too — a real parts list, in the order to buy and build it, with the mistakes already removed.