A VR headset renders two views of the same scene from cameras separated by the interpupillary distance (IPD), ~63 mm on average. The correct method is off-axis (asymmetric-frustum) projection: both cameras keep the same orientation as the head, and only the projection matrix is skewed sideways so the two view frustums converge exactly at the convergence distance. The horizontal shift of each near-plane frustum is:
shift = (IPD / 2) · near / convergence
This is a direct extension of the article's perspective-projection rule x/z = y/z — here the eye's lateral offset x is folded into where the frustum's left/right edges land on the near plane, instead of into the camera's rotation.
The common mistake is toe-in: keep each eye's frustum symmetric, but rotate ("verge") both cameras inward to aim at the convergence point, like real eyeballs. Toe-in works only exactly on the vertical centreline of the image. Everywhere else it tilts each eye's image plane relative to the other, producing vertical parallax — the two views disagree in the y-direction, which the brain cannot fuse and reads as eye-strain. Off-axis projection never rotates the cameras, so vertical parallax is always zero.
- IPD slider — eye separation; wider IPD exaggerates depth (and any toe-in artifact).
- Convergence slider — the depth plane with zero disparity ("the screen"); objects nearer show negative parallax, farther show positive parallax.
- FOV slider — vertical field of view of the shared frustum before the eye-offset skew is applied.
- Far/near-marker disparity — actual measured horizontal pixel offset of the red wall marker (far) and blue table marker (near) between the two rendered eye views, computed by projecting each marker through both eyes' real projection + view matrices.
- Drag to orbit, scroll to dolly — moves the shared head rig; both eye cameras follow it rigidly, exactly like head tracking.