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;
}