使用這段代碼,可以對我們將使用的任何矩陣求逆。
關于Matrix類的內容就是這些,現在這個類對于2D和3D應用程序都適用。接下來就實際使用這個類。
8.5.7 對精靈執(zhí)行矩陣操作
創(chuàng)建一個新的游戲狀態(tài)MatrixTestState。這個狀態(tài)將繪制一個精靈,并對該精靈應用各種矩陣。下面是繪制精靈的代碼,你應該已經很熟悉這段代碼了。
class MatrixTestState : IGameObject
{
Sprite _faceSprite = new Sprite();
Renderer _renderer = new Renderer();
public MatrixTestState(TextureManager textureManager)
{
_faceSprite.Texture = textureManager.Get("face");
Gl.glEnable(Gl.GL_TEXTURE_2D);
}
public void Render()
{
Gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
_renderer.DrawSprite(_faceSprite);
_renderer.Render();
}
public void Update(double elapsedTime)
{
}
}
代碼中使用了前面章節(jié)中用到的臉部精靈。矩陣將在MatrixTestState構造函數中應用到精靈上。
Matrix m = new Matrix();
m.SetRotate(new Vector(0, 0, 1), Math.PI/5);
for (int i = 0; i < _faceSprite.VertexPositions.Length; i++ )
{
_faceSprite.VertexPositions[i] *= m;
}
運行代碼,可以注意到臉部已經被旋轉過了。旋轉是沿著Z軸(0,0,1)執(zhí)行的,這是從屏幕內部指向外部的軸。把臉部精靈想象成屏幕上的一張紙。為了進行旋轉,你在紙上按了一個圖釘,使其附著到屏幕上了。圖釘就代表Z軸。旋轉紙精靈就是在沿著該軸旋轉。對于正射投影中的2D對象,Y軸和Z軸對于旋轉來說沒有什么用處,但是在3D游戲中就不一樣了。任何一個歸一化的軸都可以用于旋轉對象,不只是X、Y和Z這3個主軸。
在代碼示例中,旋轉量以弧度Math.PI/5給出,這個值等于36°。旋轉矩陣將被應用到組成精靈的每個頂點。我們現在已經使用了一個稍微旋轉了精靈的矩陣。接下來就添加一個縮放精靈的矩陣。通過使用矩陣乘法,縮放矩陣將與旋轉矩陣結合起來。修改構造函數中的已有代碼,使其如下所示。
Matrix m = new Matrix();
m.SetRotate(new Vector(0, 0, 1),Math.PI/5);
Matrix mScale = new Matrix();
mScale.SetScale(new Vector(2.0, 2.0, 0.0));
m *= mScale;
for (int i = 0; i < _faceSprite.VertexPositions.Length; i++ )
{
_faceSprite.VertexPositions[i] *= m;
}
這段代碼創(chuàng)建的縮放矩陣將對象在X軸和Y軸上放大一倍。這個矩陣和旋轉矩陣通過矩陣乘法結合到一起,然后把結果賦值給矩陣m。然后這個合并后的矩陣m被應用到臉部精靈,以縮放和旋轉該精靈。矩陣乘法的順序很重要:將矩陣a和矩陣b相乘的結果不一定與將矩陣b和矩陣a相乘的結果相同。嘗試采用不同的矩陣,以熟悉它們之間相互組合后可以得到什么樣的結果。
最后的代碼段將演示逆矩陣。逆矩陣會逆轉一個矩陣操作。如果將旋轉-縮放矩陣乘以其逆矩陣,結果將是一個單位矩陣。對精靈應用單位矩陣時,不會產生任何效果。
Matrix m = new Matrix();
m.SetRotate(new Vector(0, 0, 1),Math.PI/5);
Matrix mScale = new Matrix();
mScale.SetScale(new Vector(2.0, 2.0, 2.0));
m *= mScale;
Vector scale = m.GetScale();
m *= m.Inverse();
for (int i = 0; i < _faceSprite.VertexPositions.Length; i++ )
{
_faceSprite.VertexPositions[i] *= m;
}
你還可以嘗試平移矩陣,并試著以不同的順序組合矩陣,看看會得到什么效果。