2012-01-29 7 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; 

マトリックスのために右のものは、第1の効果を取ると、元に、我々は最初

編集に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

+0

ありがとう、私はそれを試してみましょう。私はこれを閉じなければなりませんか? – Alxander

+0

必要ならば。告発者の中には、これに参加する司会者もいます。 – rcdmk

答えて

3

行列の順番に右側の事は 第1の効果を取るだろうと元に、我々は最初の

にMAT1乗算されているので実際には、「の事はを残した」有効になります最初。行列は、あなたがそれらを読むのと同じ順序で頂点に適用されます(ラテン語に慣れていると仮定します)。

XNAでは、通常、SRT(スケール、回転、並び替え)順に変換を実行します。そうすることで、オブジェクトは世界空間に移動する前に、独自の原点を基準にしてスケールされ、回転します(自軸上で回転します)。 Iは、PI/2によってX軸に沿って100の単位移動オブジェクトを回転したい場合、私が使用するかもしれない:例えば

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は、それぞれ、(翻訳下記のワールド原点を中心とした回転)あなたのスピン(回転オブジェクトの原点程度)と軌道を定義する回転行列です。操作がサービス頂点に与える影響の順序は、左から右であることに注意してください。

関連する問題