Game Development Reference
In-Depth Information
And finally, equation 9.5 tells us the total velocity of a point. If we remove the
linear component, we get the equation for the linear velocity of a point due only to
its rotation:
= θ
q
˙
×
q rel
The rotation-induced velocity of a point (
q ) depends on its position relative to the
˙
p ) and on the object's angular velocity ( θ ).
So we now have a set of equations that can get us from a unit of impulse, via the
impulsive torque it generates and the angular velocity that the torque causes, through
to the linear velocity that results.
Converting these three equations into code, we get
origin of the object ( q
Vector3 torquePerUnitImpulse =
relativeContactPosition % contactNormal;
Vector3 rotationPerUnitImpulse =
inverseInertiaTensor.transform(torquePerUnitImpulse);
Vector3 velocityPerUnitImpulse =
rotationPerUnitImpulse % relativeContactPosition;
The result will be the velocity caused by rotation per unit impulse. As it stands, the
result is a vector: it is a velocity in world space. We are only interested in the velocity
along the contact normal.
We need to transform this vector into contact coordinates using the transpose
basis matrix we saw earlier. This would give us a vector of velocities that a unit impulse
would cause. We are only interested at this stage in the velocity in the direction of
the contact normal. In contact coordinates this is the X axis, so our value is the x
component of the resulting vector:
Vector3 velocityPerUnitImpulseContact =
contactToWorld.transformTranspose(velocityPerUnitImpulse);
real angularComponent = velocityPerUnitImpulseContact.x;
where the transformTranspose method is a convenience method that combines the
effect of transforming a vector by the transpose of a matrix. 3
3. It works by performing a regular matrix transformation, but it selects the components of the matrix by
row rather than column order. See the code on the CD for its implementation.