正文

游戏数学(36)

精通C#游戏编程 作者:(英)斯库勒


 

这段代码添加了一个常量单位矩阵和几个构造函数。默认的构造函数通过把单位矩阵传递给拷贝构造函数,将成员初始化为单位矩阵。第二个构造函数就是拷贝构造函数。拷贝构造函数是通过一个参数调用的构造函数,参数的类型与被构造的对象的类型相同。拷贝构造函数复制参数的所有成员数据,所以被创建的对象与参数完全相同。最后一个构造函数接受4个参数,前3个参数是代表每个轴的向量,最后一个参数是代表原点的向量。

8.5.3  矩阵乘法和矩阵与向量的乘法

Matrix类最重要的方法是其乘法方法。乘法用于组合矩阵和顶点位置的变化。只有当第一个矩阵的宽度和第二个矩阵的高度相同时,才可以执行矩阵乘法。矩阵乘法和矩阵与向量的乘法是使用相同的算法执行的。

乘法的定义如下。

C是乘法的结果,i是矩阵A中的行数,k是矩阵B中的列数。j是i和k的可能的和的数量。在矩阵乘法中,相乘矩阵原来的形状不同,结果矩阵的形状也会不同。同样,不要因为这些数学公式看上去让人生畏而感到担心,因为知道如何和何时使用矩阵才是这里最重要的。

在我们的矩阵中,如果包含了最后一列[0,0,0,1],那么它的宽度与高度相等。因此,根据矩阵乘法的定义,编写矩阵乘法的代码如下所示。

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 © 读书网 www.dushu.com 2005-2020, All Rights Reserved.
鄂ICP备15019699号 鄂公网安备 42010302001612号