DirectX/Trasformazioni: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
BimBot (discussione | contributi)
m Bot: Sostituzione automatica (-([Pp])erchè +\1erché)
m Update syntaxhighlight tags - remove use of deprecated <source> tags
Riga 47:
== Utilità delle matrici ==
Allora perché usare le matrici per la traslazione e non direttamente i vettori? Perché le matrici presentano una particolare proprietà: volendo applicare tre trasformazioni ad un dato vertice dovrei fare:
<sourcesyntaxhighlight lang="cpp">
D3DXVECTOR4 Vertex(3, 2, 4.3, 1);
D3DXMATRIX Scale, Rotation, Traslation;
Riga 54:
D3DXVec4Transform(&Vertex, &Vertex, &Rotation);
D3DXVec4Transform(&Vertex, &Vertex, &Traslation);
</syntaxhighlight>
</source>
ma si dimostra che moltiplicando tra loro le tre matrici: <math>Trasformazione = Scale \cdot Rotation \cdot Traslation</math> si ottiene una matrice equivalente e che quindi ci si può ridurre al semplice codice:
<sourcesyntaxhighlight lang="cpp">
D3DXVector4 Vertex;
D3DXMATRIX S, R, T;
D3DXMATRIX Transformation = S * R * T;
D3DXVec4Transform(&Vertex, &Vertex, &Transformation);
</syntaxhighlight>
</source>
L'importanza di questo procedimento la si avverte quando si devono trasformare migliaia di vertici ed applicare tre matrici è alquanto lento. E' molto più rapido calcolare la matrice di trasformazione a priori e poi applicarla ad ogni vertice.
 
== Attenzione ==
La moltiplicazione tra matrici e '''anti-commutativa'''. Quindi:
<sourcesyntaxhighlight lang="cpp">
S * R * T != R * S * T;
</syntaxhighlight>
</source>
Ve ne accorgerete dopo i primi esperimenti. Infatti se disegnamo un cubo di lato due il cui centro coincide con il centro degli assi, quindi di vertici (-1, -1, -1), (1, -1, -1), (-1, 1, -1), ..., (1, 1, 1), se lo ruotiamo intorno all'asse X, otteremo una rotazione del cubo su se stesso, poi traslandolo otterremo un cubo ruotato e traslato. Ma se il cubo lo portiamo ad Y = 5 con una traslazione, la stessa rotazione intorno all'asse X diventerà stavolta una rivoluzione intorno all'asse X.
 
== DirectX e le trasformazioni ==
D3DX mette a disposizione una serie di funzioni per generare matrici di trasformazioni:
<sourcesyntaxhighlight lang="cpp">
D3DXMATRIX *WINAPI D3DXMatrixScaling(D3DXMATRIX *pOut, float sx, float sy, float sz);
D3DXMATRIX *WINAPI D3DXMatrixRotationX(D3DXMATRIX *pOut, float Angle);
Riga 80:
D3DXMATRIX *WINAPI D3DXMatrixRotationAxis(D3DXMATRIX *pOut, D3DXVECTOR3 *pV, float Angle);
D3DXMATRIX *WINAPI D3DXMatrixTranslation(D3DXMATRIX *pOut, float x, float y, float z);
</syntaxhighlight>
</source>
*'''D3DXMatrixScaling''' produce un vettore di ridimensionamento in pOut, basandosi sui valori ''sx'', ''sy'' ed ''sz''.
*'''D3DXMatrixRotationX/Y/Z''' producono un vettore di rotazione intorno all'asse X/Y/Z in pOut di ''Angle'' gradi '''radianti'''. In pratica passano come vettore asse sottointeso (1, 0, 0), (0, 1, 0), (0, 0, 1).