返回
Featured image of post Shader入门精要-矩阵与矩阵变换

Shader入门精要-矩阵与矩阵变换

笔记摘自书籍《Shader入门精要》

一、矩阵

矩阵是由 m X n 个标量组成的长方形数组;矩阵属于网格结构,有行、列之分。

实际上矢量可以看成nX1的列矩阵或者1Xn的行矩阵,其中n对应了矢量的维度。列如矢量 v=(3,8,6)可以写成下面两种矩阵。

1. 矩阵的运算

  • 矩阵与标量的乘法运算非常简单,将标量与矩阵每个元素相乘即可。

  • 矩阵与矩阵的乘法 我们这里用更直观的方法解释;如果我们要计算Cij,我们只需要找到 A 中的第 i 行和 B 中的第 j列,让后把他们对应的元素相乘后再加起来,这个和就是Cij。因此,c23 = a21Xb13 + a22Xb23

注意:矩阵的乘法不满足交换律(AB不等于BA);但是满足结合律((AB)C = A(BC)**); ABCDE = ((A(BC))D)E = (AB)(CD)E

2. 特殊的矩阵

  • 方块矩阵,指那些行和列数目相等的矩阵。对角元素是它特有的性质,即行号和列号相等的元素。如果一个矩阵除了对角元素外的所有元素都为0,那么这个矩阵就叫做对角矩阵

  • 单位矩阵,指一个特殊的对角矩阵,用In来表示。他们有一个特性,就是任何矩阵和它相乘的结果都等于原来的矩阵(MI = IM = M

  • 转置矩阵,是指将一个原矩阵进行转置运算。 矩阵的串接转置,等于反向串接各个矩阵的转置。公式表达为:(ABT)=BTAT

  • 逆矩阵的前提是该矩阵必须是一个方阵。 给定一个方阵M,它的逆矩阵用M-1来表示。如果我们将MM-1相乘,结果将会等于一个单位矩阵。 MM-1=M-1M=I 并非所有的方阵都有对应的逆矩阵,如果一个矩阵有对应的逆矩阵,这个矩阵就称为可逆的,如果没有对应的逆矩阵,我们称为不可逆的**。 如何判断一个矩阵是否为可逆的呢?如果一个矩阵的**行列式**不为0,那么他就是可逆的。 一些规则: ***I -1 = I*** 单位矩阵的逆矩阵等于它本身。 ***(MT)-1 = (M-1)T*** 转置矩阵的逆矩阵是逆矩阵的转置。 ***(AB)-1 = B-1A-1*** 矩阵串接相乘后的逆矩阵等于反向串接各个矩阵的逆矩阵。

  • 正交矩阵,如果一个方阵和它的转置矩阵的乘积是单位矩阵的话,我们就说这两个矩阵是正交的MMT=MTM=I 如果一个矩阵是正交的,那么他的转置矩阵和逆矩阵都是一样的。也就是说MT=M-1

3.行矩阵还是列矩阵

假设我们有一个矢量v=(x,y,z),我们可以转换成行矩阵v=(x y z)或列矩阵v=(x y z)T,这里我们有个矩阵M,我们将他们分别相乘,会得到两个结果。

显然在与矩阵相乘的时候选择行矩阵还是列矩阵直接决定了矩阵乘法的书写次序和结果值。

**注意:**在Unity中,常规的做法是把矢量放在矩阵的右侧,把矢量转换成列矩阵来进行运算。这也导致了我们的矩阵运算乘法通常是从右往左乘。CBAv = (C(B(Av)))

二、矩阵的变换

1.什么是变换

变换是指我们把一些数据,顶点、方向矢量甚至是颜色等,通过某种方式进行转换的过程。

我们先来看一个简单的2D例子,我们有一个2X2的矩阵;

我们从这个矩阵中获取基矢量pq; p = [2 1] q = [-1 2] 当我们将如果一张图的原基矢量为x(1,0),y(0,1),将它转换成上面矩阵时就得到了下面的过程。这个转换过程就称为变换,我们可以看出,这个变换过程不仅包含旋转,还包含拉伸。

###2.齐次坐标 如果我们想对一个矩阵进行平移操作,那么我们需要将这个矩阵扩展到4X4的矩阵,为此我们需要将原来的三维矢量转换成四维矢量,也就是我们说的齐次坐标。 从三维坐标转换到齐次坐标是把其w设为1。而对于方向矢量来说,我们需要把w设为0。 ###3.矩阵平移、旋转和缩放的变换

这里我将对应的公式和方法在下图中展示,需要注意的是,矩阵的旋转有绕不同的轴旋转,他们所对应的公式也有所不同。