DX11(八):摄像机类

本文详细介绍了DirectX11中摄像机类的设计与实现,包括摄像机坐标轴向量、旋转角度计算、视锥体设置、视口调整,以及第一人称视角和第三人称视角的操作,如直行、Pitch绕x轴旋转和RotateY绕y轴旋转等。
摘要由CSDN通过智能技术生成

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(&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值