¡Este libro (representación en tiempo real) me ayudó mucho! Consulte las páginas 66 y 70. Tiene muy buenos gráficos y explicaciones. ¡Los cuaterniones también están en la página 72! :)
Rotación sobre un eje arbitrario
Esto representa la cámara con la rotación realizada por la entrada del 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;
}
Con la entrada del mouse puede modificar el guiñada (cabeza), cabeceo y balanceo.