2012-01-29 19 views
5

這裏有兩個不同的代碼片段困惑操作的順序使用XNA矩陣時,C#

這是我開始與

Vector2 hold = Vector2.Transform(pos1, mat1); 
Matrix inv = Matrix.Invert(mat2); 
Vector2 pos2 = Vector2.Transform(hold, inv); 

這就是我說的是簡化版本

Matrix matrix1to2 = mat1 * Matrix.Invert(mat2); 
Vector2 pos2 = Vector2.Transform(pos1, matrix1to2); 

我不明白的是,爲什麼不在simpilifed版本的第一行

Matrix matrix1to2 = Matrix.Invert(mat2)*mat1; 

由於矩陣順序將生效,第一,在我們有MAT1原來正確的事情乘以在第一

編輯: 下圖顯示了操作順序所需

http://www.riemers.net/images/Tutorials/XNA/Csharp/Series2D/mat1.png

本教程指出要創建您使用的轉換;

Matrix carriageMat = Matrix.CreateTranslation(0, -carriage.Height, 0) * Matrix.CreateScale(playerScaling) 
* Matrix.CreateTranslation(xPos, yPos, 0) * Matrix.Identity; 

爲什麼這個工作如果順序是從左到右?

+0

我認爲這是一個http://gamedev.stackexchange.com/問題。你會有更多的反饋。 – rcdmk 2012-01-29 19:11:18

+0

謝謝,我會嘗試。我應該關閉它嗎? – Alxander 2012-01-29 19:13:07

+0

如果你想。 Probaly一些版主會在這裏。 – rcdmk 2012-01-29 19:15:02

回答

3

由於矩陣爲了右側的事情會生效第一 和我們有MAT1原來在第一

其實相乘,「關於東西留下」生效第一。矩陣以與讀取它們相同的順序應用於頂點(假設您習慣拉丁語言)。

在XNA中,您通常會在SRT(Scale,Rotate,Translate)順序中執行轉換。這樣,物體在被移動到世界空間之前將被縮放並圍繞自己的原點旋轉(旋轉在自己的軸上)。

例如:如果我想旋轉以Pi/2的對象,移動它100個單位沿X軸,我可以使用:

var rotate = Matrix.CreateRotationY(MathHelper.PiOver2); 
var translate = Matrix.CreateTranslation(new Vector3(100,0,0)); 

var worldMatrix = rotate * translate; 

相反,如果我想移動的對象向右旋轉100個單位,然後圍繞世界原點(0,0,0)旋轉它以獲得某種軌道效應(而不是像第一個示例中那樣旋轉),我會用

var worldMatrix = translate * rotate; 

您也可以將物體旋轉到軸上,沿世界X軸移動100個單位,它圍繞世界原點的軌道移動:

var worldMatrix = rotateSpin * translate * rotateOrbit; 

其中rotateSpinrotateOrbit是旋轉矩陣定義你的旋轉(旋轉有關對象的起源)和軌道(繞世界座標系原點在翻譯),分別。請注意,操作影響服務頂點的順序是從左到右。