Drag follows the air, not the ground.
The drag magnitude grows with the square of air-relative speed. Its direction opposes velocity relative to the wind, so a tailwind may push a slower object forward.
u = (vₓ − wind, vᵧ)
k = ρ Cd A ÷ (2m)
aₓ = −k |u| uₓ
aᵧ = −g − k |u| uᵧ
Try “A windy drop”: a stationary object can move left without an initial horizontal throw. Change −8 m/s to +8 m/s and the horizontal motion reverses.
A solver with visible limits.
Air mode uses deterministic fourth-order Runge–Kutta integration. Each step is at most 0.02 s (standard) or 0.005 s (fine), and gets smaller when drag changes velocity rapidly. Ground crossing and the peak are refined with 28 bisection iterations.
There is a hard limit of 120 simulated seconds and 20,000 steps. Very stiff or unfinished flights are rejected and exports are disabled. A finer step helps check numerical convergence; it cannot fix inaccurate physical assumptions.
Make a controlled A/B comparison.
Choose “Compact ball”, pin this flight as A, then choose “Same launch, lighter ball” for B. The purple A path and its parameters remain fixed while green B changes. Only mass changes in this example, from 0.145 kg to 0.020 kg. A larger force-to-mass ratio changes the trajectory more.
A/B exports include both parameter sets, each flight’s own time samples and B−A differences in JSON. This is separate from the blue vacuum reference, which always follows the current launch. Neither a percent change nor a causal conclusion is inferred when several settings differ.
Supported inputs: speed 0–100 m/s, height 0–100 m, gravity 0.1–30 m/s²; mass 0.001–1,000 kg; coefficient 0–2; frontal area 0–10 m²; density 0–2 kg/m³; wind −50 to +50 m/s. Not every combination finishes within the solver budget.