示例#1
0
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;
}
示例#2
0
文件: camera.cpp 项目: aisi/Camera
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)));
}
示例#3
0
文件: camera.cpp 项目: aisi/Camera
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;
}
示例#4
0
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();
}