A VR headset measures true head orientation θ(t), renders a frame from it, and displays that frame some milliseconds later. That delay — the motion-to-photon (MTP) latency L — means the eye sees the world lagging behind the vestibular system's sense of motion:
rendered(t) = true(t − L)
mismatch(t) = true(t) − rendered(t)
This model uses a real ring buffer of past head-yaw samples and reads it back exactly L milliseconds late, so the mismatch you see and the number in the readout are the actual delayed-vs-true difference, not a cosmetic estimate.
Sensory-conflict theory (Reason & Brand, 1975) holds that motion sickness arises when the visual and vestibular systems report contradictory motion. This simulator turns that into a simplified, pedagogical discomfort score S ∈ [0,100]:
dS/dt = k1 · mismatch² · |ω| − k2 · S
ω = dθ_true/dt (head angular velocity)
Discomfort accumulates fastest when the head is turning quickly (large ω) and the display is behind (large mismatch) — both factors, not either alone. It decays slowly toward zero when the head is still. This is a teaching heuristic, not a clinical SSQ score, but the qualitative behaviour matches published VR guidance closely: engines below roughly 20 ms MTP latency are generally imperceptible, 20–50 ms is commonly tolerated but degrades comfort under fast motion, and consumer headset guidelines (e.g. Oculus/Meta developer docs) target well under 20 ms specifically to avoid this sensory-conflict sickness.
- Latency slider — the actual delay fed into the ring-buffer lookup.
- Head-turn intensity — peak angular velocity of the simulated head sweep.
- Field of view — wider FOV increases the peripheral visual field affected by the lag, scaling the discomfort rate.
- Pause / Reset — freeze the head sweep to let the score decay, or zero it out.