OpenGL超级宝典(第7版)笔记17 位移、旋转、缩放、观察、透视矩阵 实现3维观察移动
文章目录
前言
我们上次介绍了坐标系,向量,矩阵,介绍了他们的一些基础计算。我们下面开始就要开始逐渐涉及这些计算来实现3D效果,我们接下来会介绍物体的变换矩阵(缩放,旋转,位移),介绍透视矩阵、观察矩阵。如果篇幅允许,我们将在代码上进行实现,最终实现一个空间中的三角形面片(我们可以自由移动视角观察这个三角形)
我们把一个对象坐标系下的模型(这里为长方体)变到我们看到的图像,需要以上一些步骤(这些步骤的顺序不要变换)。
1,模型在对象坐标系下进行缩放(为了放到世界坐标系时为正确大小)
2,进行旋转(这里图画的有点不对,这个有点点类似透视图了)
3,位移(放到世界坐标系下的正确位置,这里是把其向右移动了一点)
4,观察(之前的三步是把物品摆放到了世界坐标系下正确的位置和姿态,而这一步是根据摄像机的位置计算图像的样子,这里之前在矩阵乘法的时候提到过)
5,透视(不论之前怎么算,得到的都是正交投影,我们怎么也看不到正方体的侧面,但是增加了透视之后,由于视线在正方体的中心偏左,所以我们就可以看到侧面了)
下面是透视和正交投影的区别:
左图:在透视下红色都被黑色挡住了,而正交投影下红色露出来了。
右图:透视下红色的顶部露出来了,底部被遮挡。正交投影下红色顶部被遮挡,底部露出来了。
1 物体的变换矩阵
1.1 位移矩阵
还记得咱们之前在矩阵乘法中提到的坐标系变换吗(见上图),你会注意到这里的矩阵是33的,如果我们想实现把物体的位置进行改变仅仅通过这里的33矩阵并不能实现,我们要对其进行扩充,来看看我们怎样巧妙的对它进行改进。
我们并没有做很多复杂的计算,只是在矩阵中加了一行和一列,并对应在向量上多了一个分量(该分量如果为1,表示该坐标为一个点的坐标。如果为0,表示该坐标为一个向量的坐标。我们这里把竖着写的一列矩阵都称为向量,虽然这里它最后一个分量是1,但是我们仍叫它向量,只是叫的顺口,这并不意外着它带有方向)。
在添加了一行和一列之后,你会发现ABC的值被加到了结果的XYZ分量中去ÿ