www.pudn.com > 3D_Tank.rar > Camera.cpp


#include "Camera.h" 
 
CCamera::CCamera() 
{ 
	m_vPosition = D3DXVECTOR3(0, 0, 0); 
	m_vLook		= D3DXVECTOR3(0, 0, 1); 
	m_vUp		= D3DXVECTOR3(0, 1, 0); 
	m_vRight	= D3DXVECTOR3(1, 0, 0); 
} 
 
CCamera::~CCamera() 
{} 
 
VOID CCamera::Yaw(float fAngle) 
{ 
    m_fYaw += fAngle; 
 
	D3DXMATRIX T; 
	D3DXMatrixRotationAxis(&T, &m_vUp, D3DXToRadian(fAngle)); 
 
	D3DXVec3TransformNormal(&m_vRight, &m_vRight, &T); 
	D3DXVec3TransformNormal(&m_vLook, &m_vLook, &T); 
} 
 
VOID CCamera::Pitch(float fAngle) 
{ 
    m_fPitch += fAngle; 
 
	D3DXMATRIX T; 
	D3DXMatrixRotationAxis(&T, &m_vRight, D3DXToRadian(fAngle)); 
 
	D3DXVec3TransformNormal(&m_vUp, &m_vUp, &T); 
	D3DXVec3TransformNormal(&m_vLook, &m_vLook, &T); 
} 
 
VOID CCamera::Roll(float fAngle) 
{ 
	m_fRoll += fAngle; 
 
	D3DXMATRIX T; 
	D3DXMatrixRotationAxis(&T, &m_vLook, D3DXToRadian(fAngle)); 
 
	D3DXVec3TransformNormal(&m_vUp, &m_vUp, &T); 
	D3DXVec3TransformNormal(&m_vRight, &m_vRight, &T); 
} 
 
VOID CCamera::YawTo(float fAngle) 
{ 
	float angle = fAngle - m_fYaw; 
	Yaw(angle); 
} 
	 
VOID CCamera::PitchTo(float fAngle) 
{ 
    float angle = fAngle - m_fPitch; 
	if (angle > 0.1) 
		Pitch(0.1f); 
	if (angle < -0.1) 
		Pitch(-0.1f); 
	if (abs(angle) <= 0.1) 
	    Pitch(angle); 
} 
 
VOID CCamera::RollTo(float fAngle) 
{ 
	float angle = fAngle - m_fRoll; 
	if (angle > 0.1) 
		Roll(0.1f); 
	if (angle < -0.1) 
		Roll(-0.1f); 
	if (abs(angle) <= 0.1) 
        Roll(angle); 
} 
 
VOID CCamera::Walk(float fLength) 
{ 
	m_vPosition += m_vLook * fLength; 
} 
 
VOID CCamera::Strafe(float fLength) 
{ 
	m_vPosition += m_vRight * fLength; 
} 
 
VOID CCamera::Fly(float fLength) 
{ 
	m_vPosition += m_vUp * fLength; 
} 
 
D3DXVECTOR3& CCamera::GetPosition() 
{ 
	return m_vPosition; 
} 
 
D3DXVECTOR3& CCamera::GetLook() 
{ 
	return m_vLook; 
} 
 
VOID CCamera::SetPosition(const D3DXVECTOR3 &position) 
{ 
	m_vPosition = position; 
} 
 
VOID CCamera::GetViewMarix(D3DXMATRIX *matView) 
{ 
	D3DXVec3Normalize(&m_vLook, &m_vLook); 
 
	D3DXVec3Cross(&m_vUp, &m_vLook, &m_vRight); 
	D3DXVec3Normalize(&m_vUp, &m_vUp); 
 
	D3DXVec3Cross(&m_vRight, &m_vUp, &m_vLook); 
	D3DXVec3Normalize(&m_vRight, &m_vRight);	//重新计算Camera的3个向量 
 
	float x = - D3DXVec3Dot(&m_vRight, &m_vPosition); 
	float y = - D3DXVec3Dot(&m_vUp, &m_vPosition); 
	float z = - D3DXVec3Dot(&m_vLook, &m_vPosition); 
 
	(*matView)._11 = m_vRight.x; 
	(*matView)._21 = m_vRight.y; 
	(*matView)._31 = m_vRight.z; 
 
	(*matView)._12 = m_vUp.x; 
	(*matView)._22 = m_vUp.y; 
	(*matView)._32 = m_vUp.z; 
 
	(*matView)._13 = m_vLook.x; 
	(*matView)._23 = m_vLook.y; 
	(*matView)._33 = m_vLook.z; 
 
	(*matView)._14 = 0; 
	(*matView)._24 = 0; 
	(*matView)._34 = 0; 
 
	(*matView)._41 = x; 
	(*matView)._42 = y; 
	(*matView)._43 = z; 
	(*matView)._44 = 1; 
} 
 
VOID CCamera::SetDirection(const D3DXVECTOR3 &look, const D3DXVECTOR3 &up, const D3DXVECTOR3 &right) 
{ 
    m_vLook	 = look; 
	m_vUp	 = up; 
	m_vRight = right; 
}