变换(Transform)
摘要
本文主要介绍图形学中变换(Transform)的相关知识,包括二维和三维中的各类基本变换,其中重点是三维旋转变换、相机/视角变换以及投影。
1 二维变换
1.1 缩放、反射、错切、旋转
缩放、反射、错切、旋转都属于线性变换,可以用
$$
p’=M·p
$$
的形式表示,其中M是变换矩阵。
1.1.1 缩放变换
1.1.2 反射变换
1.1.3 错切变换
1.1.4 旋转变换
1.2 平移变换
平移变换不是线性变换,因为不可以用矩阵乘法的形式表示,而是在原向量上加一个平移向量
1.3 齐次坐标
为了使得所有变换都能成为线性变换,即让所有变换都能表示成
$$
p’=M·p
$$
的形式,引入齐次坐标的概念。为二维坐标引入第三维,二维点的第三维填充1,二维向量的第三维填充0:
为什么点是1,向量是0?
因为这样的规定符合点和向量的运算关系:
点 - 点 = 向量
向量 +(-) 向量 = 向量
点 + 点 = 点(两点之和在齐次坐标中是二者中点,因为齐次坐标中规定,$(x,y,z,1)$和$(kx,ky,kz,k)$表示的是同一个点。)
更重要的原因是这样满足点和矢量的变换性质,位移变换对于矢量来说没有作用,因为矢量只指示方向,与起点位置无关。这会在下面看到,按照齐次坐标表示的位移矩阵可以对点进行有效位移,而对矢量无作用。
由此,平移变换也可以表示为:
于是对于二维空间的任意变换,使用齐次坐标都可以进行表示:
对于任何线性变换+平移的组合,称为仿射变换
仿射变换在齐次坐标下的通用形式就可以表示为:
1.4 逆变换
一个变换矩阵的逆矩阵就是这个变换的逆变换。
1.5 组合变换
组合变换按顺序将每一步变换矩阵施加于原来的点或向量即可,但变换顺序不能随意交换,因为矩阵乘法不满足交换律。
2 三维变换
2.1 三维齐次坐标
二维齐次坐标的概念可以完全推广到三维:
仿射变换矩阵也同样可以进行推广:
但对于三维旋转变换,有一定的特殊性,三维旋转变换矩阵表示如下:
注意绕y轴旋转时的矩阵,与绕另外两轴旋转时略有不同,这是由于在右手坐标系中,y轴正方向定义为z轴叉乘x轴,而不是x轴叉乘z轴,所以sin的正负号会有换位,而x轴正方向定义为y轴叉乘z轴,z轴正方向定义为x轴叉乘y轴,所以矩阵形式和二维一样。
更多关于三维旋转的内容,查看补充内容:旋转与四元数
2.2 视图变换(Viewing Transformation)
视图变换模拟现实世界中拍照的过程,指把三维空间中的物体,投影到我们的观察视角上的过程,也称为MVP变换(model、view、projection)
首先将物体变换到指定位置(model变换),再把相机(视角)摆放到指定位置(view变换),然后进行拍照(投影变换)。
2.3 视角/相机变换(View/Camera Transformation)
如何让固定一个相机的位置?首先要有一个位置向量$\vec e$指示相机摆放的位置,然后要有一个视角(凝视)向量指向$\vec g$观察方向,最后要有一个上方向向量$\vec t$指示当前向上的方向是什么,相当于固定相机的旋转。
再考虑一个关键点,对于相机和被拍摄的物体,如果二者之间不存在相对运动,那么拍摄出的画面永远是一样的
因此,为了计算和表示方便,我们对于任意给定的相机和物体,把相机放置到坐标系原点,观察方向沿-Z轴方向,up方向为Y轴方向,物体随着相机做相同的变换,这样相机和物体没有发生相对运动,观察到的画面也不发生改变,这一过程即为视角/相机变换,这个过程完成了MVP变换中M和V两步。
因为对相机和物体的变换是相同的,所以他们的变换矩阵也相同,我们按照相机推导出变换矩阵即可。相机要做的变换分为3步:
- 位置向量$\vec e$平移到坐标原点
- 方向向量$\vec g$旋转到-Z轴方向
- up向量$\vec t$旋转到Y轴方向
- 做完这些后,自然$\vec g \times \vec t$指向X轴方向
于是,平移矩阵为:
旋转矩阵不好写出,但是将X轴旋转到$\vec g \times \vec t$方向,Y轴旋转到$\vec t$方向,-Z轴旋转到$\vec g$方向的旋转矩阵可以直接写出:
于是这个变换的逆变换就是我们要的旋转矩阵,又因为旋转矩阵是正交矩阵,所以逆矩阵就是转置矩阵,因此我们要的旋转矩阵为:
于是整个视角/相机变换的矩阵为:
2.4 投影变换
投影变换分为正交投影和透视投影,透视投影更为常用,但要以正交投影为基础。
2.4.1 正交投影(Orthographic projection)
正交投影的一般过程为:
- 在三维空间中的任意一个立方体,其左右区间为$(l,r)$,上下区间为$(b,t)$,远近区间为$(f,n)$,需要注意的是右手坐标系中远坐标f要小于近坐标n,因为观察方向是沿-Z轴方向。
- 先将该立方体的中心平移到坐标原点
- 再将三个区间缩放到[-1,1],最终得到一个规范立方体,这个规范立方体就是归一化设备坐标(NDC)
以上一系列变换的矩阵很好写出:
这就是正交投影矩阵。
2.4.2 透视投影(Perspective Projection)
透视投影也就是人眼正常情况下观察到的画面,近大远小,平行线不再平行。对比透视投影和正交投影,可以发现,只要我们把透视投影的四棱台“压缩”成正交投影的立方体,再做正交投影即可。
那么“压缩”这一步如何用矩阵形式表示呢?通过侧视图,可以看出远平面上的点$(x,y,z)$和近平面上的点$(x’,y’,z’)$的y坐标的关系:
同理也可以得到x坐标的关系:
因此在齐次坐标系下,远平面上的点$(x,y,z)$经过“压缩”的过程就可以写成:
根据这个关系,这个“压缩”矩阵$M_{persp\rightarrow ortho}^{4\times 4}$我们就可以确定一部分,因为
所以
但是第三啊行如何确定呢,直接推导任意点的Z坐标变换前后是如何变化的是非常困难的,但是我们可以从特殊点入手,我们知道以下两个关键信息:
- 对于任意近平面上的点,变换前后所有坐标都不发生变化
- 对于任意远平面上的点,变换前后Z坐标不发生变化
对于第一点,任意近平面上的点可以写成$(x,y,n,1)$,所以写成数学形式就是:
可以看到变换后的Z坐标变成了$n^2$,显然与$x$和$y$无关,因此矩阵$M_{persp\rightarrow ortho}^{4\times 4}$的第三行一定是$(0,0,A,B)$的形式。
所以我们可以得到:
同样的,对于第二点,任意远平面上的点变换前后Z坐标不变,我们取远平面中心点$(x,y,f,1)$,于是可以得到:
两个未知数,两个方程,联立可以把A和B解出来:
这样我们就知道了完整的$M_{persp\rightarrow ortho}^{4\times 4}$矩阵:
于是透视投影变换的矩阵就是:
透视投影到正交投影之后,再利用正交投影将所有坐标归一化为 NDC ,这一步也叫做透视除法。
2.4.3 视场角与宽高比
很多情况下,不会给定上面说到的立方体的 l, r, t, b 等数值,而是以视场角(field-of-view)和宽高比(aspect ratio)的形式给出的,当然,近平面 n 和远平面 f 的是一定会给出的。
在这种情况下我们认为 l = -r , t = -b,也就是我们在做正交投影矩阵时不需要再做平移变换了,只要通过视场角和宽高比计算得到立方体的宽和高就知道X方向和Y方向的缩放比,也就可以构造正交投影矩阵了 。
从侧面看这幅图可以得到:
因此可以得出:
这样我们就得到了宽度的一半 r 和高度的一半 t ,长度依然是 f - n ,然后就可以像之前一样构造投影矩阵了。
2.5 法线变换
当我们变换一个模型的时候,不仅需要变换它的顶点,还需要变换顶点法线,以便在后续处理中计算光照等。但是使用同一个变换矩阵对法线进行变换可能无法保证法线的垂直性,比如:
因此我们要保证变换后的法线依然具有垂直性,就需要用另外一个矩阵对发现进行单独的变换。
在这之前先考虑一个顶点的切线如果使用原矩阵变换会不会有问题,切线就是两个顶点的差,因此用顶点变换的矩阵对切线进行变换不会有任何影响,可以得到正确的结果,那么我们要保证变换后的法线依然和切线垂直,假设原变换矩阵为 $M_{A->B}$,顶点切线为 $T$,法线为 $N$,对法线进行变换的矩阵是 $G$,于是有以下关系: