Unity Shader学习二:矩阵的学习

(注意,由于CSDN里文档格式的显示问题,矩阵后的T 、-1等字段为矩阵的上标,数字和i,j,n等为矩阵的下标)

矩阵从外观上来看就是一个长方形网格,每个格子里放了一个数字,它是由m x n个标量组成的长方形数组。矩阵通常用于进行变换,比如在顶点着色器中,需要把顶点坐标从模型空间变换到齐次裁剪坐标系中。矩阵既然是网格结构,就意味着矩阵由行(row)列(column)之分,如m x n 矩阵表示矩阵由m行n列组成,

Unity Shader学习二:矩阵的学习_第1张图片

mij表明了这个元素在矩阵M的第i行,第j列。

矢量其实就是一个数组,矩阵也是一个数组,所以可以使用矩阵来表示矢量。实际上矢量可以看成是n x 1的列矩阵或1 x n的行矩阵。

矩阵的运算:

1.矩阵和标量的乘法

和矢量类似,矩阵也可以和标量相乘,它的结果仍然是一个相同维度的矩阵,它们的乘法就是矩阵的每个元素和该标量相乘,以3 x 3矩阵为例,公式如下:

Unity Shader学习二:矩阵的学习_第2张图片

2.矩阵和矩阵的乘法

两个矩阵相乘,它们的结果会是一个新的矩阵,新矩阵的维度和原来两个矩阵相关

一个m x n的矩阵A和一个n x r的矩阵B相乘,它们的结果会是一个m x r的矩阵。两个矩阵相乘必须满足前一个矩阵的列数要等于后一个矩阵的行数,否则无法相乘。

若AB = C,新矩阵C的每一个元素Cij的值的计算公式为:Cij = Ai1B1j + Ai2B2j + ... + AinBnj

这个公式简单来说就是对于每个元素可以Cij找到矩阵A中的第i行和矩阵B中的第j列,然后将它们对应的元素相乘然后相加,这个和就是Cij的值。

矩阵的乘法满足一些性质:

性质一:矩阵的乘法并不满足交换律,即AB≠BA

性质二:矩阵的乘法满足结合律,即(AB)C = A(BC)

一些特殊的矩阵:

1.方块矩阵

方块矩阵简称方阵,指那些行与列相等的矩阵,常用的就是3 x 3,4 x 4矩阵。

矩阵的某些性质与运算只有方阵具有,例如对角元素,矩阵的对角元素指的是行号与列号相等的元素,如m11、m22、m33等。如果一个矩阵除了对角元素外的所有元素都为0,那么这个矩阵就叫做对角矩阵

2.单位矩阵

对角元素值都为1的对角矩阵是单位矩阵,用In表示。任意矩阵和单位矩阵相乘仍是原来的矩阵。

Unity Shader学习二:矩阵的学习_第3张图片

3.转置矩阵

转置矩阵实际上是对原矩阵的一种运算,即转置运算。给定一个r x c的矩阵M,它的转置可以表示称MT,这是一个c x r的矩阵。转置矩阵的计算非常简单,只需要把原矩阵翻转一下即可。也就是说原矩阵的第i行变成了第i列,而第j列变成了第j行,数学公式为:MTij = Mji

例如Unity Shader学习二:矩阵的学习_第4张图片Unity Shader学习二:矩阵的学习_第5张图片

对于行矩阵和列矩阵而言,可以使用转置操作来转换行列矩阵

转置矩阵也有一些常用的性质

性质一:转置矩阵的转置等于原矩阵,即(MT)T = M

性质二:矩阵串接的转置,等于反向串接各个矩阵的转置,即(AB)T = BTAT

4.逆矩阵

不是所有的矩阵都有逆矩阵,第一个前提就是这个矩阵必须是方阵。给定一个方阵M,它的逆矩阵用M-1来表示。逆矩阵最重要的性质就是如果把M和M-1相乘,结果将会是一个单位矩阵。即MM-1 = M-1M = I。

一个矩阵存在逆矩阵就可以说这个矩阵是可逆的或是非奇异的,如果一个矩阵不存在逆矩阵那它就是不可逆的或奇异的。

逆矩阵有很多重要的性质:

性质一:逆矩阵的逆矩阵是原矩阵,即(M-1)-1 = M。

性质二:单位矩阵的逆矩阵是它本身,即I-1 = I。

性质三:转置矩阵的逆矩阵是逆矩阵的转置,即(MT)-1 = (M-1)T

性质四:矩阵串接相乘后的逆矩阵等于反向串接各个矩阵的逆矩阵,即(AB)-1 = B-1A-1

逆矩阵是具有几何意义的。一个矩阵表示一个变换,而逆矩阵允许我们还原这个变换,或者说是计算这个变换的反向变换。

5.正交矩阵

另一个特殊的方阵就是正交矩阵。正交是矩阵的一种属性,如果一个方阵M和它的转置矩阵的乘积是单位矩阵的话,这个矩阵就是正交的,也就是说矩阵的正交等价于MMT = MTM = I

结合逆矩阵来看可以得到一个很重要的性质,即如果一个矩阵是正交的,那么它的转置矩阵和逆矩阵是一样的,也就是说矩阵M的正交等价于MT=M-1,这个公式非常有用,在三维变换中经常会需要使用逆矩阵来求解反向的变换。

如何快速辨别一个矩阵是否为正交矩阵:

以3x3矩阵为例,根据正交矩阵的性质可知

Unity Shader学习二:矩阵的学习_第6张图片

其中C1,C2,C3 为矢量,在Unity Shader学习二:矩阵的学习_第7张图片中分别表示第1,2,3行的元素,在Unity Shader学习二:矩阵的学习_第8张图片中表示第1,2,3列的元素,计算时,第1行与第1列的结果等价于矢量C1与自身的点积C1•C1。

由上面的过程可得到几个等式C1•C1 = C2•C2 = C3•C3 = 1, C1•C2 = C1•C3 = C2•C1 = C2•C3 = C3•C1= C3•C2 = 0, 

由等式1可得C1,C2,C3 为单位.矢量(只有单位矢量点积自身结果为1),由等式2可得C1,C2,C3 互相垂直(两个单位矢量互相垂直,其点积为0)。

矢量该表示为行矩阵还是列矩阵

矢量可以表示为行矩阵或列矩阵,这是没有区别的,但是当它与矩阵进行相乘时就有差异了。当将矢量分别作为行矩阵与列矩阵与另一个矩阵相乘时,首先新矩阵的维度不同,其次个元素的值也不同。

在unity中,常规做法是把矢量放在矩阵的右侧,即将矢量当成列矩阵来使用,这意味着unity中矩阵乘法通常为右乘,如:CBAv = (CBAv)))其中ABC为矩阵,v为速度矢量当最列矩阵使用,表示v先使用矩阵A变换然后使用矩阵B变换,最后使用矩阵C进行变换。上面的列矩阵运算等价于下面的行矩阵运算:vATBTCT =(((vAT)BT)CT)

你可能感兴趣的:(Unity,Shader学习,c#)