3d变换


上述语句表示了 object space 的两层核心含义:其一, object space coordinate
就是模型文件中的顶点值,这些值是在模型建模时得到的,例如,用 3DMAX 建
立一个球体模型并导出为.max 文件,这个文件中包含的数据就是 object space coordinate;其二, object space coordinate 与其他物体没有任何参照关系,注意,
这个概念非常重要,它是将 object space coordinate 和 world space coordinate 区分
开来的关键。无论在现实世界,还是在计算机的虚拟空间中,物体都必须和一个
固定的坐标原点进行参照才能确定自己所在的位置,这是 world space coordinate
的实际意义所在。
毫无疑问,我们将一个模型导入计算机后,就应该给它一个相对于坐标原点
24
的位置,那么这个位置就是 world space coordinate,从 object space coordinate 到 world space coordinate 的变换过程由一个四阶矩阵控制,通常称之为 world matrix。
光照计算通常是在 world coordinate space(世界坐标空间)中进行的,这也
符合人类的生活常识。当然,也可以在 eye coordinate space 中得到相同的光照效
果,因为,在同一观察空间中物体之间的相对关系是保存不变的。
需要高度注意的是:顶点法向量在模型文件中属于 object space,在 GPU 的
顶点程序中必须将法向量转换到 world space 中才能使用,如同必须将顶点坐标
从 object space 转换到 world space 中一样,但两者的转换矩阵是不同的,准确的
说,法向量从 object space 到 world space 的转换矩阵是 world matrix 的转置矩阵
的逆矩阵(许多人在顶点程序中会将两者的转换矩阵当作同一个,结果会出现难
以查找的错误)。(参阅潘李亮的 3D 变换中法向量变换矩阵的推导一文)
可以阅读电子工业出版社的《计算机图形学(第二版)》第 11 章,进一步了
解三维顶点变换具体的计算方法,如果对矩阵运算感到陌生,则有必要复习一下
线性代数。
2.1.2 从 world space 到 eye space
每个人都是从各自的视点出发观察这个世界,无论是主观世界还是客观世
界。同样,在计算机中每次只能从唯一的视角出发渲染物体。在游戏中,都会提
供视点漫游的功能,屏幕显示的内容随着视点的变化而变化。这是因为 GPU 将
物体顶点坐标从 world space 转换到了 eye space。
所谓 eye space,即以 camera(视点或相机)为原点,由视线方向、视角和
远近平面,共同组成一个梯形体的三维空间,称之为 viewing frustum(视锥),
如图 4 所示。近平面,是梯形体较小的矩形面,作为投影平面,远平面是梯形体
较大的矩形,在这个梯形体中的所有顶点数据是可见的,而超出这个梯形体之外
的场景数据,会被视点去除( Frustum Culling,也称之为视锥裁剪)。
25
图 4 视锥体
2.1.3 从 eye space 到 project and clip space Once positions are in eye space, the next step is to determine what positions are actually viewable in the image you eventually intend trend.【 3】
即:一旦顶点坐标被转换到 eye space 中,就需要判断哪些点是视点可见的。
位于 viewing frustum 梯形体以内的顶点,被认定为可见,而超出这个梯形体之外
的场景数据,会被视点去除( Frustum Culling,也称之为视锥裁剪)。这一步通常
称之为“clip(裁剪) ”,识别指定区域内或区域外的图形部分的过程称之为裁剪
算法。
很多人在理解该步骤时存在一个混乱,即“不清楚裁减与投影的关系和两者
发生的先后顺序”,不少人觉得是“先裁减再投影”,不过事实并非如此。因为在
不规则的体( viewing frustum)中进行裁剪并非易事,所以经过图形学前辈们的
精心分析,裁剪被安排到一个单位立方体中进行,该立方体的对角顶点分别是 (-1,-1,-1)和(1,1,1),通常称这个单位立方体为规范立方体( Canonical view volume, CVV)(实时计算机图形学第 9 页)。 CVV 的近平面(梯形体较小的矩形面)的 X、 Y 坐标对应屏幕像素坐标(左下角是 0、 0), Z 坐标则是代表画面像素深度。
多边形裁剪就是 CVV 中完成的。所以,从视点坐标空间到屏幕坐标空间
( screen coordinate space)事实上是由三步组成:
26 1. 用透视变换矩阵把顶点从视锥体中变换到裁剪空间的 CVV 中; 2. 在 CVV 进行图元裁剪; 3. 屏幕映射:将经过前述过程得到的坐标映射到屏幕坐标系上。
在这里,我们尤其要注意第一个步骤,即把顶点从 viewing frustum 变换到 CVV 中,这个过程才是我们常说或者听说的“投影”。主要的投影方法有两种:
正投影(也称平行投影)和透视投影。由于投影投影更加符合人类的视觉习惯,
所以在附录中会详细讲解透视投影矩阵的推导过程, 有兴趣的朋友可以查阅潘宏
(网名 Twinsen)的“透视投影变换推导

猜你喜欢

转载自blog.csdn.net/fanhenghui/article/details/82152385