Game Development Reference
In-Depth Information
Next, to enforce the constraint that this orientation quaternion be a unit quaternion,
you must normalize the orientation quaternion. The following code sample illustrates
these steps:
.
.
.
// calculate the angular velocity of the airplane in body space:
Airplane.vAngularVelocity += Airplane.mInertiaInverse *
(Airplane.vMoments -
(Airplane.vAngularVelocity^
(Airplane.mInertia *
Airplane.vAngularVelocity)))
* dt;
// calculate the new rotation quaternion:
Airplane.qOrientation += (Airplane.qOrientation *
Airplane.vAngularVelocity) *
(0.5f * dt);
// now normalize the orientation quaternion:
mag = Airplane.qOrientation.Magnitude();
if (mag != 0)
Airplane.qOrientation /= mag;
// calculate the velocity in body space:
// (we'll need this to calculate lift and drag forces)
Airplane.vVelocityBody = QVRotate(~Airplane.qOrientation,
Airplane.vVelocity);
.
.
.
Notice the last line of code in the preceding sample. That line converts the airplane's
velocity vector from earth-fixed coordinates to body-fixed coordinates using QVRo
tate . Recall that it's more convenient to compute body forces in body-fixed coordinates.
QVRotate allows you to work with vectors back and forth from body-fixed to earth-fixed
coordinates.
Search Nedrilad ::




Custom Search