在這一部分我們關(guān)注的焦點(diǎn)是數(shù)學(xué)中的矩陣。它們?cè)?D圖形學(xué)中的應(yīng)用將在下一部分講解。
一個(gè)m×n的矩陣是由m行和n列的數(shù)字組成的矩陣列。行和列的數(shù)字就是這個(gè)矩陣的維數(shù)。我們通過(guò)寫(xiě)在下方的數(shù)字識(shí)別矩陣清單,數(shù)字中的第一個(gè)表示行第二個(gè)表示列。例如下邊的M是3×3矩陣,B是2×4矩陣,
C是3×2矩陣。

我們使用加粗的大寫(xiě)字母表示矩陣。有時(shí)一個(gè)矩陣只包含一行或者一列。我們用行矩陣和列矩陣這個(gè)特殊的名稱(chēng)來(lái)稱(chēng)呼。例如下邊就是行和列矩陣:

當(dāng)使用行或列矩陣時(shí),我們只用一個(gè)下標(biāo),有時(shí)我們還用字母表示。





當(dāng)設(shè)計(jì)Direct3D應(yīng)用程序時(shí),使用4×4矩陣和1×4行矩陣(向量)是有代表性的。注意使用這兩種矩陣意味著可以進(jìn)行下列定義的矩陣乘法。
n
向量-矩陣乘法。即,假如1×4的單行矩陣V,和4×4的矩陣T,那么積VT可計(jì)算并且返回的結(jié)果是一個(gè)1×4的單行矩陣(向量)。
n
矩陣-矩陣乘法。即,假如4×4的矩陣T,和4×4的矩陣R,那么積TR和RT可計(jì)算并且兩者返回的結(jié)果都是一個(gè)4×4的矩陣。注意因?yàn)榫仃嚦朔ú粷M(mǎn)足交換律所以TR和RT不一定相等。
在D3DX中表示1×4的行矩陣(向量),我們用D3DXVECTOR3和D3DXVECTOR4向量類(lèi)。當(dāng)然D3DXVECTOR3只有3個(gè)成員,不是4個(gè)。然而,第4個(gè)成員缺省是1或0(在下一部分有更多信息)。
在D3DX中表示4×4的矩陣,我們用D3DXMATRIX類(lèi),定義如下:
The D3DXMATRIX class
inherits its data entries from the simpler
D3DMATRIX structure, which is defined as:
觀察D3DXMATRIX類(lèi)發(fā)現(xiàn)有很多有用的運(yùn)算符,比如對(duì)矩陣檢測(cè)相等,矩陣相加和矩陣相減,標(biāo)量與矩陣相乘,類(lèi)型轉(zhuǎn)換(casting),以及非常重要的兩個(gè)D3DXMATRIXs相乘。因?yàn)榫仃囅喑耸欠浅V匾模覀兘o出一段實(shí)例代碼:
D3DXMATRIX A(…);
// initialize A
D3DXMATRIX B(…);
// initialize B
D3DXMATRIX C = A * B;
// C = AB
|
D3DXMATRIX類(lèi)另一個(gè)重要的運(yùn)算符是小括號(hào),它允許我們非常方便的為矩陣成員賦值。注意當(dāng)使用小括號(hào)時(shí)我們的下標(biāo)就象C語(yǔ)言數(shù)組下標(biāo)一樣是從0開(kāi)始的。例如,為一個(gè)矩陣的ij
= 11
賦值,我們寫(xiě)成:
D3DXMATRIX M;
M(0, 0) = 5.0f;
// Set entry ij = 11 to 5.0f.
|
D3DX庫(kù)也提供下列有用的函數(shù):將D3DXMATRIX轉(zhuǎn)化為單位矩陣,轉(zhuǎn)置D3DXMATRIX矩陣以及求逆矩陣。
D3DXMATRIX *D3DXMatrixIdentity(
D3DXMATRIX *pout
//
將矩陣轉(zhuǎn)換為單位矩陣
);
D3DXMATRIX M;
D3DXMatrixIdentity( &M );
// M =
單位矩陣
|
D3DXMATRIX *D3DXMatrixTranspose(
D3DXMATRIX *pOut,
//
輸出的轉(zhuǎn)置矩陣
CONST D3DXMATRIX *pM
//
原矩陣
);
D3DXMATRIX A(...);
//
初始化矩陣A
D3DXMATRIX B;
D3DXMatrixTranspose( &B, &A
); // B =
輸出的轉(zhuǎn)置矩陣
|
假如我們將不能求逆的矩陣用求逆函數(shù),那么函數(shù)將會(huì)返回null.同樣的,這本書(shū)我們忽視第二個(gè)參數(shù),并且總是把它設(shè)置為0。
D3DXMATRIX *D3DXMatrixInverse(
D3DXMATRIX *pOut,
//
輸出的逆矩陣
FLOAT *pDeterminant,
//
除非是必需的,一般設(shè)為0
CONST D3DXMATRIX *pM
//
原矩陣
);
D3DXMATRIX A(...);
//
初始化矩陣
D3DXMATRIX B;
D3DXMatrixInverse( &B, 0,
&A ); // B = A的逆矩陣
|