LearnOpenGL-P7 立方体三维空间坐标转换

0 上一章讲到移动旋转和缩放一个2维平面上的图像。本章将要讲的内容是如何绘制3维场景中的立方体,并让其在三维场景中做移动旋转。
(1)将2维矩形图像通过MVP转换矩阵转成3维空间中的矩形图片。
(2)在三维空间中绘制一个立方体,并让其在三维空间中进行旋转。
(3)在三维空间中绘制多个立方体,并将其摆放到不同的位置,以不同的速率进行自转。

1.0 坐标系统的转换流程如下图:
(1)定义对象基于局部坐标系上的坐标位置向量。
(2)将对象局部坐标系上的坐标位置向量乘以“模型转换矩阵“得到对象在世界坐标系上的位置向量。
(3)确定好相机的位置,将“观察矩阵“乘以对象世界坐标系的坐标向量得到对象在相机观察空间上的位置向量。
(4)选择正射或透视的投影方法,将“投影矩阵”乘以相机观察空间中的位置向量得到裁剪空间中的位置向量。
(5)最后通过“视口变换”,将坐标向量转换到屏幕空间中进行输出。

1.1 在顶点着色器中设置三个矩阵变量分别表示模型矩阵、观察矩阵和投影矩阵。最后的点坐标向量输出为MVP和局部坐标系点坐标向量相乘的结果。(要注意矩阵的运算先后顺序)。

1.2 在main()的渲染循环中,设置模型矩阵。让模型在局部坐标上绕x轴顺时针旋转55°。

1.3 设置摆好摄像机的位置(设置观察矩阵),让图像在世界坐标系的z轴负方向移动3个单位(相当于把摄像机放在了世界坐标系z轴正方向3个单位的位置处)。

1.4 创建投影矩阵(可选择透视投影或正射投影)。

1.5 将我们设置好的mvp矩阵数据传入着色器程序中。编译运行程序,可得到图像。



2 在三维空间中绘制一个立方体,并让其在三维空间中进行旋转。
2.0 设置立方体6个面36个角点的局部坐标位置以及纹理坐标位置。并解释vertices中的顶点数据,对应顶点着色器。


2.1 将图元绘制方式改为glDrawArrays(),由于没有重复利用顶点数据,所以暂时不按ebo的顶点索引规则绘制三角形。

2.2 设置好着色器源码,暂时不需要传入颜色变量。


2.3 编译运行程序,可得到一个立方体。(此时立方体在z轴方向上图像的前后关系是错误的)

2.4 在渲染循环中,将模型矩阵中的旋转角度改为随时间变化的动态转动。编译运行程序后可得到一个动态旋转的但是前后关系错误的立方体。


2.5 打开Opengl的深度测试开关,并在每次的渲染循环的起始处清空深度缓冲。编译运行程序即可得到一个前后关系正确的旋转的立方体。



2.6 我们还可以修改模型矩阵中旋转轴的信息,让立方体绕着不同的方向进行旋转。



3 在三维空间中绘制多个立方体,并将其摆放到不同的位置,以不同的速率进行自转。
3.0 设定10个立方体在世界坐标中的移动位置向量数组。

3.1 在渲染循环中,生成投影矩阵和观察矩阵。并分别将其传入着色器程序中。

3.2 绑定VAO对象,并循环绘制10个立方体。在每次循环中,我们先让立方体旋转,再根据cubePositions数组中的向量分别将10个立方体移动至指定的位置。编译运行程序,可得到10个不同位置的立方体以不同的速率自转的场景。



