OpenGL教程翻译 第十三课 相机空间
原文地址:http://ogldev.atspace.co.uk/(源码请从原文主页下载)
Background
在上几节中我们看见两种类型的顶点变换。第一种类型的变换是改变对象的位置(平移),旋转,尺寸(放缩)。这些变换允许我们在3D世界中把一个对象放在任何位置。第二种类型的变换是透视投影变换,把在3D世界坐标系下的顶点位置投影到2D世界坐标系下(比如一架飞机)。一旦坐标变换为2D坐标,那么非常容易将这些2D坐标映射到屏幕空间坐标。这些坐标实际上被用来光栅化组成对象的图元(可能是点、线或者三角形)。
在之前的所有章节中我们还没接触过相机,我们隐含假定相机位于3D空间的原点。事实上,我们希望能够自由的控制相机,可以把它放在3D世界的任何位置,并投影顶点到在相机正前方的2D平面。这将能够反映出相机和屏幕上的对象之间的正确的关系。
在下面这幅图片中,我们看见相机背对我们置于某处。在相机前面有一个虚拟的2D平面,球被投影到该平面上。相机是倾斜着的,所以平面也是倾斜着的。由于相机视角的限制,此 2D平面能看见的部分只是一个矩形。在该矩形的外部所有东西都将被减掉。把这个矩形渲染到屏幕是我们的目标。
理论上可以生成这样的变化矩阵,实现把一个位于3D空间的对象投影到坐落在世界坐标系任意位置的相机正前方的2D平面上。然而,这其中的数学变换比我们之前遇见的要复杂很多。而当相机被置于3D世界坐标系的源点并且方向沿着Z轴时的投影就简单了很多。比如,一个对象放在(0,0,5)处,同时相机放在(0,0,1)处并且方向朝向Z轴。如果我们把相机和对象朝着原点移动一个单位,那时两者的相对距离和方向(就相机的方向而言)保持不变,而区别只是相机此时位于原点。以同种方式移动场景中的所有物体使得我们能够正确渲染场,用之前学到的方法。
上面的例子很简单,因为相机的方向已经