Game Development Reference
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;
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
which is similar to the equation we saw in section 9.3, but replaces the velocity
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.
// ... other Quaternion code as before ...
void rotateByVector(constVector& vector)
Quaternion q(0, vector.x * scale, vector.y * scale,
vector.z * scale);
(*this) *= q;