Game Development Reference
In-Depth Information
be awkward to do so. For example, consider the airplane from the FlightSim discussion
in Chapter 7 , where you'll have the local coordinate design axes running, relative to the
pilot, fore and aft, up and down, and left and right. This orientation is convenient for
locating the parts of the wings, tail, elevators, etc. with respect to one another, but these
axes don't necessarily represent the principal axes of the airplane. The end result is that
you'll use axes that are convenient and deal with the nonzero products of inertia (which,
by the way, can be either positive or negative).
We already showed you how to calculate the combined moments of inertia for a com‐
posite body made up of a few smaller elements. Accounting for the product of inertia
terms follows the same procedure except that, typically, your elements are such that
their local product of inertia terms are zero. This is the case only if you represent your
elements by simple geometries such as point masses, spheres, rectangles, etc. That being
the case, the main contribution to the rigid body's products of inertia will be due to the
transfer of axes terms for each element.
Before looking at some sample code, let's first revise the element structure to include a
new term to hold the element's local moment of inertia as follows:
typedef struct _PointMass
{
float mass;
Vector designPosition;
Vector correctedPosition;
Vector localInertia;
} PointMass;
Here we're using a vector to represent the three local moment of inertia terms and we're
also assuming that the local products of inertia are zero for each element.
The following code sample shows how to calculate the inertia tensor given the compo‐
nent elements:
float Ixx, Iyy, Izz, Ixy, Ixz, Iyz;
Matrix3x3 InertiaTensor;
Ixx = 0; Iyy = 0; Izz = 0;
Ixy = 0; Ixz = 0; Iyz = 0;
for (i = 0; i<_NUMELEMENTS; i++)
{
Ixx += Element[i].LocalInertia.x +
Element[i].mass * (Element[i].correctedPosition.y *
Element[i].correctedPosition.y +
Element[i].correctedPosition.z *
Element[i].correctedPosition.z);
Iyy += Element[i].LocalInertia.y +
Element[i].mass * (Element[i].correctedPosition.z *
Element[i].correctedPosition.z +