我们在求解变换矩阵的时候其实只需要去满足一些特殊点即可算出变换矩阵了,而不需要死记硬背一些公式。具体可以看看旋转矩阵的推导示例。
假设原坐标为
求解可得
同理将左上角坐标变换代入计算即可求出B,D。
另外旋转矩阵具有一些比较有意思的性质,这些性质在下一节会用到
很显然有
,而又由定义可知
,因为这两个操作是互逆的嘛。
也就是说
,而在数学上如果一个矩阵的逆等于它的转置,那么就称这个矩阵为正交矩阵(Orthogonal Matrix),即旋转矩阵是正交矩阵。
显然上述操作并不能用矩阵乘法来表示,因此平移变换不能像前面的变换操作一样可以直接用矩阵乘法表示,所以为了让平移变换也可以以一种优雅的矩阵乘法形式表示,所以需要引入齐次坐标。
以二维坐标为例,我们可以通过额外加入一个坐标来使用齐次坐标。因此:
3D情况同理,表示如下:
那为什么点和向量最后一项一个是1,而另一个是0呢?仔细想想这样设计是非常smart的操作,因为它满足了如下性质:
,那么
,因为第三维只能是0或者1,所以我们可以对每一维除以2,那么就可以得到
,这不就是a,b的中点吗!!!是不是感觉很奇妙!
为了将上述变换统一起来,所以提出了仿射变换,即
Affine map = linear map + translation (仿射变换 = 线性变换 + 平移变换)
仔细观察可以知道左边一系列的矩阵相乘其实就等价于一个3x3的矩阵,换句话说一个3x3矩阵可以对2D向量做超级多的变换。
如果一个变化比较复杂该怎么弄呢?很简单我们可以通过对复杂变化做分解来简化,例如如果我们想以下图中(最左边)的正方形左下角为中心进行旋转该怎么做呢?
很简单我们可以先将左下角顶点通过平移变换移动到原点,然后再做旋转,最后将左下角顶点平移回原处即可。