📄 game_camera.cpp
字号:
#include "..\Include\Game_Camera.h"
Game_Camera::Game_Camera(LPD3DXVECTOR3 pos){
m_Yaw=0.1f;
m_Pitch=-0.3f;
m_vPos=*pos;
m_Distance=300;
//m_pCursor = NULL;
//计算屏幕宽度,高度
D3DSURFACE_DESC m_d3dsdBackBuffer;
LPDIRECT3DSURFACE9 pBackBuffer = NULL;
g_sGlobal.g_pDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer );
pBackBuffer->GetDesc( &m_d3dsdBackBuffer );
m_scrWidth=(float)m_d3dsdBackBuffer.Width;
m_scrHeight=(float)m_d3dsdBackBuffer.Height;
}
Game_Camera::~Game_Camera(){
}
//更新3D变换矩阵
void Game_Camera::Update3DMatrix(){
D3DXMATRIX matView;
GetLookAt(&m_vLookat);
D3DXMatrixLookAtLH(&matView,&m_vPos,&m_vLookat,&D3DXVECTOR3(0,1,0));
g_sGlobal.g_pDevice->SetTransform(D3DTS_VIEW,&matView);
m_matView = matView;
D3DXMATRIX matProjection;
D3DXMatrixPerspectiveFovLH(&matProjection,D3DX_PI/4,m_scrWidth/m_scrHeight,1.0f,12000.0f);
g_sGlobal.g_pDevice->SetTransform(D3DTS_PROJECTION,&matProjection);
m_matProjection = matProjection;
g_sGlobal.g_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
}
//更新2D变换矩阵
//使用屏幕坐标系(0,0)~(1,1);
void Game_Camera::Update2DMatrix(){
D3DXMATRIX matOrtho;
D3DXMATRIX matIdentity;
D3DXMatrixOrthoLH(&matOrtho, (float)m_scrWidth, (float)m_scrHeight, 0.0f, 1.0f);
D3DXMatrixIdentity(&matIdentity);
g_sGlobal.g_pDevice->SetTransform(D3DTS_PROJECTION, &matOrtho);
g_sGlobal.g_pDevice->SetTransform(D3DTS_WORLD, &matIdentity);
g_sGlobal.g_pDevice->SetTransform(D3DTS_VIEW, &matIdentity);
g_sGlobal.g_pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
}
//摄像机绕着观察点旋转,上下偏转
void Game_Camera::YawPitchAt(float yaw,float pitch){
////先保存变换前的焦点坐标
GetLookAt(&m_vLookat);
//改变偏位角度
m_Yaw+=yaw;
//改变仰角
if(m_Pitch-pitch<0 && m_Pitch-pitch>-D3DX_PI/3.0f)
m_Pitch-=pitch;
m_vPos.x=m_vLookat.x-m_Distance*cosf(m_Pitch)*sinf(m_Yaw); //更新摄像机坐标
m_vPos.y=m_vLookat.y-m_Distance*sinf(m_Pitch); //更新摄像机坐标
m_vPos.z=m_vLookat.z-m_Distance*cosf(m_Pitch)*cosf(m_Yaw);
};
//水平方向角度,仰角
//移动,向前/侧向移动,主要用于自由摄像机
void Game_Camera::MoveRelative(float dSide,float dForward){
D3DXVECTOR3 vDir;
D3DXVECTOR3 vSide;
vDir.x=cosf(m_Pitch)*sinf(m_Yaw);
vDir.y=sinf(m_Pitch);
vDir.z=cosf(m_Pitch)*cosf(m_Yaw);
D3DXVec3Cross(&vSide,&D3DXVECTOR3(0,1,0),&vDir);
if(m_Distance+dForward>0){
m_Distance-=dForward;
m_vPos+=vDir*dForward+vSide*dSide;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -