正文

游戲數(shù)學(xué)(36)

精通C#游戲編程 作者:(英)斯庫(kù)勒


 

這段代碼添加了一個(gè)常量單位矩陣和幾個(gè)構(gòu)造函數(shù)。默認(rèn)的構(gòu)造函數(shù)通過(guò)把單位矩陣傳遞給拷貝構(gòu)造函數(shù),將成員初始化為單位矩陣。第二個(gè)構(gòu)造函數(shù)就是拷貝構(gòu)造函數(shù)??截悩?gòu)造函數(shù)是通過(guò)一個(gè)參數(shù)調(diào)用的構(gòu)造函數(shù),參數(shù)的類型與被構(gòu)造的對(duì)象的類型相同??截悩?gòu)造函數(shù)復(fù)制參數(shù)的所有成員數(shù)據(jù),所以被創(chuàng)建的對(duì)象與參數(shù)完全相同。最后一個(gè)構(gòu)造函數(shù)接受4個(gè)參數(shù),前3個(gè)參數(shù)是代表每個(gè)軸的向量,最后一個(gè)參數(shù)是代表原點(diǎn)的向量。

8.5.3  矩陣乘法和矩陣與向量的乘法

Matrix類最重要的方法是其乘法方法。乘法用于組合矩陣和頂點(diǎn)位置的變化。只有當(dāng)?shù)谝粋€(gè)矩陣的寬度和第二個(gè)矩陣的高度相同時(shí),才可以執(zhí)行矩陣乘法。矩陣乘法和矩陣與向量的乘法是使用相同的算法執(zhí)行的。

乘法的定義如下。

C是乘法的結(jié)果,i是矩陣A中的行數(shù),k是矩陣B中的列數(shù)。j是i和k的可能的和的數(shù)量。在矩陣乘法中,相乘矩陣原來(lái)的形狀不同,結(jié)果矩陣的形狀也會(huì)不同。同樣,不要因?yàn)檫@些數(shù)學(xué)公式看上去讓人生畏而感到擔(dān)心,因?yàn)橹廊绾魏秃螘r(shí)使用矩陣才是這里最重要的。

在我們的矩陣中,如果包含了最后一列[0,0,0,1],那么它的寬度與高度相等。因此,根據(jù)矩陣乘法的定義,編寫(xiě)矩陣乘法的代碼如下所示。

public static Matrix operator *(Matrix mA, Matrix mB)

{

Matrix result = new Matrix();

result._m11 = mA._m11 * mB._m11 + mA._m12 * mB._m21 + mA._m13 * mB._m31;

result._m12 = mA._m11 * mB._m12 + mA._m12 * mB._m22 + mA._m13 * mB._m32;

result._m13 = mA._m11 * mB._m13 + mA._m12 * mB._m23 + mA._m13 * mB._m33;

result._m21 = mA._m21 * mB._m11 + mA._m22 * mB._m21 + mA._m23 * mB._m31;

result._m22 = mA._m21 * mB._m12 + mA._m22 * mB._m22 + mA._m23 * mB._m32;

result._m23 = mA._m21 * mB._m13 + mA._m22 * mB._m23 + mA._m23 * mB._m33;

result._m31 = mA._m31 * mB._m11 + mA._m32 * mB._m21 + mA._m33 * mB._m31;

result._m32 = mA._m31 * mB._m12 + mA._m32 * mB._m22 + mA._m33 * mB._m32;

result._m33 = mA._m31 * mB._m13 + mA._m32 * mB._m23 + mA._m33 * mB._m33;

result._m41 = mA._m41 * mB._m11 + mA._m42 * mB._m21 + mA._m43 * mA._m31 +

mB._m41;

result._m42 = mA._m41 * mB._m12 + mA._m42 * mB._m22 + mA._m43 * mB._m32 +

mB._m42;

result._m43 = mA._m41 * mB._m13 + mA._m42 * mB._m23 + mA._m43 * mB._m33 +

mB._m43;

return result;

}

向量與矩陣的乘法類似。

public static Vector operator *(Vector v, Matrix m)

{

return new Vector(v.X * m._m11 + v.Y * m._m21 + v.Z * m._m31 + m._m41,

v.X * m._m12 + v.Y * m._m22 + v.Z * m._m32 + m._m42,

v.X * m._m13 + v.Y * m._m23 + v.Z * m._m33 + m._m43);

}


上一章目錄下一章

Copyright ? 讀書(shū)網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號(hào) 鄂公網(wǎng)安備 42010302001612號(hào)