上次博客最后一个主题矩阵,只说了句矩阵可以完成很多转换。而这次就主要来说明各种转换。
所有的转换我们都是通过矩阵和向量完成的。
缩放(Scale)
上述中分别为各个坐标轴的缩放倍数。实际的转换过程如下:
错切(Shear)
错切可以将一个矩形转换成平行四边形。
上面式子主要完成的是对于y>0的点前移,y<0的点后移,而各点的y坐标不变。从而产生了错切的感觉。得到的结果:.
旋转(Rotation)
2维空间的旋转变换次序是没有影响的,但是对于三维空间却可能得到不一样的结果。
2D rotation
这里说的旋转是绕着原点旋转。
有趣的是:
3D rotation
3D的rotation相比于2D的要复杂很多。但是实际上我们可以这样去理解:二维的旋转,相当于绕着Z轴旋转,因为z坐标不会变。
因此可以得到绕各个坐标轴旋转的矩阵:
同样的道理也就可以得到绕x轴与绕y轴的旋转:
同样的:.
如果我们仔细观察可以发现,3D中R的各个行(列)向量满足一个三维坐标系的要求:单位向量且正交。因此如果我们将旋转矩阵写成下面的形式:
则
上式最后一项正是在uvw坐标轴下的坐标值。因此旋转的本质实际上是将它映射到另一个坐标系当中了。
对于旋转矩阵如何求逆?因为旋转矩阵是正交矩阵,所有.
3D旋转是不可交换的。
但是上面的旋转矩阵相对来说比较简单,因为是绕着坐标轴旋转的。那么有没有办法绕着任意一个向量旋转的公式?
罗德里格旋转(Rodrigues)公式
接下来这个公式就是用来解决上述问题的。假设向量(点)绕着单位向量旋转.
,分布表示平行与垂直于的分量。很容易知道,在旋转过程中是不变的。
然后我们要考虑到是如何旋转的。实际上它旋转的平面是垂直于与的,容易想到利用叉乘来构造:
,而且由于叉乘的性质,的长度恰好等于.
现在旋转角度是,则旋转后的向量在与方向上的投影分别是与.
旋转后的向量边上上述向量之和,并且希望写成旋转矩阵的形式(矩阵乘以向量):
所以.
上式是计算机图形学中很重要的一个基础公式。
Note
如果要回到原来的样子,可以对所有的转换求逆。但是要注意的是:.
齐次坐标转换(Homogeneous
Coordinates)
不知道有没有人有这么一个疑问:为什么没有平移??平移应该是最简单的转换,但是实际起来的实现却没有那么容易。首先做个尝试:
中间的矩阵怎么做?有人会说将第一行第一列写为即可,但是这就失去了转换矩阵的意义。转换矩阵中不应该包含我们要转换的坐标的信息。
计算机图形学中,解决这个问题的方法就说用齐次坐标,先看一下下面的转换:
$$
=
=
$$
通过加入一个其次坐标w而实现了平移。而加入这个量不会对上面提到的旋转等操作产生影响,而且他有很多的好处,因此被普遍用于图形相关的软件与硬件中。
#### 平移(Translate) #### $$
=
=
= +T $$
主要旋转平移矩阵和平移旋转矩阵是不一样的,因为平移矩阵实际上需要的是最右侧的一个向量:
旋转平移矩阵:
平移旋转矩阵:
仔细推导就可以得到上面的结果。
法向的转换并不会按照平面各个点的转换进行。
假如原来的切线向量为,原来的法向向量为,转换矩阵为,则切线向量是会依照原来的转换而改变的:.
假设转换完成后的法向向量为.
当然不管什么时候,法向与切向都应该是垂直的:
可以得到:
因此我们希望,所以得到:.
当然上面的解并不是唯一解,但是计算机图形学是工程学科,我们希望的是能够解决这个问题即可。
需要注意的是:为3×3矩阵。因为法向和切向是向量,所以平移不会影响法向和切向。