DirectX/Calcolo vettoriale: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m new key for Category:DirectX: "Calcolo vettoriale" using HotCat
m Update syntaxhighlight tags - remove use of deprecated <source> tags
 
Riga 54:
==Lavorare con i vettori in DirectX==
Un vettore generico a 3 dimensioni è definito dalla libreria Direct3D come:
<sourcesyntaxhighlight lang="cpp">
struct D3DVECTOR
{
float x, y, z;
};
</syntaxhighlight>
</source>
Quindi per sommare due vettori il codice sarebbe:
<sourcesyntaxhighlight lang="cpp">
D3DVECTOR a, b;
// Riempiamo i vettori con dei dati...
Riga 70:
somma.y = a.y + b.y;
somma.z = a.z + b.z;
</syntaxhighlight>
</source>
Tuttavia la libreria Direct3DX viene in nostro aiuto con una fantastica classe:
<sourcesyntaxhighlight lang="cpp">
class D3DXVECTOR3 : public D3DVECTOR
{
Riga 79:
// [...]
};
</syntaxhighlight>
</source>
I costruttori di D3DXVECTOR3 permettono la creazione di un vettore nullo, un vettore copiato da un altro vettore e di un vettore date le tre coordinate. La grande comodità di questa classe è di supportare somma, differenza, moltiplicazione e divisione con scalari, oltre al confronto. Gestire i vettori diventa ora molto più semplice:
<sourcesyntaxhighlight lang="cpp">
D3DXVECTOR3 v1(); // x = y = z = 0
D3DXVECTOR3 v2(3.0); // x = y = z = 3.0
Riga 90:
v2 = v1 + v3; // Somma vettoriale
v4 = v2 * 5; // Prodotto con costante
</syntaxhighlight>
</source>
Allo stesso modo esistono D3DXVECTOR2 e D3DXVECTOR4 (poi capiremo a cosa serve).
 
===Lunghezza del vettore===
Per leggere la lunghezza, o il modulo, effettiva del vettore (e non le sue componenti) D3DX mette a disposizione queste funzioni:
<sourcesyntaxhighlight lang="cpp">
float D3DXVec2Length(D3DXVECTOR2 *pV);
float D3DXVec3Length(D3DXVECTOR3 *pV);
float D3DXVec4Length(D3DXVECTOR4 *pV);
</syntaxhighlight>
</source>
 
===Normalizzazione di vettori===
Abbiamo visto che normalizzare un vettore vuol dire dividere ogni componente per il modulo del vettore stesso al fine di ottenere un modulo pari ad 1. Le classi D3DXVECTOR# non contengono funzioni come ''Normalize'', ma D3DX ci fornisce una funzione per ottenere lo stesso effetto. Queste funzioni vogliono un puntatore dove mettere il risultato che poi verrà anche restituito dalla funzione stessa. Quindi questa funzione non crea un nuovo vettore ma ne richiede due: l'originale da normalizzare e la destinazione in cui riportare il risultato. E' anche possibile far coincidere pOut e pIn, perdendo però il vettore originale.
<sourcesyntaxhighlight lang="cpp">
D3DXVECTOR2 *D3DXVec2Normalize(D3DXVECTOR2 *pOut, D3DXVECTOR2 *pIn);
D3DXVECTOR3 *D3DXVec3Normalize(D3DXVECTOR3 *pOut, D3DXVECTOR3 *pIn);
Riga 113:
D3DXVECTOR2 b(-4.5, 0.99);
D3DXVec2Normalize(&b, &b);
</syntaxhighlight>
</source>
 
===Prodotto scalare===
Anche per il prodotto scalare la classe D3DXVECTOR# non presenta funzioni utili. Tra l'altro la funzione ''operator*'' è utilizzata per il prodotto con scalare. Quindi il seguente codice è errato:
<sourcesyntaxhighlight lang="cpp">
D3DXVECTOR3 a(5.0), b(3.2);
D3DXVECTOR3 res = a * b; // L'operatore * moltiplica solo vettori con scalari.
</syntaxhighlight>
</source>
 
Per il prodotto scalare (Dot product) D3DX fornisce i seguenti metodi:
<sourcesyntaxhighlight lang="cpp">
float D3DXVec2Dot(D3DXVECTOR2 *pV1, D3DXVECTOR2 *pV2);
float D3DXVec3Dot(D3DXVECTOR3 *pV1, D3DXVECTOR3 *pV2);
float D3DXVec4Dot(D3DXVECTOR4 *pV1, D3DXVECTOR4 *pV2);
</syntaxhighlight>
</source>
Tutte le versioni prendono come argomenti due puntatori a D3DXVECTOR#, di cui verrà calcolato il prodotto scalare (che restituisce un valore scalare, ricordiamolo), il cui risultato sarà restituito dalla funzione.
===Prodotto vettoriale===
Infine ci sono funzioni anche per il calcolo del prodotto vettoriale (Cross product). Essendo il prodotto vettoriale non definito per un vettore 2D non esiste un D3DXVec2Cross, ma solo D3DXVec3Cross e D3DXVec4Cross.
<sourcesyntaxhighlight lang="cpp">
D3DXVECTOR3 *D3DXVec3Cross(D3DXVECTOR3 *pOut, D3DXVECTOR3 *pV1, D3DXVECTOR3 *pV2);
D3DXVECTOR4 *D3DXVec4Cross(D3DXVECTOR4 *pOut, D3DXVECTOR4 *pV1, D3DXVECTOR4 *pV2);
</syntaxhighlight>
</source>
In questo caso oltre ai due vettori di partenza viene passato come argomento anche un puntatore a vettore dove verrà inserito il risultato dell'operazione. Il valore di pOut viene anche restituito dalla funzione stessa.