欢迎光临散文网 会员登陆 & 注册

相机

2023-08-14 18:35 作者:追逐彗星的尾巴  | 我要投稿

观察坐标就是以相机的视角作为场景原点时场景中所有的顶点坐标。创建一个相机其实就是创建一个观察矩阵。

要创建一个相机,我们需要它在世界空间中的位置、观察的方向、一个指向它右侧的向量以及一个指向它上方的向量。

位置

位置就是一个指向摄像机位置的向量。我们依然把相机放在场景中稍向后退的地方:

观察方向

我们把观察方向定义为由物体指向相机的方向,这里我们选择原点为观察物体:

函数glm::normalize()用于将一个向量归一化,即将其长度缩放为1,但保持其方向不变。归一化一个向量可以使它在计算中更易处理,同时还可以用于表示方向。

右方向量

为了获得相机的右方,即空间的x轴正方向,我们使用一个竖直向上的向量与观察方向进行叉乘:

叉乘的顺序不能颠倒。

上方向量

为了获得相机的上方,即空间的y轴正方向,我们使用观察方向与右方向量进行叉乘:

观察矩阵

当我们拥有了相机的几个要素后,就可以通过函数glm::lookAt()来创建一个观察矩阵。

glm::lookAt()的三个参数分别是相机位置,目标物体位置和一个竖直向上的向量。

相机的移动

为了实现相机的移动,我们再需要定义一个移动向量:

现在观察矩阵为:

第二个参数目标物体的位置变为了相机位置加上移动向量。这样能保证无论怎么移动,相机都会看着目标方向。

我们创建一个函数,实现使用WASD按键控制相机的移动的功能:

向前或向后移动,就把相机位置加上或减去移动向量。向左右移动,就使用叉乘来创建一个右向量,并沿着它相应移动。

相机的转动

为了实现相机的转动,我们需要通过欧拉角来计算方向向量:

  1. 计算鼠标距上一帧的偏移量。

  2. 把偏移量添加到摄像机的俯仰角和偏航角中。

  3. 对偏航角和俯仰角进行最大和最小值的限制。

  4. 计算方向向量。

我们必须先储存上一帧的鼠标位置,我们把它的初始值设置为屏幕的中心:

接着初始化欧拉角:

当偏航角为0时,方向指向X轴正方向,所以我们把它初始化为-90。

创建一个回调函数,在回调函数中实现上面的四个步骤:

接着使用函数glfwSetCursorPosCallback()接收这个回调函数,它会在每次鼠标光标位置发生变化时被调用。

缩放

我们要使用鼠标滚轮进行缩放。缩放,实际上就是调整视野的大小,即改变fov

同样,需要创建一个回调函数。

offsetY表示鼠标滚轮在垂直方向上的偏移量。这里fov是一个初始值为为45.0的全局变量。

我们一般把fov限制在1.0到45.0之间。

同时要更新透视投影矩阵


相机的评论 (共 条)

分享到微博请遵守国家法律