Game Development Reference

In-Depth Information

To implement the flight model, you first need to prepare a rigid-body structure to en‐

capsulate all of the data required to completely define the state of the rigid body at any

instant during the simulation. We've defined a structure called
RigidBody
for this pur‐

pose:

typedef struct _RigidBody {

float fMass; // total mass

Matrix3x3 mInertia; // mass moment of inertia

// in body coordinates

Matrix3x3 mInertiaInverse; // inverse of mass moment of inertia

Vector vPosition; // position in earth coordinates

Vector vVelocity; // velocity in earth coordinates

Vector vVelocityBody; // velocity in body coordinates

Vector vAngularVelocity;// angular velocity in body coordinates

Vector vEulerAngles; // Euler angles in body coordinates

float fSpeed; // speed (magnitude of the velocity)

Quaternion qOrientation; // orientation in earth coordinates

Vector vForces; // total force on body

Vector vMoments; // total moment (torque) on body

} RigidBody, *pRigidBody;

You'll notice that it is very similar to the
RigidBody2D
structure that we used in the 2D

hovercraft simulation. One significant difference, however, is that in the 2D case, ori‐

entation was a single
float
value, and now in 3D it's a quaternion of type
Quaternion
.

We discussed the use of quaternions for tracking rigid-body orientation in the previous

chapter, and
Appendix C
contains a complete definition of the
Quaternion
class.

The next step in defining the flight model is to prepare an initialization function to

initialize the airplane at the start of the simulation. For this purpose, we've prepared a

function called
InitializeAirplane
:

RigidBody Airplane; // global variable representing the airplane

.

.

.

void InitializeAirplane(void)

{

float iRoll, iPitch, iYaw;

// Set initial position

Airplane.vPosition.x = −5000.0f;

Airplane.vPosition.y = 0.0f;

Airplane.vPosition.z = 2000.0f;

// Set initial velocity

Airplane.vVelocity.x = 60.0f;

Airplane.vVelocity.y = 0.0f;

Airplane.vVelocity.z = 0.0f;