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

📄 game_camera.h

📁 我做的毕业设计
💻 H
字号:
#ifndef  GAMEENGINE_CAMERA_INCLUDE
#define  GAMEENGINE_CAMERA_INCLUDE

//-------------------------------------------------------------------
//摄像机类,主要用于控制,更新2D,3D视图变换矩阵,投影变换矩阵
//实现计算鼠标指针射线(从摄像机开始穿过鼠标指针的一条3D空间的射线)
//-------------------------------------------------------------------
class CCursor;
class CCamera  
{
protected:
	CCursor*			m_pCursor;		//鼠标
	BOOL				m_bTrackMode;	//判断是否进行自动移动
	float				m_Yaw,m_Pitch;	//偏位角,仰角
	
	float				m_scrWidth;		//屏幕宽
	float				m_scrHeight;	//屏幕高
	
	D3DXVECTOR3			m_vPos;			//摄像机观察点
	LPDIRECT3DDEVICE9	m_pDevice;
		
	//摄像机从m_vPos观察,方向为:从m_vPos水平偏角为yaw,仰角为pitch
public:
	float				m_Distance;		//焦点距离
	D3DXMATRIX			m_matView;		//观察矩阵
	D3DXMATRIX			m_matProjection;//投影矩阵
	CCamera(LPDIRECT3DDEVICE9 pDevice,LPD3DXVECTOR3 pos);
	virtual ~CCamera();
	void YawPitchAt(float yaw,float pitch);
	void YawPitchPos(float yaw,float pitch);	//鼠标在转动后镜头的位置
	void Update3DMatrix(float frameTime);		//重新设置投影和观察矩阵
	void Update2DMatrix();						//重新设置正交矩阵
	void AimTo(D3DVECTOR *pLookAt);
	void SetYawPitch(float yaw,float pitch);
	D3DXMATRIX* GetMatrixView(){return &m_matView;}
	float GetDistance(){return m_Distance;}
	//设置鼠标
	void SetCursor(CCursor* pCursor){m_pCursor = pCursor;}
	float GetPitch(){return m_Pitch;}
	//设置是否播放动画
	void SetTrackMode(BOOL bTrack)
	{
		m_bTrackMode=bTrack;
	}
	//获得观察点坐标
	void GetLookAt(D3DVECTOR *pLookAt)	
	{
		//cosf和sinf计算的是单位向量
		pLookAt->x = m_vPos.x+m_Distance*cosf(m_Pitch)*sinf(m_Yaw);
		pLookAt->y = m_vPos.y+m_Distance*sinf(m_Pitch);
		pLookAt->z = m_vPos.z+m_Distance*cosf(m_Pitch)*cosf(m_Yaw); 							
	};
	
	//获得摄像机坐标
	D3DVECTOR* GetPos()
	{
		return &m_vPos;
	}
	//获得摄像机坐标
	void GetPos(D3DVECTOR *vPos)	
	{
		vPos->x=m_vPos.x;
		vPos->y=m_vPos.y;
		vPos->z=m_vPos.z; 
	};
	//获得方向向量(单位向量)
	void  GetDirection(D3DVECTOR *vDir) 
	{		
		vDir->x=cosf(m_Pitch)*sinf(m_Yaw);
		vDir->y=sinf(m_Pitch);
		vDir->z=cosf(m_Pitch)*cosf(m_Yaw);
	};
	void WalkFoward(float fDistance)
	{
		D3DXVECTOR3 vDir;
		GetDirection(&vDir);
		m_vPos += fDistance*vDir;
	}
	void Turn(float fAngle)
	{
		m_Yaw += fAngle;
	}
	void UpFoward(float uDistance)
	{
		D3DXVECTOR3 vPos;
		GetPos(&vPos);
		vPos.y += uDistance;
		m_vPos = vPos;
	}
	//设置高度
	void SetAltitude(float y)
	{
		m_vPos.y = y;
	}
	//-----------------------------------------------------------------
	//根据鼠标坐标,计算射线
	//实现计算鼠标指针射线(从摄像机开始穿过鼠标指针的一条3D空间的射线)
	//-----------------------------------------------------------------
	void GetRayOrigDir(D3DXVECTOR3* vPickRayOrig, D3DXVECTOR3* vPickRayDir, CTerrain* m_pMesh);
	void GetRayOrigDirFormTerrain(D3DXVECTOR3* vPickRayOrig, D3DXVECTOR3* vPickRayDir, CTerrain* pTerrain);
	void GetRayOrigDir(D3DXVECTOR3* vPickRayOrig, D3DXVECTOR3* vPickRayDir);
	void GetRayOrigDirFormSkinMesh(D3DXVECTOR3* vPickRayOrig, D3DXVECTOR3* vPickRayDir, CSkinMesh* pSkinMesh);
	void GetRayOrigDirFormMesh(D3DXVECTOR3* vPickRayOrig, D3DXVECTOR3* vPickRayDir, CMesh* pMesh);
	//移动焦点坐标(实质上是移动摄像机)
	void SetLookAt(D3DXVECTOR3 *vLookAt)
	{
		m_vPos.x=vLookAt->x-m_Distance*cosf(m_Pitch)*sinf(m_Yaw);
		m_vPos.y=vLookAt->y-m_Distance*sinf(m_Pitch);
		m_vPos.z=vLookAt->z-m_Distance*cosf(m_Pitch)*cosf(m_Yaw);	
	}
	//SetPosition()和SetLookAt()效果可能一样的(没看出哪不同)
	//移动摄像机
	void SetPosition(D3DXVECTOR3 *pV)
	{
		m_vPos=*pV;
	}
	void AddTransformKey(float time,const D3DXVECTOR3 &vTrans)
	{
		D3DXKEY_VECTOR3 keyV;
		keyV.Time=time;		//Key frame time stamp.
		keyV.Value=vTrans;	//3-D vector that supplies scale and/or translation values.
	
	}
	void AddRotationKey(float time,float yaw,float pitch);
	void AddRotationKey(float time,const D3DXQUATERNION  &vRotation);

	HRESULT UpdateFromTracked(float Time);

	//返回屏幕高度,宽度
	float GetScreenHeight() {return m_scrHeight ;}
	float GetScreenWidth()  {return m_scrWidth;}
	BOOL  GetIsTrackMode()	{return m_bTrackMode;}

	void  SetDistance(float s)
	{
		D3DXVECTOR3 vDir;		
		vDir.x=cosf(m_Pitch)*sinf(m_Yaw);
		vDir.y=sinf(m_Pitch);
		vDir.z=cosf(m_Pitch)*cosf(m_Yaw);
		m_Distance=s;
		m_vPos=vDir*s;
	}
	
	//移动摄像机,在摄像机空间,也就是沿着摄像机朝向前后移动,和侧向左右移动
	void MoveRelative(float dSide,float dForward);

};
#endif 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -