设计一个灵活的Camera类设计

本文探讨了如何设计一个灵活的Camera类,用于3D游戏或模拟环境中。介绍了观察矩阵的计算,包括摄像机的6种变换:绕任意轴旋转、俯仰、偏航、滚动、扫视和升降。还详细阐述了如何确保向量的标准正交性,以实现准确的变换,并讨论了特定类型的摄像机(如LANDOBJECT)在约束条件下的运动规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

D3DXMatrixLookAtLH函数可计算出观察矩阵(取景变换矩阵),当在某一固定点固定摄像机方位时,该函数十分有用,但其用户接口对于一个能够根据用户输入做出响应移动的摄像机来说,就会力不从心。我们可以实现一个Camera类以使我们能够较D3DXMatrixLookAtLH函数对摄像机更好的控制,该类特别适合于飞行模拟器、第一人称视角游戏。

摄像机的4个向量:右向量、上向量、观察向量、位置向量

通过这些向量来定义摄像机相对于世界坐标系的位置和朝向,前3个向量统称为方向向量,方向向量必须是标准正交的(如果一个向量集中的向量都彼此正交,且模为1,则称该向量是标准正交的)。引入这个约束的原因是后面需要将这些向量插入到一个矩阵的某些行中,以使该矩阵成为标准正交矩阵(如果一个矩阵的行向量是标准正交的),标准正交矩阵的一个重要性质是其逆矩阵与其转置矩阵相等

摄像机的6中变换运算
  • 绕向量right的旋转(俯仰,pitch)
  • 绕向量up的旋转(偏航,yaw)
  • 绕向量look的旋转(滚动,roll)
  • 沿向量right方向的扫视(strafe)
  • 沿向量up方向的升降(fly)
  • 沿向量look的平动
//灵活camera
class Camera
{
public:
	enum CameraType
	{
		LANDOBJECT,		//摄像机沿某些特定轴进行移动
		AIRCRAFT		//摄像机自由移动
	};
	Camera();
	Camera(CameraType cameraType);
	~Camera() {};

	void Strafe(float units);
	void Fly(float units);
	void Walk(float units);
	void Pitch(float angle);
	void Yaw(float angle);
	void Roll(float angle);

	void GetViewMatrix(D3DXMATRIX* v);
	void SetCameraType(CameraType cameraType);
	void GetPosition(D3DXVECTOR3& pos);
	void SetPosition(D3DXVECTOR3& pos);
	void GetRight(D3DXVECTOR3& right);
	void GetUp(D3DXVECTOR3& up);
	void GetLook(D3DXVECTOR3& look);
private:
	CameraType m_cameraType;
	D3DXVECTOR3 m_right;
	D3DXVECTOR3 m_up;
	D3DXVECTOR3 m_look;
	D3DXVECTOR3 m_pos;
};
观察矩阵(取景变换)的计算

position向量:p=(p_{x},p_{y},p_{z})
right向量:r=(r_{x},r_{y},r_{z})
up向量:u=(u_{x},u_{y},u_{z})
look向量:d=(d_{x},d_{y},d_{z})

取景变换所解决的问题其实就是世界坐标系中的物体在以摄像机为中心的坐标系中如果进行描述,等价于将世界坐标系中的物体随摄像机一起进行变换,以使摄像机坐标系与世界坐标系完全重合。所以希望变换矩阵V能够实现:

  • pV=(0,0,0) 矩阵V将摄像机移至世界坐标系原点
  • rV=(1,0,0) 矩阵V将摄像机的right向量与世界坐标系的x轴重合
  • uV=(0,1,0) 矩阵V将摄像机的up向量与世界坐标系的y轴重合
  • dV=(0,0,1) 矩阵v将摄像机的look向量与世界坐标系的z轴重合

1.平移

T=\begin{bmatrix} 1 & 0 & 0 & 0\\ 0& 1 &0 &0 \\ 0& 0 & 1 &0 \\ -p_{x}& -p_{y} & -p_{z} &1 \end{bmatrix}

2.旋转,我们需要一个3x3的旋转矩阵A以使3个向量与世界坐标系的x,y,z轴重合,该矩阵需要满足以下方程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值