Game Development Reference
In-Depth Information
j = q.r*multiplier.j + q.j*multiplier.r +
q.k*multiplier.i - q.i*multiplier.k;
k = q.r*multiplier.k + q.k*multiplier.r +
q.i*multiplier.j - q.j*multiplier.i;
}
};
9.4.10
R OTATING
Occasionally we need to rotate a quaternion by some given amount. If a quaternion
represents the orientation of an object, and we need to alter that orientation by ro-
tating it, we can convert the orientation and the desired rotation into matrices and
multiply them. But there is a more direct way to do this.
The amount of rotation is most simply represented as a vector (since the rotation
amount isn't bounded, just as we saw for angular velocity). We can then alter the
quaternion using the equation
1
2 θ
=
+
θ
ˆ
θ
ˆ
θ
ˆ
[9.8]
ˆ
which is similar to the equation we saw in section 9.3, but replaces the velocity
×
time
with a single absolute angular change ( θ ).
Here, as in the case of angular velocity, the rotation is provided as a vector con-
verted into a non-normalized quaternion:
[ θ x θ y θ z ]
[0 θ x θ y θ z ]
This can be implemented as
Excerpt from include/cyclone/core.h
/**
* Holds a three degree of freedom orientation.
*/
class Quaternion
{
// ... other Quaternion code as before ...
void rotateByVector(constVector& vector)
{
Quaternion q(0, vector.x * scale, vector.y * scale,
vector.z * scale);
(*this) *= q;
}
};