Matrix 矩阵

单位矩阵

  4X4单位矩阵E:html

  

 

  4*4矩阵表示4行4列:算法

  

伴随矩阵

   求解方法:函数

    1. 把矩阵的各个元素换成它的代数余子式;测试

    2. 将所获得的矩阵转置便获得A的伴随矩阵;spa

  代数余子式:在一个n阶行列式中,把元素aij (i,j=1,2,.....n)所在的行与列划去后,剩下的(n-1)^2个元素按照原来的次序组成的一个n-1阶行列式Mij,称为元素aij的余子式,Mij带上符号(-1)^(i+j)称为aij的代数余子式,记做Aij=(-1)^(i+j) Mij。3d

 

  例:code

  ,求A的伴随矩阵?                                                                                    orm

    解:A11 = (-1)^(1+1)*M11 = (-1)^(1+1)*4 = 4;htm

      A12 = (-1)^(1+2)*M11 = (-1)^(1+2)*3 = -3;blog

      A21 = (-1)^(2+1)*M11 = (-1)^(2+1)*2 = -2;

      A22 = (-1)^(2+2)*M11 = (-1)^(2+2)*1 = 1;

      因此

        

          A* : A的伴随矩阵;

转置矩阵

  把矩阵A的行换成同序数的列所获得的新矩阵称为A的转置矩阵,这一过程称为矩阵的转置。

  

逆矩阵

  设A是数域上的一个n阶方阵,若在相同数域上存在另外一个n阶矩阵B,使得: AB=BA=E。 则咱们称B是A的逆矩阵,而A则被称为可逆矩阵。

  求解方法:

 

 

矩阵的乘法:两个矩阵的乘法仅当第一个矩阵A的列数和另外一个矩阵B的行数相等时才能定义。如A是m×n矩阵和B是n×p矩阵,它们的乘积C是一个m×p矩阵

   ,它的一个元素:并将此乘积记为:    .
计算法则:每一行的各个数与每一列的各个数相乘=等于该元素的乘积。

测试Unity 矩阵:

得出结果:

从输出能够看到unity的矩阵采用矩阵左乘法,即向量用列向量表示, 也正是由于采用列向量表示,  矩阵的16个元素(m[i]:i表示0~15)前面是个是第一列,而后是第二列,第三列和第四列。

Row 行;Cloum 列。

行矩阵:只有一行的矩阵,通常在矩阵中采用右乘。

例,该矩阵与4X4的矩阵相乘,结果为1*4的矩阵。

列矩阵:只有一列的矩阵,通常在矩阵中采用左乘,

例,4X4矩阵与该向量相乘,结果为4X1的矩阵。

Unity Shader

在Vertex Function函数中,将模型空间的顶点转换到投影空间, o.pos = mul(UNITY_MATRIX_MVP, v.vertex); 理解为矩阵采用左乘,顶点向量是列向量,使用齐次坐标获得4X1的矩阵.

将法向量转到世界空间

顶点从模型空间转换到世界坐标空间只须要乘以世界转换矩阵便可,可是顶点的法向量却不能经过直接乘以这个矩阵将其变换到世界空间。缘由是世界矩阵不只包含旋转,还有可能包含着缩放操做,若是模型被不成比例的缩放,在不一样方向上会有不一样程度的拉伸或者压缩,顶点的坐标会于是伸缩,可是若是对法向量进行一样的伸缩,那么变化后的法向量将再也不垂直于对应的表面。所以对应没有缩放或等比缩放的世界转换矩阵,能够直接采用相同的转换矩阵做为法向量的变换矩阵。

对于法向量来说,只有方向,对于平移不起任何做用,若是咱们采用_Object2World,那么它的旋转和缩放都进行了变换,咱们不想让它的缩放进行变换。咱们就要构造新的矩阵M,屏蔽掉它的缩放,可是保留它的旋转。如今将_Object2World的逆矩阵_World2Object转置就获得M矩阵了。

 float3 normalDirection = normalize( mul(float4(v.normal,0.0),_World2Object)).xyz; 原本应该是mul((float4(v.normal,1.0),_World2Object的转置);

关于转置,能够变换矩阵和向量相乘的顺序,这样就至关于和转置矩阵相乘了。

 

二维旋转矩阵

  在二维空间中,旋转能够用一个单一的角 θ 定义。做为约定,正角表示逆时针旋转。把笛卡尔坐标的列向量关于原点逆时针旋转θ 的矩阵是:

  

  顺时针旋转就之间计算-θ 便可。

逆矩阵:

  

   逆矩阵表示较原来反方向旋转θ ,也即顺时针旋转-θ;