矩陣運算 1

2021-09-07 00:27:39 字數 4012 閱讀 1163

1.什麼是矩陣

矩陣就是由多組資料按方形排列的陣列,在3d運算中一般為方陣,即m*n,且m=n,使用矩陣可使計算座標3d座標變得很方便快捷。下面就是乙個矩陣的例項:

看似沒什麼特殊的,可是後面你可以看到矩陣的魅力,為什麼矩陣這麼有效,我也不知道,這個由數學家去論述,我們只要可以用就是了。

2.向量的點乘和叉乘

向量的點乘和叉乘與矩陣一樣是數學定義,點乘在矩陣運算中起到很重要的作用,稱為內積,叉乘稱為外積,通過叉乘運算可以計算出乙個向量,該向量垂直於由兩個向量構成的平面,該向量也稱為該平面的法線。這兩個計算方法在3d運算中的作用就是向量計算工具。

l         點乘公式 

其實就是兩個向量的各分量相乘後形成新的向量

l         叉乘公式

uc=u1* u2

兩個向量進行叉乘的矩陣如下:

其中x1,y1,z1以及x2,y2,z2分別為向量u1和u2的分量,設uc為叉乘的向量積,其計算公式如下:

3.三維幾何變換矩陣

幾何繪圖中,常常需要將乙個模型從乙個位置移動到另乙個位置,或者將模型進行縮放旋轉,稱為幾何變換。每個模型都存在乙個區域性的座標系,在製作模型的時候是不考慮模型在場景中的具體位置的,模型中的所有頂點的座標值都相對於區域性座標系,而模型在應用中會發生很多變化,其中大部分情況都是由多種變化復合的結果,這些變化涉及很多複雜的運算,因此你必須逐個計算每個頂點因模型旋轉、縮放、位移後相對於世界座標系的值,這個計算如果僅僅採用一般的三角函式去逐個點處理那簡直會使你望而生畏,計算量無法估量,就算你費好大勁把公式寫好,也許模型因為你某個小錯誤已經面目全非,更別說動畫效果了。

這時候就必須使用矩陣來解決這些問題。在3d計算中採用的是4元座標系,因此在計算模型變換的時候採用的是4*4的方陣,矩陣結構中,元素編號按先行後列排列,在程式語言中可以用陣列儲存,使用迴圈計算,為便於座標的批量處理,在繪製和計算乙個三維模型前,先計算好所要某種變換所需要的元素填寫入矩陣,然後逐一將模型的所有頂點和矩陣相乘就可以將模型的所有頂點按所希望的變換為新的座標(除非矩陣元素設定錯誤),這裡可以看出,矩陣中的每個資料(元素)是至關重要的,如何產生這些元素將在第三章介紹。

矩陣結構如下。(二維平面則使用3x3的矩陣,原理相同)。

該結構圖中的每個元素都給定了乙個編號,編號的**分別代表行和列。

4.變換計算公式

向量和點的變換運算都可以使用矩陣,乙個座標或向量與乙個4x4的矩陣進行點乘運算而進行轉換。矩陣中的資料排列可以使用列矩陣,也可以使用行矩陣,但在做乘法時必須要行列交叉做乘積,opengl中使用列矩陣。下面表示乙個矩陣陣列的排列方式以及乙個點或向量是如何與矩陣相乘以獲得新座標的計算公式的。

其中p是原頂點座標或向量,變換時將當前頂點點p的四個分量分別與矩陣的每個行進行點乘運算:

x』=x*m00+y*m01+z*m02+w*m03

y』=x*m10+y*m11+z*m12+w*m13

z』=x*m20+y*m21+z*m22+w*m23

w=x*m30+y*m31+z*m32+w*m33

由於在3d運算的矩陣中最後一行前3列始終為0,所以w』的結果取決於w,因此可以看出向量與矩陣相乘得到的也是向量。

5.單位矩陣

有一種特殊的矩陣,由左上右下的元素組成的對角線,如果之上的所有元素都為1,且其它為0,該矩陣則稱為單位矩陣,任何頂點與單位矩陣相乘的結果等於該頂點的原始座標,即不發生任何變換。

在opengl中常使用glloadidentity()函式來設定單位矩陣,由於opengl是狀態機,所以每次繪製場景前都用來重置之前可能被修改過的矩陣,但是有時繪製乙個模型必須在之前的計算結果上進行座標變換,比如先畫了一輛汽車的車身,然後根據汽車的當前位置繪製車輪,就必須保持原先的矩陣,相對汽車的位置進行變換,而有時卻要從原點開始計算,所以矩陣的管理是通過一系列的矩陣函式操作的,最常用的是矩陣堆疊的操作,但是由於大多數情況,opengl的矩陣堆疊深度為32,即只能儲存32個矩陣,雖然矩陣堆疊其效率比較快,但是在某些場合32個矩陣是不夠的,為了減少計算機運算負載,必須事先安排好繪製順序,這也是進行類封裝的必要性,不過類的封裝會增加一定的呼叫開銷。

6.矩陣相乘

有時候需要對乙個模型進行連續多種變換,而每次變換都要將模型的前次所有頂點與矩陣一一相乘,如果對於乙個比較複雜的場景進行處理時,其計算量是很可觀的,為了減少計算量,加快場景繪製,採取事先將多種變換矩陣合併,然後對模型所有頂點和矩陣相乘進行一次性矩陣變換。比如要對模型進行先縮放後旋轉。

合併方法是將多個矩陣相乘來計算出復合矩陣。三維變換中參與乘法運算的兩個矩陣都必須是4x4矩陣,相乘時,每個新元素也通過點乘運算後獲得,所得的新矩陣也是4x4的方陣。

矩陣的乘積不可逆的,即mn不等於nm,因此在安排變換時要注意順序,另外,在頂點與復合矩陣相乘的結果是與矩陣合併順序相反的。比如,t是乙個平移矩陣,r是乙個旋轉矩陣,假如要進行先旋轉後移動的變換順序,合併矩陣的順序必須是m=tr,然後進行p』=mp的 變換,其效果等同於p』=t(rp)。

矩陣相乘的計算公式分解:

復合矩陣計算方式為,將左邊的矩陣m的每個行元素與右邊矩陣n的每列元素進行點乘運算就是新矩陣c的對應的元素。計算順序為,m由上邊第一行開始,提取每行的4個元素,分別與n中左邊第一列開始,提取的4個元素進行點乘運算,運算結果放在c中,並從上到下,從左到右排列,程式設計時採用雙重迴圈。

c00=m00*n00+m01*n10+m02*n20+m03*n30

c01=m00*n01+m01*n11+m02*n21+m03*n31

c02=m00*n02+m01*n12+m02*n22+m03*n32

c03=m00*n03+m01*n13+m02*n23+m03*n33

........

c30=m30*n00+m31*n10+m32*n20+m33*n30

c31=m30*n01+m31*n11+m32*n21+m33*n31

c32=m30*n02+m31*n12+m32*n22+m33*n32

c33=m30*n03+m31*n13+m32*n23+m33*n33

如上所述,經過一系列的計算,分別把兩個矩陣合併起來了,形成了新的復合矩陣,編寫這樣的**是很容易的。現在我們已經有了幾個基本矩陣計算工具,只要填入適當的引數,我們就可以用迴圈的方式變換模型的所有頂點,最終實現模型的任意複雜的變換,基本上都是很機械的操作。而剩下的就屬最核心的東西,就是基本矩陣中元素的生成了。

Maxima 矩陣及向量運算 1

本文最初寫於 2011 07 14於 sohu 部落格,這次部落格搬家一起搬到這裡來。1.1 矩陣和向量的建立 maxima 中有許多方法可以生成矩陣和向量。下面分別來介紹。最直接的方式是直接給出矩陣的每個元素的值。也可以互動式的輸入矩陣的每個元素。使用entermatrix m,n 函式可以進行互...

矩陣運算 矩陣旋轉

以下不加證明地給出在世界座標系中,以座標點 0,0,0 為原點的旋轉矩陣 包含平移的線性變換稱作仿射變換,3d中的仿射變換不能用 3 x 3 矩陣表達,必須使用4 x 4矩陣 1.繞x座標軸旋轉 1 0 0 0 0 cos a sin a 0 0 sin a cos a 0 0 0 0 1 2.繞y...

第十四周專案四 矩陣運算(1)矩陣相加

問題及 在數學中,乙個矩陣由若干行和若干列資料組成,可以直接儲存為乙個二維陣列。1 矩陣相加 兩個矩陣相加,要求其行 列數均相等。運算規則為 乙個n行m列的矩陣a加上另乙個n行m列的矩陣,得到的結果是乙個n行m列的矩陣c,c中的第i行第j列位置上的數等於a和b矩陣第i行第j列上數相加的和。例如 請程...