www.pudn.com > Game_11.rar > Camera.cpp


// Camera.cpp: implementation of the CCamera class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "Camera.h" 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CCamera::CCamera(LPDIRECT3DDEVICE9 pDevice, 
				 LPD3DXVECTOR3 pos) 
{ 
	m_pDevice=pDevice; 
	m_Yaw=0; 
	m_Pitch=-D3DX_PI/6; 
	vPos=*pos; 
	m_Distance=120; 
} 
 
CCamera::~CCamera() 
{ 
 
} 
 
void CCamera::Update3DMatrix() 
{ 
	D3DXMATRIX matView; 
	D3DXVECTOR3 vLookAt; 
	GetLookAt(&vLookAt); 
 
	D3DXMATRIX matProjection; 
	D3DXMatrixPerspectiveFovLH(&matProjection,D3DX_PI/4,4/3.0f,1.0f,6000.0f); 
 
	m_pDevice->SetTransform(D3DTS_PROJECTION,&matProjection); 
	D3DXMatrixLookAtLH(&matView,&vPos,&vLookAt,&D3DXVECTOR3(0,1,0)); 
	m_pDevice->SetTransform(D3DTS_VIEW,&matView); 
}; 
 
void CCamera::Update2DMatrix(float scrWidth,float scrHeight) 
{/* 
	D3DXMATRIX matView; 
	D3DXMatrixIdentity(&matView); 
	m_pDevice->SetTransform(D3DTS_VIEW,&matView); 
	*/ 
	RECT rect; 
	m_pDevice->GetScissorRect(&rect); 
	D3DXMATRIX matOrtho;	 
	D3DXMATRIX matIdentity; 
		D3DVIEWPORT9 viewPort; 
	m_pDevice->GetViewport(&viewPort); 
	//Setup the orthogonal projection matrix and the default world/view matrix 
	D3DXMatrixOrthoLH(&matOrtho,scrWidth ,scrHeight, 0.0f, 1000.0f); 
	D3DXMatrixIdentity(&matIdentity); 
 
	m_pDevice->SetTransform(D3DTS_PROJECTION, &matOrtho); 
	m_pDevice->SetTransform(D3DTS_WORLD, &matIdentity); 
	m_pDevice->SetTransform(D3DTS_VIEW, &matIdentity); 
	//Make sure that the z-buffer and lighting are disabled 
//	m_pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); 
//	m_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE); 
}; 
 
void CCamera::YawPitchAt(float yaw,float pitch) 
	{ 
		//沿着观察点变化 
		D3DXVECTOR3 vLookAt; 
		GetLookAt(&vLookAt);	//先保存变换前的观察点坐标 
		m_Yaw+=yaw; 
 
		if(m_Pitch-pitch<0 && m_Pitch-pitch>-D3DX_PI/3.0f)  
				m_Pitch-=pitch; 
		 
		vPos.x=vLookAt.x-m_Distance*cosf(m_Pitch)*cosf(m_Yaw); 
		vPos.y=vLookAt.y-m_Distance*sinf(m_Pitch); 
		vPos.z=vLookAt.z-m_Distance*cosf(m_Pitch)*sinf(m_Yaw); 
 
	};		//水平方向角度,仰角 
 
 
	void CCamera::YawPitchPos(float yaw,float pitch) 
	{	 
		m_Yaw+=yaw; 
		 
		if(m_Pitch+pitch-D3DX_PI/3.0f)  
			m_Pitch+=pitch; 
		 
	}; 
 
	void CCamera::Move(float dSide,float dForward) 
	{ 
		 
		D3DXVECTOR3 vDir; 
		D3DXVECTOR3 vSide; 
		vDir.x=cosf(m_Pitch)*cosf(m_Yaw); 
		vDir.y=sinf(m_Pitch); 
		vDir.z=cosf(m_Pitch)*sinf(m_Yaw); 
 
		D3DXVec3Cross(&vSide,&D3DXVECTOR3(0,1,0),&vDir); 
		D3DXVec3Normalize(&vSide,&vSide); 
 
		vPos+=vDir*dForward+ vSide*dSide; 
 
	}