理解变换
1 OpenGL变换术语总结
变换 | 用途 |
---|---|
视图(Viewing) | 指定观察者或照相机的位置 |
模型(Modeling) | 在场景中移动物体 |
模型视图(Modelview) | 描述视图和模型变换的对偶性 |
投影(Projection) | 改变可视区域的大小或重新设置它的形状 |
视口(Viewport) | 这是一种伪变换,只是对窗口上的最终输出进行缩放 |
2 视觉坐标
用 OpenGl 在3D空间中进行绘图时,所使用的是笛卡尔坐标系统。
3 视图变换
用于确定场景的拍摄点 ,是场景所应用的第一个变换1。视图变换允许把观察点放在自己所希望的任何位置,并允许在任何方向上观察场景。确定视图变换就像在场景中放置照相机并让它指向某个方向。
在默认情况下,在透视投影中,观察者是从原点向z轴的负方向看过去(垂直“穿入”监视器屏幕)。这个观察点相对于视觉坐标系统进行移动,以提供一个特定的拍摄点。当观察者位于原点时,场景中所绘制的z值为正的物体就位于观察者的后面。
4 模型变换
用于对模型以及模型内部的特定物体进行操纵 。它可以移动物体,对它们进行旋转,或者对它们进行缩放。
5 模型视图对偶性
事实上,根据视图和模型变换的内部结果以及它们对场景的最终外观所产生的效果,它们实际上是一样的。模型视图这个术语表示我们既可以把这个变换看成是模型变换,也可以把它看成是视图变换,它们之间并不存在区别。因此,我们可以将其统称为模型视图变换。
因此,视图变换并没有特别之处,从本质上说,它只是在绘制物体之前应用到一个虚拟物体(观察者之上的一种模型变换)。读者很快就会看到,在场景中放置更多的物体时,需要不断指定新的变换。按照约定,最初进行的变换作为参照,其他所有变换均以它为基础。
6 投影变换
投影变换是在模型视图变换之后应用于物体的顶点之上的。这种投影实际上定义了可视区域,并建立了裁剪平面。裁剪平面是3D空间的平面方程式,OpenGL用它来确定几何图形能否被观察者所看到。更为具体的说,投影变换指定了一个完成的场景(在所有的模型变换都已完成之后)投影到屏幕上的最终图像。
- 正投影
在正投影(或平行投影)中,屏幕上所绘制的所有多边形都按照指定的相对大小出现。直线和多边形使用平行线直接映射到2D屏幕上。这意味着不管物体有多远,都仍然按照相同的大小进行绘制,平面地出现在屏幕上。
- 透视投影
透视投影所显示的场景更接近真实。其标志性特点就是透视缩短(foreshortening),它会使远处物体看上去比相同大小的近处物体小一些。
7 视口变换
当上面这些操作全部完成之后,最终所获得的是场景的二维投影,将被映射到屏幕上的某个窗口。这种到物理窗口坐标的映射是最后一个完成的变换,称为视口变换。通常,颜色缓冲区和窗口像素之间存在一对一的对应关系,但并非严格如此。在有些情况下,视口变换要把一种“规范化”的设备坐标重新映射到窗口坐标。幸运的是,我们不必操心这方面的细节。
Footnotes:
1 作为总体原则, 在进行任何其他变换之前必须先指定视图变换 。原因是视图变换的效果相当于根据视觉坐标系统移动当前所使用的坐标系统。然后,根据最新修改的坐标系统进行其他所有的后续变换。