摄像机
游戏中的相机可以理解为与现实中的相机类似,可以捕获对应的游戏画面。Camera在游戏引擎中一般也会展示为现实中相机的模型,使用时有两种实现方式,一种以组件形式挂载在Character上,一种则是单独存在。通常来讲,我们会对相机主体的位置和角度进行操作,以达到不同的设计目的。在本节中,我们来实现OpenGL中相机的创建。
一、观察空间(view space)
当我们讨论摄像机/观察空间(Camera/View Space)的时候,是在讨论以摄像机的视角作为场景原点时场景中所有的顶点坐标:观察矩阵把所有的世界坐标变换为相对于摄像机位置与方向的观察坐标,直观理解就是观察矩阵将摄像机移动到原点,并且把摄像机的坐标轴和世界坐标的坐标轴重合。
如何定义一个摄像机?需要定义下面的三个属性:
- 相机(眼睛)的位置(eye position) e
- 观察方向(gaze direction)g
- 视点正上方的方向(view-up vector)t
有了上面呢三个属性,我们便可以构建相机坐标系了:
首先先得到相机坐标系的 w 轴,对应标准坐标系下的 z 轴:
w=−g∣∣g∣∣\pmb{w} = {-\pmb{g}\over\pmb{||g||}}w=∣∣g∣∣−g
然后通过向量 t 和 w 计算得到水平轴 u
u=t×w∣∣t×w∣∣\pmb{u} = \frac{\pmb{t \times w}}{||\pmb{t \times w}||}u=∣∣t×w∣∣t×w
最后将 w 和 u 叉乘得到坐标系的竖直分量 v
v=w×u∣∣w×u∣∣\pmb{v} = \frac{\pmb{w \times u}}{||\pmb{w \times u}||}v=∣∣w×u∣∣w×u
这里不直接用 t 当作摄像机坐标系的竖直分量,我的理解是实际计算过程中,我们一般并不知道相机的正上方向量,一般都是先通过世界坐标系下的正上方向量(0, 1, 0)先计算得到水平向量,再叉乘得到竖直向量的。

本文介绍了如何在OpenGL中创建和操作摄像机,包括定义摄像机的位置、观察方向和视点正上方的方向,构建观察矩阵,以及通过键盘和鼠标输入来控制相机的移动和视角旋转。此外,还提到了时间步长(DeltaTime)在确保不同系统上相机移动速度一致的作用,以及欧拉角在处理视角旋转中的应用。
1084

被折叠的 条评论
为什么被折叠?



