Webcam head tracking for Forza Horizon — turn your head, the cockpit camera follows.
Horizon View watches your head with any ordinary webcam and pans the in-game camera as you look around, the way a VR headset would. It replaces the OpenTrack + AITrack + AutoHotKey stack with one calibrated app and a single hotkey. Built for ultrawide cockpit racing where small head movements should let you glance at an apex or a mirror without taking a hand off the wheel.
Created with ♥ by jmayala — questions / feedback: @madebyjmayala
v1 is Windows only (Windows 10/11, x64). The installer is unsigned, so Windows SmartScreen will warn the first time — that's expected (see Install).
HorizonView_x.y.z_x64-setup.exe from the
Releases page and run it.That's it. The app lives in your system tray; closing the window just minimises it there.
Everything runs on your machine. No telemetry, no network, no account.
| Step | What happens |
|---|---|
| Welcome | Quick intro. |
| Webcam access | Grant the camera permission. If you deny it, enable it under Windows Settings → Privacy & Security → Camera, then retry. |
| Pick camera | Choose your webcam and confirm you can see your face in the preview. |
| Calibrate | Full-screen. Five dots appear (center → far-left → mid-left → mid-right → far-right). Look at each dot by turning your head — not just your eyes — then press Space (or click "Capture this point"). Wait for the "Tracker ready" indicator and a live yaw readout before you start. |
| Tune | Set a starting sensitivity. You'll fine-tune the rest in-game. |
If calibration fails ("captured points aren't strictly ordered"), you moved inconsistently between dots — just redo it, turning your head deliberately and pausing before each capture.
You can re-run calibration any time from the dashboard (Recalibrate) or the tray menu.
All of these live in the dashboard (the app window) and in the in-game F1 overlay. They're the same controls in both places and stay in sync.
0.1× – 2.0×Overall strength of the effect — how far the camera pans for a full head turn. Start around 0.3×. Higher = a small head turn moves the camera more.
0 – 100%Trades responsiveness for stability. - Low (Responsive): the camera tracks your head almost instantly, but webcam noise can make it feel twitchy. - High (Smoothed): heavier filtering — calmer, very slightly laggier.
Internally this drives a One-Euro filter: it smooths hard when your head is still and loosens up automatically when you move, so high smoothing doesn't mean sluggish fast turns. ~80% is a good default.
Sensitive center ↔ Linear ↔ Sensitive edgesChanges how head angle maps to camera pan. - Linear (middle): 1:1 — even response everywhere. - Sensitive edges: small head movements near center barely move the camera; bigger turns ramp up sharply. Good if you want a steady forward view and only pan when you really mean to. - Sensitive center: tiny head movements register immediately; the extremes level off.
0 – 30%Snaps the camera to dead-center while your head is near neutral, so it doesn't jitter when you're looking straight ahead. Outside the deadzone, motion is smoothly re-mapped so there's no jump. If you see micro-jitter while sitting still, raise this to ~15%. This is the right fix for rest-jitter — it doesn't hurt responsiveness once you're actually turning.
0.2× – 3.0×Independent strength for each side. In a cockpit you sit on one side of the car, so one mirror is "closer" (less rotation) than the other. Crank the heavier side up so a comfortable head turn reaches the far mirror. Example for a left-hand-drive car: Left ≈ 1.55×, Right ≈ 1.0×.
Looking straight ahead but the camera isn't centered? Press Recenter while holding a neutral head pose — it makes your current pose the new "center" without re-running calibration. Useful when you've shifted in your seat during a long session. "Clear offset" undoes it.
For power users: Min cutoff and Beta expose the One-Euro filter directly
and override the Smoothing slider. Lower min cutoff = heavier smoothing at
rest; beta = how fast the filter loosens during motion.
A solid baseline (the defaults a fresh install ships with):
| Setting | Value |
|---|---|
| Sensitivity | 0.30× |
| Smoothing | 80% |
| Response curve | Linear |
| Center deadzone | 15% |
| Left pan | 1.55× |
| Right pan | 1.00× |
Then adjust to taste with the F1 overlay while driving. Use "Reset advanced to recommended" in the dashboard to get back here.
pnpm install then pnpm tauri dev.pnpm tauri build → src-tauri/target/release/bundle/nsis/.scripts/setup-mediapipe.mjs, so the app works fully offline.See FUTURE.md for what's intentionally out of scope for v1.
Created with ♥ by jmayala. Questions, ideas, or bug reports → @madebyjmayala.
MIT.
$ claude mcp add Horizon-View \
-- python -m otcore.mcp_server <graph>