2012-01-29 19 views
5

İşte kod iki farklı parçalarıdırŞaşkın hakkında düzen, C#

Bu benim

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

ile başladı Ve bu ne ben söylendi olduğunu budur basitleştirilmiş versiyonu

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

Anlamadığım vermezken, simpilifed sürümünde ilk satırı değil neden

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

matris sırayla yana ilk ve Mat1 sahip orijinal yürürlüğe girecek sağdaki şey ilk

Düzen çarpıldıktan: Aşağıdaki resim operasyonların sırası

arzu gösterir http://www.riemers.net/images/Tutorials/XNA/Csharp/Series2D/mat1.png

Öğretici, kullandığınız bu dönüşümü oluşturmak için;

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

Sipariş, sipariş doğruysa neden işe yarar?

+0

Bu bir http://gamedev.stackexchange.com/ sorum olduğunu düşünüyorum. Orada daha fazla geri bildiriminiz olacak. – rcdmk

+0

Teşekkürler bunu deneyeceğim. Bunu kapatmalı mıyım? – Alxander

+0

İsterseniz. Probaly bazı moderatörler buna gelecekti. – rcdmk

cevap

3

matris sırayla sağdaki şey birinci ve biz Mat1 sahip orijinal yürürlüğe girecek yana Aslında ilk

yılında çarpıldıktan, "tarihinde şey sol" etkili olur ilk. Matrisler, köşeyi, okuyacağınız sırayla (Latin dilinde kullandığınızı varsayarak) uygulanır.

XNA'da, genellikle SRT (Ölçek, Döndür, Çevir) düzeninde dönüşümler gerçekleştirirsiniz. Bu şekilde, nesne dünya uzayına taşınmadan önce kendi kökeni (dönerek kendi ekseni) etrafında ölçeklenecek ve döndürülecektir.

Örneğin

: Pi/2 ile bir nesneyi döndürmek için istiyorsa, X ekseni boyunca hareket 100 birimler, kullanabilir:

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

var worldMatrix = rotate * translate; 

, bunun yerine, nesne taşımak istiyorsa sağa 100 birim, daha sonra etkisini yörüngedeki (yerine ilk örnekte yapıldığı gibi dönen) bir tür elde etmek, dünya kökenli (0,0,0) hakkında döndürün, ben kullanmak istiyorum

var worldMatrix = translate * rotate; 

Nesneyi kendi ekseni üzerinde de döndürebilir, dünya X ekseni boyunca 100 birimi taşıyabilirsiniz:

var worldMatrix = rotateSpin * translate * rotateOrbit; 

nerede rotateSpin ve rotateOrbit sırasıyla (çevirmenin ardından, dünya kökenli etrafında dönüş) senin dönüşünü (rotasyon nesnenin kökeni hakkında) ve yörüngeye tanımlayan rotasyon matrisleri bulunmaktadır. İşlemlerin servis noktalarınızı etkilediği sıra, soldan sağa doğrudur.