终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~
在学图形学的时候,仿射变换肯定会遇到,那到底什么是仿射变换了?在做仿射变换时一般都会用到齐次坐标,这个齐次坐标又是什么?下面是我自己学习过程中的一些领悟,记录下来做个总结。
首先给出简短的定义:仿射变换是线性变换(旋转和缩放)加平移变换,齐次坐标就是用高一维的空间坐标表示低一维空间的坐标。
这里解释下线性变换,线性变换也就是在两个向量之间的函数,它保持向量加法和标量乘法的运算。
向量加法: (1)
标量乘法: (2)
线性变换可以用矩阵表示,假设空间一个点坐标为p=(x,y),T表示一个线性变换,则存在一个矩阵A使得
p'=(x',y')=T(p)=Ap。旋转和缩放都是线性变换,因为它们都保持了上述两个性质。用矩阵表示如下:
旋转: (3)
缩放:(4)
平移:(5)
仿射变换也就是上面三个变换的叠加,在上面三个变换中平移变换是没办法使用矩阵相乘的方式来获取的。但是如果将坐标在高一维空间进行表示的时候,也就是采用齐次坐标的时候,平移变换可以用矩阵乘法来进行表示。假设p=(x,y,1)是齐次坐标下二维点p(x,y)的坐标表示,具体表示如下:
旋转: (6)
缩放:(7)
平移:(8)
这样就以上三个进行统一,便得到了仿射变换的矩阵表示,其定义也更容易表达,仿射变换也就是下面的变换:
仿射变换:(9)
当将一个矩阵表示成如下形式时:
(10)
其中分别表示旋转缩放和平移变换。
从上面可以看出,引入齐次坐标的好处就是将这三个变换进行统一用矩阵的形式进行表示,矩阵运算在编程的时候容易实现,而且仿射变换也有个性质:仿射变换后保持点共线及共面的性质。
在公式(10)里面的1,如果变换成其他数值,则表示对整体进行缩放,也就是相当于在整个矩阵外面乘以一个w效果一样。