Este livro (renderização em tempo real) me ajudou muito! Veja nas páginas 66 e 70. Possui gráficos e explicações muito bons. Os quaternions também estão na página 72! :)
Rotação em torno de um eixo arbitrário
Isso renderiza a câmera com a rotação feita pela entrada do mouse:
void Camera::getVectors(D3DXVECTOR3& up, D3DXVECTOR3& lookAt)
{
float yaw, pitch, roll;
D3DXMATRIX rotationMatrix;
// Setup the vector that points upwards.
up.x = 0.0f;
up.y = 1.0f;
up.z = 0.0f;
// Setup where the camera is looking by default.
lookAt.x = 0.0f;
lookAt.y = 0.0f;
lookAt.z = 1.0f;
// Set the yaw (Y axis), pitch (X axis), and roll (Z axis) rotations in radians.
pitch = m_rotation.x * 0.0174532925f;
yaw = m_rotation.y * 0.0174532925f;
roll = m_rotation.z * 0.0174532925f;
// Create the rotation matrix from the yaw, pitch, and roll values.
D3DXMatrixRotationYawPitchRoll(&rotationMatrix, yaw, pitch, roll);
// Transform the lookAt and up vector by the rotation matrix so the view is correctly rotated at the origin.
D3DXVec3TransformCoord(&lookAt, &lookAt, &rotationMatrix);
D3DXVec3TransformCoord(&up, &up, &rotationMatrix);
}
// The Render function uses the position and rotation of the camera to build and update the view matrix
void Camera::render()
{
D3DXVECTOR3 up, position, lookAt;
// Setup the position of the camera in the world.
position = (D3DXVECTOR3)m_position;
getVectors(up, lookAt);
// Translate the rotated camera position to the location of the viewer.
lookAt = position + lookAt;
// Finally create the view matrix from the three updated vectors.
D3DXMatrixLookAtLH(&m_viewMatrix, &position, &lookAt, &up);
return;
}
Com a entrada do mouse, você modifica a guinada (cabeça), o pitch and roll.