ok, I am reading the chapter on transformations in "Mathematics for 3D Game Programming & Computer Graphics" and am having trouble figuring out which equations to use in rotating a camera vector.
equation 3.12
Code:
// R is the rotated vector P, O is the angle of the rotation
R.x = P.x cos O - P.y sin O;
R.y = P.y cos O + P.x sin O;
judging by how their is no "center" for this rotation equation, I gather it rotates around <0,0,0>(what i mean to say, is that it is no different than the basic glrotate3f?).
now, then there is equation 3.19 which is rotating about an arbitrary axis represented by a unit vector
Code:
//again, R is the rotated vector, A is the axis, and P is the original Vector, and O is the angle which the vector is rotated
//through
R = P cos O + (A X P) sin O + A(A . P) (1 - cos O);
However, this is only for rotating in 90 degree increments from what I see.
now my question is, how does game tutorials get this :
Code:
void CCamera::RotateView(float angle, float x, float y, float z)
{
CVector3 vNewView;
// Get the view vector (The direction we are facing)
CVector3 vView = m_vView - m_vPosition;
// Calculate the sine and cosine of the angle once
float cosTheta = (float)cos(angle);
float sinTheta = (float)sin(angle);
// Find the new x position for the new rotated point
vNewView.x = (cosTheta + (1 - cosTheta) * x * x) * vView.x;
vNewView.x += ((1 - cosTheta) * x * y - z * sinTheta) * vView.y;
vNewView.x += ((1 - cosTheta) * x * z + y * sinTheta) * vView.z;
// Find the new y position for the new rotated point
vNewView.y = ((1 - cosTheta) * x * y + z * sinTheta) * vView.x;
vNewView.y += (cosTheta + (1 - cosTheta) * y * y) * vView.y;
vNewView.y += ((1 - cosTheta) * y * z - x * sinTheta) * vView.z;
// Find the new z position for the new rotated point
vNewView.z = ((1 - cosTheta) * x * z - y * sinTheta) * vView.x;
vNewView.z += ((1 - cosTheta) * y * z + x * sinTheta) * vView.y;
vNewView.z += (cosTheta + (1 - cosTheta) * z * z) * vView.z;
// Now we just add the newly rotated vector to our position to set
// our new rotated view of our camera.
m_vView = m_vPosition + vNewView;
}
Do I need to do something as messed up looking as Gametutorial's method(I would like to know how they derived that equation), or can I make a better, simpler formula. I know I could do a simple "copy/paste" manuver and just rewrite it to use my classes, but I want to understand this fully as its alot easier to "re-derive" in case of losing the equation if I understand it and the math behind it.