计算机图形学涉及很多知识,比如线性代数和微积分等等。在学习图形学知识前,我们应该要对这些基础知识有一个了解。下面介绍一下相关的基础线性代数知识。
首先我们要知道,线性代数中的矩阵是可以变换坐标系里点的位置的。而比如 和
分别表示二维或者三维空间中点或者向量的坐标,也可以写成
或者
。如果有对于矩阵乘法不理解的,可以查看我此前的一个矩阵快速幂博客,其中有一段是对于矩阵乘法的解析。链接:【算法详解】矩阵快速幂:如何将线性方程组映射为转移矩阵解决线性递推-CSDN博客
齐次坐标
我们知道,对于一个向量进行平移,它的坐标是不会发生改变的,向量具有平移不变性;但是点却会是改变的。可是,我们对于向量和点却是同一套坐标表示方法,难道我们每次做平移前都需要判断这个是向量还是点吗?这太麻烦了,所以我们发明了齐次坐标的表示方法。
在齐次坐标,我们对于坐标表示增加了一个维度,即在 2 维坐标系表示为 三维坐标系表示为
。如果表示点,则 w=1 ;如果表示向量,则 w=0 。比如说在三维坐标系
表示的就是点 (4,5,3) ,
表示的是向量 (4,5,3) 。
而这样表示有什么好处呢?我们可以发现,这样表示的逻辑是合理的。
由上可以发现,点与点相减就变成了向量,完全符合我们的运算法则。而且点与向量相加也是点,相当于点沿着向量方向去移动,结果还是这个点,不过是改变了坐标。而且向量与向量相加也是一个向量。
所以这样表示是完全符合逻辑的。在接下来矩阵变换的平移中,更可以感受到齐次坐标的用处。
矩阵变换
缩放
如果我们想要把一个坐标系里的物体给变大或者缩小,应该怎么办呢?如下图

假设现在是向 x 轴增大 a 倍,向 y 轴方向增大 b 倍。我们可以知道,那对于这个物体里的每一个点,变化后应该都是同样的增大。那我取这个物体里任意一个点 ,那变化完后这个点坐标是
,可以推导出如下
可以发现其实这个方程组满足矩阵的定义,所以接下来提取出来参数写成矩阵的形式,那就是
我们可以发现,通过一个矩阵乘法,我们就成功的表示出来缩放了。对于后面的每一种矩阵变换,其实都可以类似这样取推导。也是因此,矩阵才可以表示出来坐标的变换。
同理,对于三维坐标,我们想要进行向 x 轴增大 a 倍,向 y 轴方向增大 b 倍,向 z 轴方向增大 c 倍,则可得
写成矩阵形式就是
这个时候其实我们也能发现这个缩放矩阵的基本的形式了。但我们刚刚其实还提到过齐次坐标,如果对于齐次坐标表示的,这个缩放矩阵只需要稍微变换一下。由于无论是点或者是向量,缩放后的 w 都不会改变,所以只需要在方程组里加入一个式子 或者
即可。则可得
二维:
三维:
旋转
如下图,绕原点进行旋转,旋转角 θ 定义为逆时针旋转转过的角度(顺时针取反即可)。

旋转的变换矩阵推导有点麻烦,由于刚刚的缩放的推导大家应该基本理解了为什么矩阵可以表示变换还有如何推导来的,这里直接给出结论吧(右手系)。
二维(绕原点):
三维(绕 x 轴):
三维(绕 y 轴):
三维(绕 z 轴):
齐次坐标表示也很简单,只是在外围加了一圈0,矩阵边角那个地方是 1 而已。
二维(绕原点):
三维(绕 x 轴):
同理可得三维绕 y 轴旋转和绕 z 轴旋转的变换矩阵。
平移
平移是比较特殊的一个变换,正是为了处理平移,我们发明了齐次坐标。我们先来看看,没有齐次坐标我们是如何进行平移的。
我们刚刚可以看到,对于类似缩放和旋转的变换,我们想要从状态 A 变换成状态 A' ,我们只需要乘上一个特定的矩阵 M 即可做到了。
但是,如果我们想要进行平移,比如向 x 方向移动 a 个单位,向 y 方向移动 b 个单位,向 z 方向移动 c 个单位。即
我们发现,后面的 abc 都是常数,根本无法写成一个矩阵。所以,我们只能这样写了。
这样写简直无法让人满意,因为刚刚的缩放和旋转都是乘一个矩阵就可以了,怎么到了这里后面又多了一个加法计算呢。不仅如此,刚刚也提到了我们还需要分辨是向量还是点,向量又不需要加,因为平移不变;点又需要加常数。这样太复杂了,为了统一由一个矩阵表达变换,更是为了不用一直判断点和向量,我们才需要齐次坐标。
所以,我们增多一个维度 w 来让平移实现,则方程组变成如下。
这样一来,式子就统一了。w 也属于一个未知数,只不过它的取值是 0 或 1 。而且,**w 取 0 的时候,常数项就是 0 ,完美符合了向量的平移不变性;w 取 1 的时候常数项存在且正好就是系数 abc ,符合点的平移!**所以我们才让 w=0 表示向量,w=1 表示点。
我们写成矩阵形式就是
同理,二维平移的变换矩阵为
总结
可以看到,我们通过齐次坐标还有矩阵变换,我们基本可以描述二维和三维空间里的大部分物体运动了。对于复杂的运动变换,我们可以把它拆解成一个个简单的运动,利用矩阵描述小运动,通过矩阵乘法的结合律来表示一个复杂的运动。
也就是说,对于一个复杂运动矩阵 A ,初状态为 n ,末状态为 n' ,要得到这个运动 A 需要 A_1,A_2,...,A_n 个运动按顺序合成。其实根据矩阵乘法的结合律,可得
注意不能交换顺序,因为矩阵乘法是不满足交换律的。但我们可以通过结合律,算出这个复杂运动矩阵 A 。那样只要任意一个物体想要进行 A 变换,只要一乘这个矩阵就可以了,不再需要我们进行复杂的运动推导。所以图形学才能如此和线性代数的矩阵运算关系紧密,有了矩阵计算机运算速度可以说是加倍了。
《【线性代数】图形学基础:齐次坐标与矩阵变换》 是转载文章,点击查看原文。
