2012-01-29 9 views
5

Qui ci sono due diversi pezzi di codiceConfuso su ordine delle operazioni quando si utilizza una matrice in XNA, C#

Questo è quello che ho iniziato con

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

E questo è quello che mi hanno detto è il versione semplificata

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

Quello che non capisco è, perché non è la prima linea nella versione simpilifed

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

Dal momento che per la matrice cosa sulla destra diventeranno applicabili prima e nell'originale abbiamo mat1 essendo moltiplicata in primo

Edit: L'immagine seguente mostra la sequenza delle operazioni desiderate

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

Il tutorial dice che per creare questa trasformazione si usa;

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

Perché funziona se l'ordine è da sinistra a destra?

+0

Penso che questa sia una domanda http://gamedev.stackexchange.com/. Avrai più feedback lì. – rcdmk

+0

Grazie, ci proverò. Dovrei chiudere questo allora? – Alxander

+0

Se vuoi. Proibisci alcuni moderatori verranno a questo. – rcdmk

risposta

3

Dal momento al fine di matrice la cosa a destra entrerebbe in vigore prima e nell'originale abbiamo mat1 è moltiplicata in primo

In realtà, la "cosa sulla lasciato" ha effetto primo. Le matrici vengono applicate al vertice nello stesso ordine in cui le leggi (assumendo che tu sia abituato a una lingua latina).

In XNA, si eseguono in genere le trasformazioni nell'ordine SRT (scala, rotazione, traduzione). In questo modo, l'oggetto verrà ridimensionato e ruotato attorno alla propria origine (ruotando su un proprio asse) prima di essere spostato nello spazio del mondo.

Ad esempio: se voglio ruotare un oggetto Pi/2, lo spostarla 100 unità lungo l'asse X, che potrebbero utilizzare:

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

var worldMatrix = rotate * translate; 

Se, invece, ho voluto spostare l'oggetto 100 unità a destra, quindi ruotarlo sull'origine mondo (0,0,0) per ottenere una sorta di effetto orbitante (invece di girare come si fa nel primo esempio), userei

var worldMatrix = translate * rotate; 

Puoi anche ruotare l'oggetto sul suo asse, spostarlo di 100 unità lungo l'asse X del mondo, l'orbita attorno all'origine del mondo di:

var worldMatrix = rotateSpin * translate * rotateOrbit; 

dove rotateSpin e rotateOrbit sono matrici di rotazione definiscono girare (rotazione intorno l'origine dell'oggetto) e orbita (rotazione circa l'origine mondo seguente traduzione), rispettivamente. Si noti che l'ordine in cui le operazioni influenzano i vertici del servizio è da sinistra a destra.

Problemi correlati