OpenGL相机学习

194 篇文章 40 订阅

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的视点矩阵由**MTMR**相乘得到:
在这里插入图片描述

Rotation

相机的其他旋转类型为pitch(俯仰角),yaw(偏航角)和roll(滚转角)。Pitch为上下绕相机的左轴(X轴)转,Yaw为左右绕相机的上轴(Y轴),Roll为绕相机前轴(Z轴)旋转。

Pitch为上下绕相机的左轴(X轴)转,Yaw为左右绕相机的上轴(Y轴),Roll为绕相机前轴(Z轴)旋转。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值