06/10/2020
摄像机继承
摄像机
摄像机相当于游戏世界中的一个物体,所以它拥有Transform类,针对旋转属性我们可以得到视图矩阵,设置视锥体我们可以获得透视投影矩阵,同时摄像机还需要获得视口信息
//纯抽象基类
class Camera
{
public:
Camera() = default;
virtual ~Camera() = 0;
//
// 获取摄像机位置
//
DirectX::XMVECTOR GetPositionXM() const;
DirectX::XMFLOAT3 GetPosition() const;
//
// 获取摄像机旋转
//
// 获取绕X轴旋转的欧拉角弧度
float GetRotationX() const;
// 获取绕Y轴旋转的欧拉角弧度
float GetRotationY() const;
//
// 获取摄像机的坐标轴向量,即基向量
//
DirectX::XMVECTOR GetRightAxisXM() const;
DirectX::XMFLOAT3 GetRightAxis() const;
DirectX::XMVECTOR GetUpAxisXM() const;
DirectX::XMFLOAT3 GetUpAxis() const;
DirectX::XMVECTOR GetLookAxisXM() const;
DirectX::XMFLOAT3 GetLookAxis() const;
//获取视图矩阵和投影与矩阵
DirectX::XMMATRIX getViewXM();
DirectX::XMMATRIX getProjXM();
DirectX::XMMATRIX getViewProjXM();
//设置视锥体
void setFrustum(float angleY,float aspect,float nearZ, float farZ);
//获取视口
D3D11_VIEWPORT getViewPort();
//设置视口
void setViewPort(const D3D11_VIEWPORT & viewPort);
void setViewPort(float topLeftX,float topLeftY,float width,float height,float minDepth=0.0f,float maxDepth = 0.0f);
private:
Transform mTransform = {};
float mAngleY;
float mAspect;
float mNearZ;
float mFarZ;
D3D11_VIEWPORT mViewPort = {};
};
分析摄像机类
摄像机坐标轴向量
观察空间是局部空间,也是附属于摄像机的坐标系。此空间中,摄像机位于坐标系原点,x轴是摄像机的右侧,y轴是摄像机的正上方
- 朝向与角度有关系,Transform类中保存了每一个物体的位置,朝向和缩放比例信息
DirectX::XMVECTOR GetRightAxisXM() const;
DirectX::XMFLOAT3 GetRightAxis() const;
DirectX::XMVECTOR GetUpAxisXM() const;
DirectX::XMFLOAT3 GetUpAxis() const;
DirectX::XMVECTOR GetLookAxisXM() const;
DirectX::XMFLOAT3 GetLookAxis() const;
DirectX::XMFLOAT3 m_Rotation = {
}; // 旋转欧拉角(弧度制)
- 由于使用欧拉角弧度表示法,所以需要转换欧拉角到矩阵
- 在世界空间中,right是摄像机的右侧,即旋转矩阵的第一排,up是摄像机的正上方,即旋转矩阵的第二排,forword是摄像机的前面,即旋转矩阵的第三排
- XMFLOAT3和XMVector:XMFLOAT3通常用来存储数据,XMVECTOR集合了许多向量运算,所以它们之间可以相互转换
//即旋转矩阵的第一排,表示x轴在右侧
DirectX::XMFLOAT3 GetRightAxis() const{
XMMATRIX R = XMMatrixRotationRollPitchYawFromVector(XMLoadFloat3(&m_Rotation));
XMFLOAT3 right;
XMStoreFloat3(&