观测变换
概念
观测变换,Viewing transformation
分类
视图变换 View/Camera transformation
我们可以用照相机的原理来阐释3D图形的绘制过程,在摄影时,大致可分为如下几个步骤:
- 摆放好待拍摄的物品,或者人物。(模型变换)
这个时候物品或者人物就是在世界坐标系里,就是在一个公认的坐标系中,目的是保证待拍摄的物体和照相机在同一个坐标系。
- 调整好拍摄角度。(视图变换)
这时候的坐标就是camera coordinate system(VC),这个过程是调整Camera到合适的位置以便拍摄,在3D程序中,也就是设置View Matrix了。
- 调整焦距。(投影变换)
- 拍摄。
视图变换就是在世界坐标系中摆放Camera的过程,摆放步骤:
- 首先,确定相机摆放的位置
- 相机往哪个方向看(前后旋转360度)
- 确定一个向上的方向(相机顶部的朝向,因为相机可以向左,右旋转会影响最终结果)
在拍摄中,如果相机和拍摄物体的相对位置不变,则同时移动相机和拍摄物体,照出来的照片结果是一样的。
由此可以得出一个结论,如果相机和拍摄物体的相对位置不变,那么无论是移动物体或是移动相机,都可以得到相同的结果。
因此,可以固定相机的位置,所有移动都是物体在移动,同时规定
相机位置永远处于原点处,相机永远往-Z方向看,y轴为向上方向
为什么进行视图转换?
在世界坐标系中,camera的位置不一定在原点上,并且观察方向不一定指向Z轴负方向,对于投影变换及其他的一些操作来说,如果不满足这两个条件,后续的的操作就会变得非常低效,所以为了提高效率,我们需要进行view transform。
使得相机的位置位于世界坐标系的原点处,相机永远往-Z方向看,y轴为向上方向。
视图变换过程
- 移动camera,使其位于world space的坐标原点
- 旋转camera,使其朝向z轴正方向,也就是视线由原点指向z轴正方向。
这两个过程,前一个实际上是平移,后一个实际上是旋转。你可以想象成Camera也有三个坐标轴x,y,z,视图变换的过程就是将Camera的坐标轴与世界坐标系的坐标轴对齐的过程。
注意:view transform 中,所有位于 world space 中的 models 都随着 camera 一起变换,所以视野并未发生变化。
整个视图变换所需的视图变换矩阵 Mview 如下:
投影变换Projection transformation
视图变换是为了投影变换做准备
投影变换是将三维空间中的顶点坐标映射至二维空间坐标。它
分为正交投影和透视投影,两者的本质区别在于是否有“近大远小”这一性质。正交投影不会带来“近大远小”的现象,透视投影会。
正交投影 Orthographic projection
在图形学中的一般做法为:
将空间中任意给定的一个长方体平移缩放成一个正则,规范的立方体
其变换矩阵为:
透视投影 Perspective projection
应用最广泛的一种投影。透视投影就是最类似人眼所看东西的方式,遵循近大远小,如果说正交投影都是水平光线,那么透视投影则显然不是了。
先回顾一下齐次坐标的性质
透视转换的做法:
透视投影与正交投影的区别在于远平面要比近平面大一些。
- 首先将远平面压缩至与近平面相同大小(将一个棱台变成一个长方体)
- 通过正交投影将远平面投影到近平面
在压缩的过程中,有以下规定:
- 远平面压缩前后z值不变
- 远平面的中点位置不会发生变化
- 近平面中的任意点在压缩前后都不会变
第二步正交投影矩阵已经求出,所以重点在于第一步,如何压缩?
如下图所示,若远平面上的点(x,y,z)投影到近平面中坐标为(x’,y’,z’)。则点(x,y,z)经过压缩后,y值与y’是一致的(同理x与x’一致,z与z’一致)。
假设点(x,y,z)压缩后,坐标变成(x1,y1,z1)。则x1 = (n/z)*x;y1 = (n/z)*y,z不确定。用矩阵表示,即
我们希望找到一个变换矩阵,能够完成如下变换
即
(如果形象化的描述一下的话,就是利用这个变换矩阵将整个空间压缩了一下,使其对应了真正透视投影的坐标,最后不要忘了要利用正交转换到 [-1,1]^3 的空间之内)
首先,这个矩阵的前两行和最后一行是能很快确定出来的,
第三行需要借助透视投影中的两个规定: - 远平面压缩前后z值不变
- 近平面中的任意点在压缩前后都不会变
解方程可得:
最终的变换矩阵为: