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