Normalizing a quaternionNormalizing a quaternion is almost the same as normalizing a vector. We start by computing the length of the quaternion to be normalized, which is done using the Euclidean distance forumula: |Q| = sqrt( w^2 + x^2 + y^2 + z^2) A function to implement this formula might look like this:
double length(quaternion quat)
{
return sqrt(quat.x * quat.x + quat.y * quat.y +
quat.z * quat.z + quat.w * quat.w);
}
Not too hard is it? Now to get the normalized vector Q, which we'll call Q*, we just divide every element of Q by |Q|. Q* = Q/|Q| = [w/|Q|, v/|Q|] Here's some sample code for this function:
quaternion normalize(quaternion quat)
{
double L = length(quat);
quat.x /= L;
quat.y /= L;
quat.z /= L;
quat.w /= L;
return quat;
}
This will give us a quaternion of length 1 (which is very important for rotations). Still nothing scary right? Well, it doesn't really get much harder than this. The conjugate of a quaternionLet's compute the conjugate of a quaternion and call it Q'. The conjugate is simply Q' = [ w, -v ] Here's the code for the conjugate:
quaternion conjugate(quaternion quat)
{
quat.x = -quat.x;
quat.y = -quat.y;
quat.z = -quat.z;
return quat;
}
The last thing you need to know is quaternion multiplication. Then you'll be ready to make a quaternion based camera. Multiplying quaternionsMultiplication with quaternions is a little complicated as it involves dot-products cross-products. However, if you just use the following forumula that expands these operations, it isn't too hard. To multiply quaternion A by quaternion B, just do the following: C = A * B such that: C.x = | A.w*B.x + A.x*B.w + A.y*B.z - A.z*B.y | C.y = | A.w*B.y - A.x*B.z + A.y*B.w + A.z*B.x | C.z = | A.w*B.z + A.x*B.y - A.y*B.x + A.z*B.w | C.w = | A.w*B.w - A.x*B.x - A.y*B.y - A.z*B.z | Here's some code for multiplication:
quaternion mult(quaternion A, quaternion B)
{
quaternion C;
C.x = A.w*B.x + A.x*B.w + A.y*B.z - A.z*B.y;
C.y = A.w*B.y - A.x*B.z + A.y*B.w + A.z*B.x;
C.z = A.w*B.z + A.x*B.y - A.y*B.x + A.z*B.w;
C.w = A.w*B.w - A.x*B.x - A.y*B.y - A.z*B.z;
return C;
}
That's not too that hard is it? Now we'll look at how to use these operations to make a quaternion based camera.
|
|