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的矩陣採用矩陣左乘法,即向量用列向量表示, 也正是由於採用列向量表示, 矩陣的16個元素(m[i]:i表示0~15)前面是個是第一列,而後是第二列,第三列和第四列。
Row 行;Cloum 列。
行矩陣:只有一行的矩陣,通常在矩陣中採用右乘。
例,該矩陣與4X4的矩陣相乘
,結果爲1*4的矩陣。
列矩陣:只有一列的矩陣,通常在矩陣中採用左乘,
例,4X4矩陣與該向量相乘
,結果爲4X1的矩陣。
在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的轉置);
關於轉置,能夠變換矩陣和向量相乘的順序,這樣就至關於和轉置矩陣相乘了。
在二維空間中,旋轉能夠用一個單一的角 θ 定義。做爲約定,正角表示逆時針旋轉。把笛卡爾座標的列向量關於原點逆時針旋轉θ 的矩陣是:
順時針旋轉就之間計算-θ 便可。
逆矩陣:
逆矩陣表示較原來反方向旋轉θ ,也即順時針旋轉-θ;