This is a genuine 2D rigid-body force-and-torque model of a quadcopter seen from the side, not an animation loop. Four motors are lumped into a single thrust vector T that always points along the drone's own "up" axis; the differential-tilt slider commands a torque τ about the pitch axis by asymmetrically biasing left/right motor thrust, which rotates the body angle θ and — because thrust tilts with the body — produces the horizontal force real quadcopters use to fly forward:
τ = diff · τ_max − c_damp·ω (motor differential minus rotational drag)
I·ω' = τ ⇒ θ' = ω (pitch dynamics, I = 0.018 kg·m²)
Fx = −T·sin(θ) − Cd·vx·|vx| + F_wind(t)
Fy = T·cos(θ) − Cd·vy·|vy| − m·g
ax = Fx/m, ay = Fy/m (m = 1.5 kg, g = 9.81 m/s²)
Throttle sets T as a fraction of the four motors' combined maximum (24 N); hover requires roughly 61% throttle to balance the 14.7 N weight exactly, which is why the "Hover trim" button snaps there with zero tilt. Wind is a turbulent horizontal force built from two summed sine waves scaled by the wind slider, so gusts vary in strength rather than blowing at a constant rate. Battery drains faster the harder the motors work (idle drain plus a term proportional to throttle²); at zero battery the motors cut and the drone free-falls, exactly as a real drone would.
- Ghost trail — the drone's recent flight path, fading with age.
- Wind streaks — background particles drifting at the current wind speed, so gusts are visible even before they move the drone.
- Ground contact — altitude clamps at 0 m and vertical velocity zeroes on touchdown, same as the collision handling in the 3D version.