在前面绘制几何图形的时候,大家是否觉得我们绘图的范围太狭隘了呢?坐标
只能从-1 到 1,还只能是 X 轴向右,Y 轴向上,Z 轴垂直屏幕。这些限制给我
们的绘图带来了很多不便。
我们生活在一个三维的世界——如果要观察一个物体,我们可以:
1、从不同的位置去观察它。(视图变换)
2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放
大或缩小它。(模型变换)
3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。
另外,我们可能只希望看到物体的一部分,而不是全部(剪裁)。(投影变换)
4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不
是全部。(视口变换)
这些,都可以在 OpenGL 中实现。
OpenGL 变换实际上是通过矩阵乘法来实现。无论是移动、旋转还是缩放大小,
都是通过在当前矩阵的基础上乘以一个新的矩阵来达到目的。关于矩阵的知识,
这里不详细介绍,有兴趣的朋友可以看看线性代数(大学生的话多半应该学过
的)。
OpenGL 可以在最底层直接操作矩阵,不过作为初学,这样做的意义并不大。
这里就不做介绍了。
1、模型变换和视图变换
从“相对移动”的观点来看,改变观察点的位置与方向和改变物体本身的位置与
方向具有等效性。在 OpenGL 中,实现这两种功能甚至使用的是同样的函数。
由于模型和视图的变换都通过矩阵运算来实现,在进行变换前,应先设置当前
操作的矩阵为“模型视图矩阵”。设置的方法是以 GL_MODELVIEW 为参数调用
glMatrixMode 函数,像这样:
glMatrixMode(GL_MODELVIEW);
通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。这也只需要一行代
码:
glLoadIdentity();
然后,就可以进行模型变换和视图变换了。进行模型和视图变换,主要涉及到
三个函数:
glTranslate*,把当前矩阵和一个表示移动物体的矩阵相乘。三个参数分别表
示了在三个坐标上的位移值。
glRotate*,把当前矩阵和一个表示旋转物体的矩阵相乘。物体将绕着(0,0,0)
到(x,y,z)的直线以逆时针旋转,参数 angle 表示旋转的角度。
glScale*,把当前矩阵和一个表示缩放物体的矩阵相乘。x,y,z 分别表示在该
方向上的缩放比例。
注意我都是说“与 XX 相乘”,而不是直接说“这个函数就是旋转”或者“这个函数就