📄 game_camera.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 + -