Game Development Reference
In-Depth Information
Excerpt from include/cyclone/core.h
/**
* Holds an inertia tensor, consisting of a 3x3 row-major matrix.
* This matrix is not padding to produce an aligned structure, since
* it is most commonly used with a mass (single real) and two
* damping coefficients to make the 12-element characteristics array
* of a rigid body.
*/
class Matrix3
// ... Other Matrix3 code as before ...
/**
* Sets the matrix to be a skew-symmetric matrix based on
* the given vector. The skew-symmetric matrix is the equivalent
* of the vector product. So if a,b are vectors, a x b = A_s b
* where A_s is the skew-symmetric form of a.
*/
void setSkewSymmetric(const Vector3 vector)
{
data[0] = data[4] = data[8] = 0;
data[1] = -vector.z;
data[2] = vector.y;
data[3] = vector.z;
data[5] = -vector.x;
data[6] = -vector.y;
data[7] = vector.x;
}
};
Now we can work the whole basis matrix through the same series of steps:
// Create the skew-symmetric form of the cross product.
Matrix3 impulseToTorque;
impulseToTorque.setSkewSymmetric(relativeContactPosition);
// This was a cross product.
Matrix3 torquePerUnitImpulse = impulseToTorque * contactToWorld;
// This was a vector transformed by the tensor matrix - now it's
// just plain matrix multiplication.
Matrix3 rotationPerUnitImpulse =
inverseInertiaTensor * torquePerUnitImpulse;
// This was the reverse cross product, so we'll need to multiply the