⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game_camera.cpp

📁 自己写的一个D3D游戏Dome。实现了基本的游戏功能
💻 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 + -