当在某一地点固定摄像机方位
时,利用D3DXMatrixLookAtLH函数计算出取景变换矩阵
是很有用的;但其对于一个可以自由活动的摄像机
来说是不能满足要求的,这就需要我们自己来设计一个灵活的Camera类
我们通过实现Camera类来更好的控制摄像机
1、Camera类的设计
我们使用如下向量
来定义摄像机相对于世界坐标系的位置和朝向
:
- 1、右向量(
right vector
): - 2、上向量(
up vector
): - 3、观察向量(
look vector
): - 4、位置向量(
position vector
):
上述这四个向量实质上为相对世界坐标系描述的摄像机
定义了一个局部坐标系
由于right vector、up vector、look vector
定义了摄像机在世界坐标系中的朝向
,所以我们将这三个向量称为方向向量(orientation vector)
方向向量必须是标准正交(orthonormal)
的,引入这些约束是有原因的(为了更容易的求旋转矩阵)
如果一个向量集
中的向量都彼此正交
,且模均为1
,则称该向量是标准正交的
如果一个矩阵的行向量
是标准正交的,那么该矩阵是标准正交矩阵
。标准正交矩阵的一个重要性质是其逆矩阵与其转置矩阵相等
如果使用上述向量来描述摄像机,那么我们可对摄像机实施如下6种变换
:
- 1、绕
right vector
的旋转:俯仰(pitch)
- 2、绕
up vector
的旋转:偏航(yaw)
- 3、绕
look vector
的旋转:滚动(roll)
- 4、沿
right vector
的平动:扫视(strafe)
- 5、沿
up vector
的平动:升降(fly)
- 6、沿
look vector
的平动:移动(walk)
这样的摄像机具有6个自由度(degrees of freedom)
可以通过CameraType枚举类型
来选择不同的摄像机模型:
- 1、
LANDOBJECT
:一旦指定了,会自动满足相关的约束 - 2、
AIRCRAFT
:
2、实现细节
2.1、取景变换矩阵(View Matrix
)的计算
给人的感觉就是,键盘控制的是整个场景的移动而不是摄像机的移动,因为摄像机的局部坐标系一直与世界坐标系相同
取景变换所解决的问题
其实就是世界坐标系中的物体在以摄像机为中心的坐标系中如何进行描述;等价于将世界坐标系中的物体随摄像机一起进行变换,以使摄像机坐标系与世界坐标系完全重合(不是很理解
)
计算取景变换矩阵分为两步:
- 1、将摄像机平移到世界坐标系的原点(
平移
) - 2、然后通过旋转变换使摄像机各向量与世界坐标系对应各轴重合(
旋转
)
详细的数学推导和代码实现
p198
2.2、绕任意轴的旋转
在D3DX库
中提供了相应的函数来计算对应的旋转矩阵
2.3、俯仰、偏航和滚动
由于方向向量
描述了摄像机在世界坐标系中的朝向,所以当摄像机发生俯仰、偏航或滚动
时,我们必须指定方向向量应如何更新
要十分注意LANDOBJECT类型摄像机的这三种变换
2.4、行走、扫视和升降
同时也要十分注意LANDOBJECT类型摄像机的这三种变换
对于LANDOBJECT类型的摄像机
有很多需要注意的细节
3、例程
建议:摄像机的移动是根据时间变化(timeDelta)
来进行的,这样我们就不依赖于帧频
,以稳定的速度移动摄像机