OpenGL学习脚印: 视变换(view transformation)
Posted The fool
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL学习脚印: 视变换(view transformation)相关的知识,希望对你有一定的参考价值。
写在前面
OpenGL中的坐标处理过程包括模型变换、视变换、投影变换、视口变换等内容,这个主题的内容有些多,因此分节学习,主题将分为5节内容来学习。上一节模型变换,本节学习模型变换的下一阶段——视变换。到目前位置,主要在2D下编写程序,学习了视变换后,我们可以看到3D应用的效果了。本节示例程序均可在我的github下载。
通过本节可以了解到
- 视变换的概念
- 索引绘制立方体
- LookAt矩阵的推导(对数学不感兴趣,可以跳过)
- 相机位置随时间改变的应用程序
坐标处理的全局过程(了解,另文详述)
OpenGL中的坐标处理包括模型变换、视变换、投影变换、视口变换等内容,具体过程如下图1所示:
每一个过程处理都有其原因,这些内容计划将会在不同节里分别介绍,最后再整体把握一遍。
今天我们学习第二个阶段——视变换。
并不存在真正的相机
OpenGL成像采用的是虚拟相机模型。在场景中你通过模型变换,将物体放在场景中不同位置后,最终哪些部分需要成像,显示在屏幕上,主要由视变换和后面要介绍的投影变换、视口变换等决定。
其中视变换阶段,通过假想的相机来处理矩阵计算能够方便处理。对于OpenGL来说并不存在真正的相机,所谓的相机坐标空间(camera space 或者eye space)只是为了方便处理,而引入的坐标空间。
在现实生活中,我们通过移动相机来拍照,而在OpenGL中我们通过以相反方式调整物体,让物体以适当方式呈现出来。例如,初始时,相机镜头指向-z轴,要观察-z轴上的一个立方体的右侧面,那么有两种方式:
相机绕着+y轴,旋转+90度,此时相机镜头朝向立方体的右侧面,实现目的。注意这时立方体并没有转动。
相机不动,让立方体绕着+y轴,旋转-90度,此时也能实现同样的目的。注意这时相机没有转动。完成这一旋转的矩阵记作 Ry(−π2)
在OpenGL中,采用方式2来完成物体成像的调整。例如下面的图表示了假想的相机:
进一步说明
进一步说明这里相对的概念,对这个概念不感兴趣的可以跳过。默认时相机位于(0,0,0),指向-z轴,相当于调用了:
glm::lookAt(glm::vec(0.0f,0.0f,0.0f),
glm::vec3(0.0f, 0.0f, -1.0f),
glm::vec3(0.0f, 1.0f, 0.0f)),
得到是单位矩阵,这是相机的默认情况。
上述第一种方式,相机绕着+y轴旋转90度,相机指向-x轴,则等价于调用变为:
glm::mat4 view =glm::lookAt(glm::vec(0.0f,0.0f,0.0f),
glm::vec3(-1.0f, 0.0f, 0.0f),
glm::vec3(0.0f, 1.0f, 0.0f)),
得到的视变换矩阵为:
以上是关于OpenGL学习脚印: 视变换(view transformation)的主要内容,如果未能解决你的问题,请参考以下文章
OpenGL学习脚印: 视变换(view transformation)
OpenGL学习脚印: 坐标变换过程(vertex transformation)
翻译我的OpenGL学习进阶之旅世界(World)视图(View)和投影变换矩阵(Projection Transformation Matrices)
翻译我的OpenGL学习进阶之旅世界(World)视图(View)和投影变换矩阵(Projection Transformation Matrices)