void Camera::BuildViewMatrix(const Maths::Vector4 &position, const Maths::Vector4 &lookAt, const Maths::Vector4 &up) { Vector4 viewDir = lookAt - position; Vector4 viewSide, viewUp; // store values m_up = up; m_position = position; m_lookAt = lookAt; viewDir.Normalize(); viewUp = up - viewDir * up.DotProduct( viewDir ); viewUp.Normalize(); viewSide = viewDir.CrossProduct( viewUp ); // setup inverse rotation matrix Matrix4 rotation; rotation.SetRows( viewSide, viewUp, Vector4( -viewDir.X, -viewDir.Y, -viewDir.Z, -viewDir.W ), Vector4( 0.0f, 0.0f, 0.0f, 1.0f ) ); //transform translation Vector4 invPos; Matrix4::Transform( rotation, position, invPos ); m_inversePosition = -invPos; // build view matrix Matrix4 view; Matrix4::Multiply( view, rotation, m_viewMatrix ); m_viewMatrix( 0, 3 ) = m_inversePosition.X; m_viewMatrix( 1, 3 ) = m_inversePosition.Y; m_viewMatrix( 2, 3 ) = m_inversePosition.Z; m_viewMatrix( 3, 3 ) = m_inversePosition.W; m_viewDir = viewDir; }
void Camera::lookAt(const D3DXVECTOR3 &eye, const D3DXVECTOR3 &target, const D3DXVECTOR3 &up) { m_eye = eye; m_zAxis = target - eye; D3DXVec3Normalize(&m_zAxis, &m_zAxis); m_viewDir = m_zAxis; D3DXVec3Cross(&m_xAxis, &up, &m_zAxis); D3DXVec3Normalize(&m_xAxis, &m_xAxis); D3DXVec3Cross(&m_yAxis, &m_zAxis, &m_xAxis); D3DXVec3Normalize(&m_yAxis, &m_yAxis); D3DXVec3Normalize(&m_xAxis, &m_xAxis); D3DXMatrixIdentity(&m_viewMatrix); m_viewMatrix(0,0) = m_xAxis.x; m_viewMatrix(1,0) = m_xAxis.y; m_viewMatrix(2,0) = m_xAxis.z; m_viewMatrix(3,0) = -D3DXVec3Dot(&m_xAxis, &eye); m_viewMatrix(0,1) = m_yAxis.x; m_viewMatrix(1,1) = m_yAxis.y; m_viewMatrix(2,1) = m_yAxis.z; m_viewMatrix(3,1) = -D3DXVec3Dot(&m_yAxis, &eye); m_viewMatrix(0,2) = m_zAxis.x; m_viewMatrix(1,2) = m_zAxis.y; m_viewMatrix(2,2) = m_zAxis.z; m_viewMatrix(3,2) = -D3DXVec3Dot(&m_zAxis, &eye); // Extract the pitch angle from the view matrix. m_accumPitchDegrees = D3DXToDegree(-asinf(m_viewMatrix(1,2))); }
void Camera::updateViewMatrix(bool orthogonalizeAxes) { if (orthogonalizeAxes) { // Regenerate the camera's local axes to orthogonalize them. D3DXVec3Normalize(&m_zAxis, &m_zAxis); D3DXVec3Cross(&m_yAxis, &m_zAxis, &m_xAxis); D3DXVec3Normalize(&m_yAxis, &m_yAxis); D3DXVec3Cross(&m_xAxis, &m_yAxis, &m_zAxis); D3DXVec3Normalize(&m_xAxis, &m_xAxis); m_viewDir = m_zAxis; } // Reconstruct the view matrix. m_viewMatrix(0,0) = m_xAxis.x; m_viewMatrix(1,0) = m_xAxis.y; m_viewMatrix(2,0) = m_xAxis.z; m_viewMatrix(3,0) = -D3DXVec3Dot(&m_xAxis, &m_eye); m_viewMatrix(0,1) = m_yAxis.x; m_viewMatrix(1,1) = m_yAxis.y; m_viewMatrix(2,1) = m_yAxis.z; m_viewMatrix(3,1) = -D3DXVec3Dot(&m_yAxis, &m_eye); m_viewMatrix(0,2) = m_zAxis.x; m_viewMatrix(1,2) = m_zAxis.y; m_viewMatrix(2,2) = m_zAxis.z; m_viewMatrix(3,2) = -D3DXVec3Dot(&m_zAxis, &m_eye); m_viewMatrix(0,3) = 0.0f; m_viewMatrix(1,3) = 0.0f; m_viewMatrix(2,3) = 0.0f; m_viewMatrix(3,3) = 1.0f; }
void Camera::setViewMatrix() { m_viewMatrix(0,0) = m_u.x(); m_viewMatrix(0,1) = m_v.x(); m_viewMatrix(0,2) = m_n.x(); m_viewMatrix(0,3) = 0.0; m_viewMatrix(1,0) = m_u.y(); m_viewMatrix(1,1) = m_v.y(); m_viewMatrix(1,2) = m_n.y(); m_viewMatrix(1,3) = 0.0; m_viewMatrix(2,0) = m_u.z(); m_viewMatrix(2,1) = m_v.z(); m_viewMatrix(2,2) = m_n.z(); m_viewMatrix(2,3) =0.0; m_viewMatrix(3,0) = m_eye.dot(-m_u); m_viewMatrix(3,1)= m_eye.dot(-m_v); m_viewMatrix(3,2)= m_eye.dot(-m_n); m_viewMatrix(3,3) =1.0; calculateFrustum(); }