一、transformation-变换
(1)Scale
-
缩放变换示意图
-
图形每个像素对应坐标的计算公式
-
写成缩放矩阵的形式
-
非均匀缩放
(2)Reflection Matrix
-
镜面变换示意图
-
图形每个像素对应坐标的计算公式
-
写成镜像矩阵的形式
(3)Shear Matrix
-
切变变换示意图
-
写成切片矩阵的形式
(4)Rotate
-
旋转变换示意图
-
旋转默认以原点为旋转中心,旋转方式为逆时针旋转。
-
旋转矩阵
(5)总结
- 我们要做变换,就要找到变换前坐标和变换后坐标之间的一种关系,根据这种关系将原坐标变换为新坐标,并将坐标和变换写成矩阵形式。
二、齐次坐标
(1)平移
-
平移变换示意图
-
图形每个像素对应坐标的计算公式
-
由于是相加,所以我们只能写成这种形式:
-
可以发现平移变换不是线性变换,无法表述为之前变换的形式,即坐标矩阵乘以一个矩阵的形式。有没有一个办法可以统一的表示所有的变换方式呢?
(2)No free lunch
-
没有付出就没有收获,诸如动态规划是一种用空间换时间的求解算法,想要更好的表达方式,就需要牺牲一些东西。使用齐次坐标即可统一表述方式。
-
使用齐次坐标实现平移变换。
(3)齐次坐标的介绍
-
点和向量齐次坐标的表示,向量w=0代表了向量的平移不变性。
-
也表述了向量+向量=向量、点-点=向量 等运算规则。
-
扩展齐次坐标下点w分量的含义
三、齐次坐标的变换
(1)变换
-
Affine Transformations
-
任何一个 Affine Transformations都可以写为变换矩阵形式。
-
变换对应的矩阵
(2)逆变换
- 逆变换对应原变换矩阵的逆矩阵(AM=B,AM-M=B-M,A=B-M)。
(3)变换顺序的讨论
-
变换的顺序:缩放->旋转->平移。因为定义旋转是围绕原点,所有必须保证旋转时未经过平移,因此旋转在平移之前。因为定义缩放一般是我们针对原图形进行的横纵向缩放,即缩放时我们认为图形的横向为x轴纵向为y轴,而旋转会导致图形横向和纵向偏移,所以缩放需要在旋转之前进行。
-
所有任何复杂的变换都可以通过这些基本变换得到,即定义在一个变换矩阵中。如果当对图形进行过旋转和平移了,还想对其进行缩放,可以先将图形逆变换到缩放阶段,然后执行缩放变换,再执行原本的旋转和平移变换即可。
-
注意矩阵乘法类似于函数映射y=F(x),所以变换矩阵M和位置矩阵x的乘法为Mx,为左乘。对坐标的变换如下图,会从右到左依次应用各个变换矩阵。
-
矩阵从右到左逐个应用。也可也认为是,从An×A(n-1)×…×A1=M,即计算出变换矩阵M应用到坐标上。
-
如果有一个变换,它要求基于原点以外一个点旋转,或者是要求基于x轴和y轴以外的轴进行缩放,那该怎么办?对于绕原点以外的点旋转,我们只需要平移物体,使得旋转点平移到原点(保证了旋转点和物体的相对位置不变),再开始绕着原点旋转,这样就得到了应该旋转得到的效果,只不过我们还要将物体平移回去而已。而对于缩放也是一样,我们将旋转轴旋转到x轴上,进行x轴上的缩放,然后再旋转回原本的缩放方向即可。注意变换矩阵是从右到左的变换顺序。
-
存在变换顺序是因为变换的规则是固定的,而针对上述本身就打破了变换规则的变换,需要打破变换顺序才可以得到实现。但是无论在任何时候,我们想要旋转物体,只需要保证旋转中心在原点,我们需要缩放物体,只需要保证缩放轴在x或y轴上。这样我们可以先通过简单的变换使得旋转中心在原点或者缩放轴在x轴上,我们即可实施不规则的旋转或缩放。任何变换都是有对应的关系的,如果你能设计出一种变换关系,那你也可以不基于这些基本的变换,比如之间绕某个点旋转。
四、三维变换
(1)三维的齐次坐标
-
添加z坐标即可。
-
w不等于0,则点的坐标为:
-
三维变换矩阵,其中3X3为线性变换,旁边一列为平移变换
-
变换的顺序,上图矩阵等价下图计算过程,因此变换顺序也是先线性变换后平移。