單位矩陣
4X4單位矩陣E:
4*4矩陣表示4行4列:
伴隨矩陣
求解方法:
1. 把矩陣的各個元素換成它的代數余子式;
2. 將所得到的矩陣轉置便得到A的伴隨矩陣;
代數余子式:在一個n階行列式中,把元素aij (i,j=1,2,.....n)所在的行與列划去后,剩下的(n-1)^2個元素按照原來的次序組成的一個n-1階行列式Mij,稱為元素aij的余子式,Mij帶上符號(-1)^(i+j)稱為aij的代數余子式,記作Aij=(-1)^(i+j) Mij。
例:
,求A的伴隨矩陣?
解:A11 = (-1)^(1+1)*M11 = (-1)^(1+1)*4 = 4;
A12 = (-1)^(1+2)*M11 = (-1)^(1+2)*3 = -3;
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的轉置);
關於轉置,可以變換矩陣和向量相乘的順序,這樣就相當於和轉置矩陣相乘了。
二維旋轉矩陣
在二維空間中,旋轉可以用一個單一的角 θ 定義。作為約定,正角表示逆時針旋轉。把笛卡爾坐標的列向量關於原點逆時針旋轉θ 的矩陣是:
順時針旋轉就之間計算-θ 即可。
逆矩陣:
逆矩陣表示較原來反方向旋轉θ ,也即順時針旋轉-θ;