2D线性变换
我们可以使用一个
通过这种简单的公式可以实现许多实用的变换,包括缩放、切变、旋转、镜像等
缩放
缩放是最简单的变换操作,只需要沿着坐标轴乘以指定的倍数即可,构造一个
通过这个矩阵就能将指定坐标缩放至任意倍大小
例如,将图片
当
切变
切变是一种特殊的平移,即其中一条边平行于坐标轴进行平移(将矩形变为的平行四边形)。随着远离原点,偏移量也会随之增大。水平或垂直切变矩阵:
切变也可以理解成只考虑一个坐标轴的旋转,通过旋转角度的
例如,沿着水平方向向右切变
沿着垂直方向向上切变
旋转
假设,我们要将向量
因为向量
再通过
构造二维线性变换矩阵:
例如,使用将一个图像旋转
镜像
将图像以坐标轴为对称轴进行反射,只需要将除对称轴之外的其他坐标全都取相反数即可
复合运算
通常我们会需要对一个图像进行多次变换,例如,先将图像缩放一次,再进行旋转一次
通过乘法结合律,可以将结果合并为:
由此可知,我们能将两个操作合并为一个最终的变换矩阵:
假设,我们需要将一个图像在垂直方向上缩小一倍,然后再旋转
特别注意:矩阵
的计算顺序是右侧优先,即先计算缩放 ,再计算旋转 。这个顺序非常重要,因为矩阵并不满足交换律,不同的运算顺序会产生不同的结果!!
3D线性变换
3D变换只是在2D的基础上拓展一个
3D旋转会比2D复杂得多,但是我们依然可以在2D的基础上加上一个
对于
3D切变与2D类似,沿着其中一条轴线平移即可:
任意向量旋转
与2D旋转相同,3D旋转矩阵也是一个正交矩阵,这意味矩阵的三行分别是三个相互正交的单位向量:
假设,三个单位矩阵分别为
若我们将旋转矩阵左乘单位矩阵
观察结果矩阵,发现其与单位阵之间的关系:
相似的,我们还能得到
因为旋转矩阵
对于一个任意向量
平移
我们前面都是通过一个矩阵
通过这种方式,我们只能够实现缩放和旋转,却无法进行平移操作。其实,想要实现平移操作只需要给每个点增加一个偏移量即可:
单独定义一个这样的平移操作确实可以实现效果,但我们更希望能够与前面一样只使用一个矩阵
这里需要引入齐次坐标的概念,将点
使用修改过后的三维矩阵,就能够实现二维平面的线性变化(包括缩放、旋转和平移)
如果在进行线性变换时,不希望图像产生平移,只需要将向量的拓展维度设置为
这样左上角
由于齐次坐标的拓展维度只会是
在三维空间实现平移操作也是一样的使用齐次坐标,拓展一个维度即可:
参考资料
- 齐次坐标
- 《Fundamentals of Computer Graphics》 Chapter 6 Transaction Matrices