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 dotproducts crossproducts. 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.

