www.pudn.com > GameEngine.rar > GameEngine_Camera.cpp, change:2005-08-21,size:2973b


#include "..\GameEngine_Common.h" 
#include "GameEngine_Camera.h" 
 
CGameEngine_Camera::CGameEngine_Camera() 
{ 
	m_pos   = D3DXVECTOR3(0.0f, 0.0f, 0.0f); 
	m_right = D3DXVECTOR3(1.0f, 0.0f, 0.0f); 
	m_look  = D3DXVECTOR3(0.0f, 0.0f, 1.0f); 
	m_up    = D3DXVECTOR3(0.0f, 1.0f, 0.0f); 
} 
 
CGameEngine_Camera::~CGameEngine_Camera(){} 
 
void CGameEngine_Camera::InitCamera(D3DXVECTOR3& CameraPos,D3DXVECTOR3& LookAtPos,D3DXVECTOR3& UpPos){ 
	D3DXVECTOR3 vLookAt=LookAtPos-CameraPos; 
	D3DXVECTOR3 vUp=UpPos; 
 
	D3DXVec3Normalize(&vLookAt, &vLookAt); 
	 
	D3DXVECTOR3 vRight; 
	D3DXVec3Cross(&vRight, &vUp, &vLookAt );  //DirectX可使用左手判断叉积方向  
	D3DXVec3Normalize(&vRight,&vRight); 
 
	D3DXVec3Cross(&vUp, &vLookAt, &vRight); 
	D3DXVec3Normalize(&vUp,&vUp); 
 
	m_pos=CameraPos; 
	m_right=vRight; 
	m_look=vLookAt; 
	m_up=vUp; 
} 
 
void CGameEngine_Camera::SetCameraPos(D3DXVECTOR3* pos) 
{ 
	m_pos = *pos; 
} 
 
D3DXVECTOR3* CGameEngine_Camera::GetCameraPos() 
{ 
	return &m_pos; 
} 
 
void CGameEngine_Camera::GetViewMatrix(D3DXMATRIX *pViewMat) 
{ 
	float PosRight = -D3DXVec3Dot( &m_right , &m_pos); 
	float PosUp = -D3DXVec3Dot( &m_up , &m_pos); 
	float PosLook = -D3DXVec3Dot( &m_look , &m_pos); 
 
	(*pViewMat)(0,0) = m_right.x; 
	(*pViewMat)(0,1) = m_up.x; 
	(*pViewMat)(0,2) = m_look.x; 
	(*pViewMat)(0,3) = 0.0f; 
 
	(*pViewMat)(1,0) = m_right.y; 
	(*pViewMat)(1,1) = m_up.y; 
	(*pViewMat)(1,2) = m_look.y; 
	(*pViewMat)(1,3) = 0.0f; 
 
	(*pViewMat)(2,0) = m_right.z; 
	(*pViewMat)(2,1) = m_up.z; 
	(*pViewMat)(2,2) = m_look.z; 
	(*pViewMat)(2,3) = 0.0f; 
 
	(*pViewMat)(3,0) = PosRight; 
	(*pViewMat)(3,1) = PosUp; 
	(*pViewMat)(3,2) = PosLook; 
	(*pViewMat)(3,3) = 1.0f; 
} 
 
void CGameEngine_Camera::RotateRightAxis(float angle) 
{ 
	D3DXMATRIX M; 
	D3DXMatrixRotationAxis(&M, &m_right,angle); 
	D3DXVec3TransformCoord(&m_look,&m_look,&M); 
	D3DXVec3TransformCoord(&m_up,&m_up,&M); 
} 
 
void CGameEngine_Camera::RotateUpAxis(float angle) 
{ 
	D3DXMATRIX M; 
	D3DXMatrixRotationAxis(&M, &m_up,angle); 
	D3DXVec3TransformCoord(&m_right,&m_right,&M); 
	D3DXVec3TransformCoord(&m_look,&m_look,&M); 
} 
 
void CGameEngine_Camera::RotateLookAxis(float angle) 
{ 
	D3DXMATRIX M; 
	D3DXMatrixRotationAxis(&M, &m_look,angle); 
	D3DXVec3TransformCoord(&m_right,&m_right,&M); 
	D3DXVec3TransformCoord(&m_up,&m_up,&M); 
} 
 
void CGameEngine_Camera::RotateYAxis(float angle){ 
	D3DXMATRIX M; 
	D3DXMatrixRotationY(&M,angle); 
	D3DXVec3TransformCoord(&m_look,&m_look,&M); 
	D3DXVec3TransformCoord(&m_right,&m_right,&M); 
	D3DXVec3TransformCoord(&m_up,&m_up,&M); 
} 
 
void CGameEngine_Camera::MoveAlongY(float yAdd){ 
	Move(0.0f,yAdd,0.0f); 
} 
 
void CGameEngine_Camera::MoveAlongZ(float zAdd){ 
	Move(0.0f,0.0f,zAdd); 
} 
 
void CGameEngine_Camera::MoveAlongX(float xAdd){ 
	Move(xAdd,0.0f,0.0f); 
} 
 
void CGameEngine_Camera::Move(float xAdd,float yAdd,float zAdd){ 
	m_pos.x=m_pos.x + xAdd; 
	m_pos.y=m_pos.y + yAdd; 
	m_pos.z=m_pos.z + zAdd; 
}