Physics · Fluid Dynamics·⏱ ~13 min read·Last updated: 22 June 2026
Ballistics and Aerodynamic Drag — From Cannonballs to Supersonic
Projectiles
Galileo's ideal parabola is only the start. Real projectiles
experience drag that varies non-linearly with speed, a turbulent
regime change near Mach 1, Magnus force (the sideways curve caused
by a spinning projectile), Coriolis deflection (an apparent curve
caused by Earth's rotation) over long distances, and air density
that halves every ~5.5 km. Understanding the full point-mass
ballistic model — with a Mach-dependent drag coefficient, ISA
(International Standard Atmosphere) model, and fourth-order
Runge-Kutta integration (a numerical method for stepping the
equations of motion forward in small, accurate increments) —
explains why snipers correct for wind, temperature, and latitude,
and why ballistic missiles follow shallow launches to maximise
range.
Drag force (in direction opposing velocity): F_D = ½ · ρ · v² · C_D ·
A ρ = air density (kg/m³), v = speed (m/s), C_D = drag coefficient
(dimensionless), A = reference frontal area (m²) — typically πd²/4
Deceleration due to drag: a_drag = F_D / m = (ρ · v² · C_D · A) / (2m)
Reynolds number determines flow regime: Re = ρvd/μ where μ = dynamic
viscosity ≈ 1.81×10⁻⁵ Pa·s Sphere C_D: Re < 1000: C_D ≈ 24/Re +
6/(1+√Re) + 0.4 (Schiller-Naumann) Re = 1000–2×10⁵: C_D ≈ 0.44
(inertia dominated) Re > 2×10⁵: C_D ≈ 0.10 (turbulent BL, drag crisis
— e.g. golf ball dimples)
2. Mach-Dependent C_D and Transonic Drag Rise
Mach number: M = v / a_sound where a = √(γRT) ≈ 340 m/s at 15°C C_D
regime (streamlined projectile): M < 0.8 (subsonic): C_D ≈ 0.15–0.25 M
0.8–1.2 (transonic): C_D peaks at 0.4–0.6 (wave drag) M > 1.2
(supersonic): C_D ≈ 0.35–0.55 and declines with M Drag coefficient vs
Mach — empirical piecewise (G7 bullet model): M < 0.8: C_D = 0.18 M
0.8–1.0: C_D = 0.18 + 1.2(M−0.8)² (rapid rise near M=1) M 1.0–1.2: C_D
= 0.42 − 0.5(M−1.0) M > 1.2: C_D = 0.32 − 0.03(M−1.2) Wave drag
source: shock wave forms at body nose and base Wave drag coefficient ≈
4/(γM²) · sin²θ_shock (cone-angle θ) → Sharper nose → weaker shock →
less wave drag → boat-tail designs
3. Ballistic Coefficient and Sectional Density
Ballistic Coefficient (BC): BC = m / (C_D · A) [kg/m²] Higher BC →
less drag deceleration for same initial speed Heavier, narrower, more
aerodynamic projectile → higher BC Sectional density (SD): SD = m / d²
(where d = calibre in inches, m in grains) SD relates mass to
cross-section; flat-nosed bullets have lower BC than spitzer (pointed)
designs of the same SD G1 vs G7 reference models: G1: flat-base
blunt-nose reference projectile (historical artillery) G7: long-range
boat-tail pointed (modern high-BC rifle bullets) BC_G7 ≈ 0.3–0.65 for
typical long-range bullets BC_G1 ≈ 0.45–0.90 for same bullets
(different reference curve) Time of flight / velocity retention: v(t)
≈ v₀ · exp(−(ρ·A·C_D)/(2m) · v₀t) (constant-CD approximation)
4. ISA Standard Atmosphere
ISA troposphere (0–11 km): T = 288.15 − 6.5·h/1000 [K], h in m
Pressure: P(h) = 101325 · (T/288.15)^5.2561 [Pa] Density: ρ(h) = P(h)
/ (287.05 · T) [kg/m³] ρ(0) = 1.225 kg/m³ (sea level) ρ(5500m) ≈ 0.736
kg/m³ (≈ 60% of sea level) Speed of sound: a = √(γRT), γ=1.4, R=287
J/(kg·K) a(0°C) = 331.3 m/s, a(15°C) = 340.3 m/s, a(−50°C) = 299 m/s
High-altitude effect on range: lower ρ → less drag At 1500 m elevation
(5000 ft): ρ ≈ 1.05 kg/m³ (−14%) → bullet retains velocity longer →
~3% longer range Shooters at high altitude must correct
points-of-impact upward
5. Point-Mass Trajectory Equations
State vector: [x, y, z, vx, vy, vz] Acceleration components: a_x =
−(F_D/m)·vx/v + F_M_x/m + F_Cor_x/m a_y = −(F_D/m)·vy/v + F_M_y/m +
F_Cor_y/m − g a_z = −(F_D/m)·vz/v + F_M_z/m + F_Cor_z/m F_D =
½ρv²C_D(M)A (direction: opposite v) g = 9.80665 m/s² (varies ±0.05%
with latitude) RK4 integration: k₁ = f(t, s) k₂ = f(t+h/2, s+h/2·k₁)
k₃ = f(t+h/2, s+h/2·k₂) k₄ = f(t+h, s+h·k₃) s(t+h) = s(t) +
h·(k₁+2k₂+2k₃+k₄)/6 Time step: dt = 0.001–0.01 s (0.001 s for
supersonic projectiles)
6. Spin Drift, Magnus, and Coriolis
Magnus effect (spinning projectile): F_M = C_M · (ρ/2) · v · A · (ω ×
v̂) Right-hand twist rifle: spin axis ≈ velocity axis → gyroscopic
precession causes slow yaw → right spin drift at range Spin drift
approximation: SD(range) ≈ 1.25 · (1 + 4/stability) · twist_inches⁻¹ ·
range² [inches/100yd²] Coriolis deflection (per axis): F_Cor = −2m(Ω ×
v) Ω = 7.292×10⁻⁵ rad/s (Earth rotation) Effect at 1000 m
(horizontal): ≈ 4–8 cm rightward in NH at mid-latitudes Vertical
Eötvös: +v_E·2Ω·sin(lat) — affects elevation at any range Aerodynamic
jump: initial bullet yaw from wind gust → lateral deviation At 1000 m,
10 mph crosswind → 1–2 MOA (≈28–55 cm) lateral
7. JavaScript Ballistic Trajectory Simulator
// Point-mass ballistic trajectory with ISA atmosphere + Mach-CD modelfunctionisaAtmosphere(h) {
const T = Math.max(216.65, 288.15-0.0065*h);
const P = 101325* Math.pow(T/288.15, 5.2561);
const rho = P / (287.05* T);
const a = Math.sqrt(1.4*287.05* T);
return {rho, a}; // density kg/m³, speed of sound m/s
}
functiondragCoeff(Mach) {
if (Mach <0.8) return0.18;
if (Mach <1.0) return0.18+1.2*(Mach-0.8)**2;
if (Mach <1.2) return0.42-0.5*(Mach-1.0);
return Math.max(0.15, 0.32-0.03*(Mach-1.2));
}
functionballisticTrajectory({
v0, angleDeg, mass, diameter, dt = 0.002
}) {
const angleRad = angleDeg * Math.PI /180;
const A = Math.PI * (diameter/2)**2;
const g = 9.80665;
let x=0, y=0;
let vx = v0*Math.cos(angleRad), vy = v0*Math.sin(angleRad);
const path = [{x, y}];
while (y >=0) {
const v = Math.hypot(vx, vy);
const {rho, a} = isaAtmosphere(y);
const Mach = v / a;
const Cd = dragCoeff(Mach);
const Fd = 0.5* rho * v*v * Cd * A;
// RK4 sub-step (simplified Euler here for brevity)const ax = -(Fd/mass) * (vx/v);
const ay = -(Fd/mass) * (vy/v) - g;
vx += ax * dt;
vy += ay * dt;
x += vx * dt;
y += vy * dt;
if (path.length %50===0) path.push({x, y});
}
return path;
}
// Example: 7.62×51 NATO at 800 m/s, 30° elevationconst traj = ballisticTrajectory({
v0: 800, angleDeg: 30, mass: 0.0104, diameter: 0.00762
});
console.log(`Range: ${traj[traj.length-1].x.toFixed(0)} m`);
// Vacuum 30° → 32.7 km; with drag → much less
8. Range Optimisation and Real Corrections
Optimal launch angle in vacuum: θ_opt = 45° (max range = v₀²/g) With
drag: θ_opt drops below 45° Low-drag projectile (M=3): θ_opt ≈ 40°
High drag (musket ball): θ_opt ≈ 30–35° Reason: at high angles extra
flight time → more drag work done Artillery corrections summary:
Muzzle velocity: −5 m/s → −3% range correction Temperature −10°C: air
denser → −1% range Wind 5 m/s cross: lateral deflection ≈ 0.1 mrad ×
range Altitude +1000m: +0.5% range (lower density) Coriolis at 45°N:
rightward drift ~4 cm at 1000 m (NH shooter) Precision rifle: Modern
exterior ballistics software (Applied Ballistics, Hornady 4DOF)
numerically integrates full 6DOF equations including gyroscopic
stability, yaw of repose, Coriolis/Eötvös in all axes to predict
sub-cm point of impact at 1–4 km ranges.