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