On this page
  1. Related
  2. Games
  3. References
  4. Sources

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.

  • DampedDescent 3 (1999). Pitch, heading, and bank take thrust like movement does and fade under their own drag when let go.1,2

Games

GameYearHowNote
Descent 31999Dampedpitch, 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

  1. ^ 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_rotthrust times the player's turn_scalar, and an object flagged PF_USES_THRUST with 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, PhysicsDoSimRot can add auto-leveling thrust to pitch and bank, which this claim doesn't cover.CodeDescentDevelopers/Descent3
    How 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.

    In the claim ledger

  2. ^ 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's movement_scalar and 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/Quake
    How 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		0xe800
    
    linuxdoom-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.

    In the claim ledger

Sources

Code