[UnityShader基础]11.矩阵

0.特殊的矩阵

a.单位矩阵

类似于标量中的数字1,任何矩阵和单位矩阵相乘的结果还是原来的矩阵,。如下是一个三阶的单位矩阵:

b.转置矩阵

对一个矩阵的行列进行交换,可以得到转置矩阵

c.逆矩阵

对于一个方阵M,它的逆矩阵用M-1来表示,一个重要的性质是:M*M-1=单位矩阵

逆矩阵是具有几何意义的,我们知道一个矩阵可以表示一个变换,而逆矩阵允许我们还原这个变换。因此,如果我们使用变换矩阵M对矢量v进行了一次变换,然后再使用它的逆矩阵M-1进行另一次变换,那么我们会得到原来的矢量

证明为:M-1*(M*v)=(M-1*M)*v=v

d.正交矩阵

矩阵M是正交的,等价于:M*MT=单位矩阵

结合上面的逆矩阵性质,可知对于正交矩阵M:MT=M-1

1.矩阵和矩阵的乘法

一个a*b的矩阵和一个b*c的矩阵相乘,结果为一个a*c的矩阵

2.矩阵和矢量的乘法

在unity中,通常会把矢量放在矩阵的右侧,即把矢量转换成列矩阵来进行运算。这是由unity提供的内置矩阵(如MVP矩阵)决定的,矢量放在左侧还是右侧,结果是不一样的

例如,一个4*4的矩阵,乘以一个4*1的向量,结果为一个4*1的向量

对于CBAv=(C(B(Av))),其中C、B、A为矩阵,v为向量,先对v使用A进行变换,再使用B进行变换,最后使用C进行变换

3.几何意义

a.变换

矩阵的几何意义是变换,变换包含常见的平移变换、旋转变换、缩放变换,分别通过构造平移矩阵、旋转矩阵、缩放矩阵,然后乘以点或矢量,就可以对点或矢量进行对应的操作

如果使用的是4*4的矩阵来进行变换,则需要把点或矢量扩展到四维空间,这就是齐次坐标空间

b.齐次坐标

齐次坐标是一个四维矢量

对于一个点,从三维坐标转为齐次坐标,是把其w分量设为1

对于一个矢量,从三维坐标转为齐次坐标,是把其w分量设为0

这样的话,当用一个4*4的变换矩阵对一个点进行变换时,平移、旋转、缩放都会作用于该点;而如果是用于变换一个矢量,平移的效果就会被忽略

旋转变换和缩放变换的矩阵是3*3的,平移变换的矩阵是4*4,点要考虑平移,而方向矢量不需要考虑平移,因此:

对顶点的的变换,通常使用4*4的变换矩阵

对方向矢量的的变换,通常使用3*3的变换矩阵

4.CG中的矩阵

a.初始化

在CG中,对float4x4等类型的变量是按行优先的方式进行填充的,例如用1到9去填充一个3x3的矩阵,则得到的是:

1 2 3

4 5 6

7 8 9

b.访问

访问一个矩阵中的元素时,也是按行来索引,例如定义上面的矩阵为M,则:

M[1][0]表示访问第2行第1列的元素,即值为4

c.mul方法

如下,M为矩阵,v为矢量,tranpose方法表示对矩阵进行转置。可知当参数位置调转时,要对矩阵进行转置

mul(M, v) == mul(v, tranpose(M))

mul(v, M) == mul(tranpose(M), v)

原文地址:https://www.cnblogs.com/lyh916/p/14232365.html