Mechanic · movement · first-person shooter, space flight simulation
Six degrees of freedom
A craft moves along three axes and turns about three, so it can travel in any direction while facing any way, with no fixed floor or horizon.
On this page
Six degrees of freedom are three of travel (forward, up, sideways) and three of turn (pitch, heading, bank). Descent 3 gives pitch, heading, and bank their own thrust and, for an object that uses thrust and has rotational drag, their own drag, as it does the three moves1,2.
Games
| Game | Year | How | Note |
|---|---|---|---|
| Descent 3 | 1999 | Damped | pitch, heading, and bank take thrust like movement does and fade under their own drag when let go |
Every claim about this mechanic, by game (1)
References
- ^ abDescent 3's released source turns the player ship on three axes the same way it moves it on three: pitch, heading, and bank each take the control's value times
full_rotthrusttimes the player'sturn_scalar, and an object flaggedPF_USES_THRUSTwith a rotational drag above 0 has its turning speed solved against that drag with the same closed form, ω = (ω₀ − R/d)·e^(−(d/m)·t) + R/d. Computed from it, a held turn levels off at R/d and a released one fades out at rate d/m. The input code clamps pitch to 0.75 and heading and bank to 1, except in a Macintosh build, which skips those three clamps; before the drag step,PhysicsDoSimRotcan add auto-leveling thrust to pitch and bank, which this claim doesn't cover.CodeDescentDevelopers/Descent3How we know
2566 objp->mtype.phys_info.rotthrust.x = controls.pitch_thrust * objp->mtype.phys_info.full_rotthrust * playp->turn_scalar; 2567 objp->mtype.phys_info.rotthrust.z = controls.bank_thrust * objp->mtype.phys_info.full_rotthrust * playp->turn_scalar; 2568 objp->mtype.phys_info.rotthrust.y = controls.heading_thrust * objp->mtype.phys_info.full_rotthrust * playp->turn_scalar;
Descent3/object.cpp lines 2566–2568 at 61bb9a3 · upstream ↗ 430#define LIMIT_PITCH 0.75f 431#define LIMIT_HEADING 1.0f 432#define LIMIT_BANK 1.0f
Descent3/Controls.cpp lines 430–432 at 61bb9a3 · upstream ↗ 887#ifndef MACINTOSH 888// clip controller values 889 if (controls->pitch_thrust > LIMIT_PITCH) controls->pitch_thrust = LIMIT_PITCH; ⋮ 894 if (controls->bank_thrust < -LIMIT_BANK) controls->bank_thrust = -LIMIT_BANK; 895#endif
Descent3/Controls.cpp lines 887–895 at 61bb9a3 · upstream ↗ 714 if (pi->rotdrag > 0.0f) ⋮ 716 if(!(pi->flags & PF_USES_THRUST)) ⋮ 718 *rotthrust = Zero_vector; ⋮ 721 PhysicsApplyConstRotForce(*obj, *rotthrust, *rotvel, frame_time);
physics/physics.cpp lines 714–721 at 61bb9a3 · upstream ↗ 245 // Standard angular motion with a linear air drag (drag is proportional to angular velocity) 246 const double oneOverDrag = 1.0 / drag; 247 const double rotForceOverDrag[3] = { double(rotforce.x) * oneOverDrag, double(rotforce.y) * oneOverDrag, double(rotforce.z) * oneOverDrag }; 248 const double dragOverMass = drag / mass; 249 const double expDoMDt = exp( -dragOverMass * double(deltaTime) ); ⋮ 252 newRotVel[0] = ( double(rotvel.x) - rotForceOverDrag[0] ) * expDoMDt + rotForceOverDrag[0];
physics/physics.cpp lines 245–252 at 61bb9a3 · upstream ↗ 684 rotthrust->z -= scale * BANK_AUTOLEVEL_SPEED_SCALAR * obj->mtype.phys_info.full_rotthrust;physics/physics.cpp line 684 at 61bb9a3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^ abIn Descent 3's released source, which includes the unreleased "1.5" patch, the player ship's thrust is the sum of a forward, an up, and a sideways push along the ship's own axes, each the control's value times
full_thrust, the whole scaled by the player'smovement_scalarand by 1.3 outdoors; the physics then moves a thrusting object against a drag proportional to velocity, solved in closed form over the frame: v = (v₀ − F/d)·e^(−(d/m)·t) + F/d. Computed from that formula, drag acts while the ship thrusts too, and speed levels off at F/d, as in Doom, whose floor friction multiplies momentum by 0.90625 each tic thrust or not; Quake's ground acceleration instead stops at the wish speed.CodeDescentDevelopers/Descent3 · id-Software/DOOM · id-Software/QuakeHow we know
2580 if (OBJECT_OUTSIDE (objp)) 2581 speed_scalar*=1.3f; ⋮ 2583 objp->mtype.phys_info.thrust = speed_scalar*Players[objp->id].movement_scalar * ((objp->orient.fvec * controls.forward_thrust * objp->mtype.phys_info.full_thrust) + 2584 (objp->orient.uvec * controls.vertical_thrust * objp->mtype.phys_info.full_thrust) + 2585 (objp->orient.rvec * controls.sideways_thrust * objp->mtype.phys_info.full_thrust));
Descent3/object.cpp lines 2580–2585 at 61bb9a3 · upstream ↗ 994 if (obj->mtype.phys_info.drag != 0.0) ⋮ 996 if (obj->mtype.phys_info.flags & PF_USES_THRUST) ⋮ 998 total_force += obj->mtype.phys_info.thrust;
physics/physics.cpp lines 994–998 at 61bb9a3 · upstream ↗ 279 // Standard motion with a linear air drag (drag is proportional to velocity) ⋮ 281 const double oneOverDrag = 1.0 / drag; 282 const double massOverDrag = mass / drag; 283 const double forceOverDrag[3] = { force.x * oneOverDrag, force.y * oneOverDrag, force.z * oneOverDrag }; ⋮ 285 const double expDoMDt = exp( (-1.0 / massOverDrag) * dt ); ⋮ 291 newVel.x = static_cast<float>( (objVel[0] - forceOverDrag[0]) * expDoMDt + forceOverDrag[0] );
physics/physics.cpp lines 279–293 at 61bb9a3 · upstream ↗ 238 mo->momx = FixedMul (mo->momx, FRICTION); 239 mo->momy = FixedMul (mo->momy, FRICTION);
linuxdoom-1.10/p_mobj.c lines 238–239 at a77dfb9 · upstream ↗ 112#define FRICTION 0xe800linuxdoom-1.10/p_mobj.c line 112 at a77dfb9 · upstream ↗ 195 currentspeed = DotProduct (velocity, wishdir); 196 addspeed = wishspeed - currentspeed; ⋮ 199 accelspeed = sv_accelerate.value*host_frametime*wishspeed; 200 if (accelspeed > addspeed) 201 accelspeed = addspeed;
WinQuake/sv_user.c lines 195–201 at bf4ac42 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
Sources
Code
- Entertainment, Outrage. 2024. “Descent 3: the source release (DescentDevelopers/Descent3, initial import).” Commit 61bb9a3. DescentDevelopers/Descent3 @ 61bb9a3 · licence, all uses
- Software, id. 2024. “DOOM: the Linux source release (id-Software/DOOM, linuxdoom-1.10).” Commit a77dfb9. id-Software/DOOM @ a77dfb9 · licence, all uses
- Software, id. 2012. “Quake: the engine source release (id-Software/Quake: WinQuake and QuakeWorld).” Commit bf4ac42. id-Software/Quake @ bf4ac42 · licence, all uses