Condividi tramite


Trasformazioni (Direct3D 9)

La parte di Direct3D che esegue il push della geometria attraverso la pipeline geometry della funzione fissa è il motore di trasformazione. Individua il modello e il visualizzatore nel mondo, proietta i vertici per la visualizzazione sullo schermo e ritaglia i vertici nel viewport. Il motore di trasformazione esegue anche calcoli di illuminazione per determinare componenti diffusi e speculari in ogni vertice.

La pipeline geometry accetta vertici come input. Il motore di trasformazione applica le trasformazioni mondo, visualizzazione e proiezione ai vertici, ritaglia il risultato e passa tutto al rasterizzatore.

All'inizio della pipeline, i vertici di un modello vengono dichiarati rispetto a un sistema di coordinate locale. Si tratta di un'origine locale e di un orientamento. Questo orientamento delle coordinate viene spesso definito spazio del modello e le singole coordinate sono denominate coordinate del modello.

La prima fase della pipeline geometry trasforma i vertici di un modello dal sistema di coordinate locale a un sistema di coordinate utilizzato da tutti gli oggetti in una scena. Il processo di riorientamento dei vertici è detto trasformazione globale. Questo nuovo orientamento viene comunemente definito spazio globale e ogni vertice nello spazio globale viene dichiarato usando le coordinate del mondo.

Nella fase successiva, i vertici che descrivono il mondo 3D sono orientati rispetto a una fotocamera. Ovvero, l'applicazione sceglie un punto di vista per la scena e le coordinate dello spazio globale vengono spostate e ruotate intorno alla visualizzazione della fotocamera, trasformando lo spazio globale nello spazio della fotocamera. Questa è la trasformazione della visualizzazione.

La fase successiva è la trasformazione di proiezione. In questa parte della pipeline, gli oggetti vengono in genere ridimensionati in relazione alla loro distanza dal visualizzatore per dare l'illusione di profondità a una scena; gli oggetti close vengono creati per apparire più grandi di oggetti distanti e così via. Per semplicità, questa documentazione fa riferimento allo spazio in cui esistono vertici dopo la trasformazione della proiezione come spazio di proiezione. Alcuni libri grafici potrebbero fare riferimento allo spazio di proiezione come spazio omogeneo post-prospettiva. Non tutte le trasformazioni di proiezione ridimensionano le dimensioni degli oggetti in una scena. Una proiezione come questa è talvolta detta proiezione affine o ortogonale.

Nella parte finale della pipeline, tutti i vertici che non saranno visibili sullo schermo vengono rimossi, in modo che il rasterizzatore non prenda il tempo necessario per calcolare i colori e l'ombreggiatura per qualcosa che non verrà mai visto. Questo processo è denominato ritaglio. Dopo il ritaglio, i vertici rimanenti vengono ridimensionati in base ai parametri del riquadro di visualizzazione e convertiti in coordinate dello schermo. I vertici risultanti, visualizzati sullo schermo quando la scena viene rasterizzata, esistono nello spazio dello schermo.

Le trasformazioni vengono usate per convertire la geometria dell'oggetto da uno spazio di coordinate a un altro. Direct3D usa matrici per eseguire trasformazioni 3D. Questa sezione illustra come le matrici creano trasformazioni 3D, descrivono alcuni usi comuni per le trasformazioni e illustrano in dettaglio come combinare matrici per produrre una singola matrice che include più trasformazioni.

  • World Transform (Direct3D 9): convertire dallo spazio del modello allo spazio globale
  • View Transform (Direct3D 9): eseguire la conversione dallo spazio globale allo spazio di visualizzazione
  • trasformazione di proiezione (Direct3D 9): convertire dallo spazio di visualizzazione allo spazio di proiezione

Trasformazioni matrice

Nelle applicazioni che usano grafica 3D, è possibile usare trasformazioni geometriche per eseguire le operazioni seguenti:

  • Esprimere la posizione di un oggetto rispetto a un altro oggetto.
  • Ruotare e ridimensionare gli oggetti.
  • Modificare le posizioni di visualizzazione, le direzioni e le prospettive.

È possibile trasformare qualsiasi punto (x,y,z) in un altro punto (x', y', z') usando una matrice 4x4, come illustrato nell'equazione seguente.

equazione di trasformare qualsiasi punto in un altro punto

Eseguire le equazioni seguenti su (x, y, z) e la matrice per produrre il punto (x', y', z').

equazioni per il nuovo punto

Le trasformazioni più comuni sono traslazione, rotazione e ridimensionamento. È possibile combinare le matrici che producono questi effetti in una singola matrice per calcolare più trasformazioni contemporaneamente. Ad esempio, è possibile creare una singola matrice per tradurre e ruotare una serie di punti.

Le matrici vengono scritte in ordine di colonna di riga. Una matrice che ridimensiona uniformemente i vertici lungo ogni asse, noto come scala uniforme, è rappresentata dalla matrice seguente usando la notazione matematica.

equazione di una matrice per la scalabilità uniforme

In C++, Direct3D dichiara matrici come matrice bidimensionale, usando la struttura D3DMATRIX. Nell'esempio seguente viene illustrato come inizializzare una struttura D3DMATRIX per fungere da matrice di ridimensionamento uniforme.

// In this example, s is a variable of type float.

D3DMATRIX scale = {
    s,               0.0f,            0.0f,            0.0f,
    0.0f,            s,               0.0f,            0.0f,
    0.0f,            0.0f,            s,               0.0f,
    0.0f,            0.0f,            0.0f,            1.0f
};

Traduci

L'equazione seguente converte il punto (x, y, z) in un nuovo punto (x', y', z').

equazione di una matrice di traslazione per un nuovo punto

È possibile creare manualmente una matrice di traduzione in C++. Nell'esempio seguente viene illustrato il codice sorgente di una funzione che crea una matrice per convertire i vertici.

D3DXMATRIX Translate(const float dx, const float dy, const float dz) {
    D3DXMATRIX ret;

    D3DXMatrixIdentity(&ret);
    ret(3, 0) = dx;
    ret(3, 1) = dy;
    ret(3, 2) = dz;
    return ret;
}    // End of Translate

Per praticità, la libreria di utilità D3DX fornisce la funzioneD3DXMatrixTranslation.

Scala

L'equazione seguente ridimensiona il punto (x, y, z) in base a valori arbitrari nelle direzioni x, y e z in un nuovo punto (x', y', z').

equazione di una matrice di scala per un nuovo punto

Ruotare

Le trasformazioni descritte di seguito sono destinate a sistemi di coordinate sinistrorse, quindi possono essere diverse dalle matrici di trasformazione viste altrove.

L'equazione seguente ruota il punto (x, y, z) attorno all'asse x, producendo un nuovo punto (x', y', z').

equazione di una matrice di rotazione x per un nuovo punto

L'equazione seguente ruota il punto attorno all'asse y.

equazione di una matrice di rotazione y per un nuovo punto

L'equazione seguente ruota il punto attorno all'asse z.

equazione di una matrice di rotazione z per un nuovo punto

In queste matrici di esempio, la lettera greca theta sta per l'angolo di rotazione, in radianti. Gli angoli vengono misurati in senso orario quando si guarda lungo l'asse di rotazione verso l'origine.

In un'applicazione C++ usare D3DXMatrixRotationX, D3DXMatrixRotationYe D3DXMatrixRotationZ funzioni fornite dalla libreria di utilità D3DX per creare matrici di rotazione. Di seguito è riportato il codice per la funzione D3DXMatrixRotationX.

D3DXMATRIX* WINAPI D3DXMatrixRotationX
    ( D3DXMATRIX *pOut, float angle )
{
#if DBG
    if(!pOut)
        return NULL;
#endif

    float sin, cos;
    sincosf(angle, &sin, &cos);  // Determine sin and cos of angle

    pOut->_11 = 1.0f; pOut->_12 =  0.0f;   pOut->_13 = 0.0f; pOut->_14 = 0.0f;
    pOut->_21 = 0.0f; pOut->_22 =  cos;    pOut->_23 = sin;  pOut->_24 = 0.0f;
    pOut->_31 = 0.0f; pOut->_32 = -sin;    pOut->_33 = cos;  pOut->_34 = 0.0f;
    pOut->_41 = 0.0f; pOut->_42 =  0.0f;   pOut->_43 = 0.0f; pOut->_44 = 1.0f;

    return pOut;
}

Concatenazione di matrici

Uno dei vantaggi dell'uso delle matrici è che è possibile combinare gli effetti di due o più matrici moltiplicandoli. Ciò significa che, per ruotare un modello e convertirlo in una posizione, non è necessario applicare due matrici. Si moltiplicano invece le matrici di rotazione e traslazione per produrre una matrice composita contenente tutti i relativi effetti. Questo processo, denominato concatenazione matrice, può essere scritto con l'equazione seguente.

equazione della concatenazione di matrici

In questa equazione C è la matrice composita creata e M₁ tramite Mn sono le singole matrici. Nella maggior parte dei casi, vengono concatenate solo due o tre matrici, ma non esiste alcun limite.

Usare la funzioneD3DXMatrixMultiplyper eseguire la moltiplicazione della matrice.

L'ordine in cui viene eseguita la moltiplicazione della matrice è fondamentale. La formula precedente riflette la regola da sinistra a destra della concatenazione della matrice. Ovvero, gli effetti visibili delle matrici usate per creare una matrice composita si verificano in ordine da sinistra a destra. Nell'esempio seguente viene illustrata una tipica matrice globale. Si supponga di creare la matrice mondiale per una salsa volante stereotipica. Probabilmente si vuole ruotare il sugo volante intorno al suo centro, l'asse y dello spazio del modello, e convertirlo in un'altra posizione nella scena. Per ottenere questo effetto, creare prima una matrice di rotazione e quindi moltiplicarla per una matrice di traslazione, come illustrato nell'equazione seguente.

equazione di rotazione basata su una matrice di rotazione e una matrice di traslazione

In questa formula, R y è una matrice per la rotazione sull'asse y e Tw è una conversione in una posizione nelle coordinate del mondo.

L'ordine in cui si moltiplicano le matrici è importante perché, a differenza della moltiplicazione di due valori scalari, la moltiplicazione della matrice non è commutativa. La moltiplicazione delle matrici nell'ordine opposto ha l'effetto visivo della conversione della salsa volante nella sua posizione spaziale globale e quindi ruotandola intorno all'origine mondiale.

Indipendentemente dal tipo di matrice che si sta creando, ricordare la regola da sinistra a destra per assicurarsi di ottenere gli effetti previsti.

introduttive