Coriolis Effect in Ballistic Game Physics

Simulating authentic long-distance ballistics in video games requires accounting for the rotation of the game world under a projectile in flight. To reproduce the Coriolis effect, developers rely on coordinate frame transforms—primarily mapping local tangent systems to Earth-centered rotating references—combined with cross-product vector operations and numerical integration schemes. This article breaks down the core mathematical transforms and physics equations used to calculate Coriolis deflection accurately in modern game engines.

Coordinate Systems and the Rotating Reference Frame

Standard game engines (such as Unreal Engine or Unity) operate within an inertial, flat Cartesian coordinate system (often using \(X, Y, Z\) coordinates). However, the Coriolis force is a fictitious (or inertial) force that appears only when observing motion from within a rotating, non-inertial reference frame.

To model this, ballistics systems map coordinates between two primary frames:

  1. Earth-Centered Inertial (ECI): A non-rotating coordinate space used to track absolute trajectories under pure Newton mechanics.
  2. Earth-Centered, Earth-Fixed (ECEF): A non-inertial reference frame tied to the planetary surface, rotating at an angular velocity \(\vec{\omega}\).

The transform from the non-rotating inertial frame to the rotating local frame over time \(t\) uses a time-dependent rotation matrix \(R_z(\omega t)\) around the planetary rotational axis (conventionally the Z-axis):

\[R_z(\omega t) = \begin{bmatrix} \cos(\omega t) & -\sin(\omega t) & 0 \\ \sin(\omega t) & \cos(\omega t) & 0 \\ 0 & 0 & 1 \end{bmatrix}\]

In engine architecture, this is frequently implemented using quaternions to prevent gimbal lock and reduce computational overhead:

\[q(t) = \left[ \cos\left(\frac{\omega t}{2}\right), \mathbf{u} \sin\left(\frac{\omega t}{2}\right) \right]\]

where \(\mathbf{u}\) represents the unit vector along the planet's axis of rotation.

Local Tangent Plane Transforms: NED and ENU

Projectiles are typically fired from a specific latitude (\(\phi\)) and longitude (\(\lambda\)) on the planet's surface. Game engines handle local physics inside a tangent plane: either NED (North-East-Down) or ENU (East-North-Up).

To compute the Coriolis force using local vectors, the planet's global angular velocity vector \(\vec{\omega}\) must be transformed into the shooter's local frame. Given planetary angular speed \(\omega \approx 7.2921 \times 10^{-5} \text{ rad/s}\) for Earth, the transform into the local ENU frame at latitude \(\phi\) is:

\[\vec{\omega}_{\text{ENU}} = \begin{bmatrix} 0 \\ \omega \cos(\phi) \\ \omega \sin(\phi) \end{bmatrix}\]

  • The East component is \(0\).
  • The North component is \(\omega \cos(\phi)\).
  • The Up component is \(\omega \sin(\phi)\).

The Coriolis Acceleration Vector

Once both the velocity of the bullet \(\vec{v} = [v_E, v_N, v_U]^T\) and the planetary angular velocity \(\vec{\omega}\) are aligned in the same coordinate frame, the Coriolis acceleration \(\vec{a}_{\text{cor}}\) is determined using the vector cross product:

\[\vec{a}_{\text{cor}} = -2(\vec{\omega} \times \vec{v})\]

Expanding the cross product in the local ENU frame produces the individual directional accelerations:

\[a_{\text{East}} = 2\omega (v_N \sin\phi - v_U \cos\phi)\] \[a_{\text{North}} = -2\omega v_E \sin\phi\] \[a_{\text{Up}} = 2\omega v_E \cos\phi\]

The vertical component (\(a_{\text{Up}}\)) is known as the Eötvös effect, which slightly increases bullet drop when firing west and decreases it when firing east. The horizontal components account for the classic Coriolis drift—deflecting the bullet to the right in the Northern Hemisphere (\(\phi > 0\)) and to the left in the Southern Hemisphere (\(\phi < 0\)).

Numerical Integration in Game Loops

Because real-time ballistics also involve non-linear drag forces and gravity gradients, the total acceleration cannot be solved purely analytically over long engagement ranges. Game engines aggregate forces:

\[\vec{a}_{\text{total}} = \vec{g} + \vec{a}_{\text{drag}} + \vec{a}_{\text{cor}}\]

This equation of motion is stepped forward dynamically using numerical integrators rather than standard Euler steps to preserve accuracy over long ranges:

  • Velocity Verlet: Common in game physics engines due to its computational efficiency and symplectic properties, keeping energy errors bounded over time.
  • 4th-Order Runge-Kutta (RK4): Preferred in dedicated long-range sniper simulations, calculating four intermediate directional velocity and acceleration samples per tick to resolve subtle trajectory curvature.

By transforming local projectile velocities into angular coordinates and applying the cross-product acceleration per tick, developers accurately replicate true Coriolis drift over multi-kilometer engagements.