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

📄 camera.h

📁 AABB碰撞检测,目前主流3D游戏必需,希望对大家有帮助
💻 H
字号:
// Camera.h: interface for the CCamera class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_CAMERA_H)
#define AFX_CAMERA_H

#include <vector>
using namespace std;

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#ifndef SAFE_RELEASE
#define SAFE_RELEASE(p) if(p) {p->Release();p=NULL;}
#endif

#ifndef SCREENCOORD_MODE	
#define SCREENCOORD_MODE SCREENCOORD_CENTER	//默认使用屏幕中心的坐标系统
#endif

#define	SCREENCOORD_CENTER			0x1		//屏幕中心为坐标原点
#define	SCREENCOORD_LOWERLEFT		0x2		//左下角为坐标原点
#define	SCREENCOORD_UPPERLEFT		0x3		//左上角为坐标原点



//-------------------------------------------------------------------
//摄像机类,主要用于控制,更新2D,3D视图变换矩阵,投影变换矩阵
//实现计算鼠标指针射线(从摄像机开始穿过鼠标指针的一条3D空间的射线)
//-------------------------------------------------------------------

 
class CCamera  
{
protected:
	BOOL		m_bTrackMode;

	float		m_Yaw,m_Pitch;	//偏位角,仰角
	float		m_Distance;		//焦点距离
	float		m_scrWidth;		
	float		m_scrHeight;
	D3DXVECTOR3	m_vPos;			

#if (D3D_SDK_VERSION & 32)	
	LPD3DXKEYFRAMEDANIMATIONSET	m_pKeyFrameInterpolator;	//Directx9C的插值
#else 
	LPD3DXKEYFRAMEINTERPOLATOR	m_pKeyFrameInterpolator;
#endif


	vector <D3DXKEY_VECTOR3>	TranslateKeys;		//偏移量的表
	vector <D3DXKEY_QUATERNION> RotationKeys;		//角度

	LPDIRECT3DDEVICE9 m_pDevice;
	//摄像机从m_vPos观察,方向为:从m_vPos水平偏角为yaw,仰角为pitch


public:
	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);
	void SetTrackMode(BOOL bTrack){m_bTrackMode=bTrack;}
	//获得观察点坐标
	void GetLookAt(D3DVECTOR *pLookAt)	
	{
		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);
	};
	//-----------------------------------------------------------------
	//根据鼠标坐标,计算射线
	//实现计算鼠标指针射线(从摄像机开始穿过鼠标指针的一条3D空间的射线)
	//-----------------------------------------------------------------
	void GetCursorRayDir(POINT ptCursor,D3DVECTOR *vPickRayDir);

	
	//移动焦点坐标(实质上是移动摄像机)
	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);
		
	
	}
	//移动摄像机
	void SetPosition(D3DXVECTOR3 *pV)
	{
		m_vPos=*pV;
	}

	void AddTransformKey(float time,const D3DXVECTOR3 &vTrans)
	{
		D3DXKEY_VECTOR3 keyV;
		keyV.Time=time;
		keyV.Value=vTrans;
		TranslateKeys.push_back(keyV); 	 
	
	}
	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 MoveRelative(float dSide,float dForward);


};

#endif // !defined(AFX_CAMERA_H)

⌨️ 快捷键说明

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