OpenGL Camera
Overview
OpenGL既没定义照相机实体,也没定义具体的照相机变换矩阵。但OpenGL将整个场景(包括照相机)逆变换为一个固定相机在原点(0,0,0),并始终看向-z轴的空间。这个空间叫做视点空间。
OpenGL用GL_MODELVIEW
矩阵来将物体转换至世界空间和摄像机转换至眼空间。
可以将其拆分成2个矩阵逻辑相乘
每个场景中的物体首先由自身的Mmodel进行转换,然后整个场景通过Mview反转变换。
LookAt
gluLookAt()
是用于构建照相机所位于的眼睛位置(xe,ye,ze)的视点矩阵和看向(或转向)目标点(xt,yt,zt)。眼的位置和目标点是定义在世界空间的。
照相机的lookAt变换包括2个转换操作:将整个场景从眼睛位置反向平移到原点(MT),然后反向旋转场景(MR),因此照相机位于原点,朝向-Z轴。
假设照相机位于世界坐标系的(2,0,3)且看向(0,0,0),为了构建这种情况下的视点矩阵,我们需要将世界平移到(-2,0,-3)并且绕-Y轴旋转大概-33.7°。最终,照相机变为位于原点,朝向-Z轴。
lookAt的平移部分很简单,仅需将照相机的位置移动到原点,平移矩阵MT为用眼睛位置的复制替换矩阵第四列。
相比于平移,lookAt的旋转部分MR更难一些,你需要一起计算旋转矩阵的第一,第二和第三列。
首先,计算计算出旋转矩阵中的从目标位置vt到眼位置ve的标准化前向向量f。这个向量的方向为目标到眼的位置,而不是眼到目标的位置,应为实际旋转的是场景而不是相机。
其次,通过与相机向上的向量进行叉乘计算标准化左向向量l,如果向上向量未给出,可以使用(0,1,0)来表示相机=垂直于+Y轴。
最后通过前向和左向的向量进行叉乘重计算标准化向上向量u,因此三个向量是相互标准正交的(垂直且为单位长度)。
这三个基础向量l,u和f用于构建lookAt中的旋转矩阵,但是,旋转矩阵必须要反转。假设一个相机位于场景的上面,整个场景必须反向向下旋转,使得相机面向-Z轴。同样的,如果相机位于场景的左部,场景需要向右旋转,使得相机面向-Z轴。下列动图膳食了为什么旋转矩阵必须要反转
因此,lookAt的旋转部分MR是找到目标到眼位置的旋转矩阵,然后反转。而且反转后的矩阵等价于其转置矩阵,因为两者都正交——每个列都为单位长度且列间相互垂直。
最终,相机lookAt的视点矩阵由**MT和MR**相乘得到:
Rotation
相机的其他旋转类型为pitch(俯仰角),yaw(偏航角)和roll(滚转角)。Pitch为上下绕相机的左轴(X轴)转,Yaw为左右绕相机的上轴(Y轴),Roll为绕相机前轴(Z轴)旋转。
。Pitch为上下绕相机的左轴(X轴)转,Yaw为左右绕相机的上轴(Y轴),Roll为绕相机前轴(Z轴)旋转。