Trasformazioni (Direct3D 9)

La parte di Direct3D che esegue il push della geometria della geometria della funzione fissa è il motore di trasformazione. Individua il modello e il visualizzatore nel mondo, i vertici dei progetti per la visualizzazione sullo schermo e i vertici delle clip al riquadro di visualizzazione. 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 il mondo, la visualizzazione e la proiezione ai vertici, clip il risultato e passa tutto al rasterizer.

Alla testa 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 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 è chiamato trasformazione del mondo. Questo nuovo orientamento viene comunemente definito spazio mondiale e ogni vertice nello spazio mondiale viene dichiarato usando coordinate mondiali.

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 spaziali del mondo vengono spostate e ruotate intorno alla visualizzazione della fotocamera, trasformando lo spazio mondiale nello spazio della fotocamera. Si tratta della trasformazione della visualizzazione.

La fase successiva è la trasformazione della proiezione. In questa parte della pipeline, gli oggetti vengono in genere ridimensionati in relazione alla distanza dal visualizzatore per dare l'illusione di profondità a una scena; gli oggetti close vengono creati per essere più grandi di oggetti distanti e così via. Per semplicità, questa documentazione fa riferimento allo spazio in cui i vertici esistono 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 proiezioni trasformano le dimensioni degli oggetti in una scena. Una proiezione come questa è talvolta chiamata 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 abbia tempo per calcolare i colori e l'ombreggiatura per qualcosa che non verrà mai visto. Questo processo viene chiamato 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, descrive alcuni usi comuni per le trasformazioni e illustra in dettaglio come combinare matrici per produrre una singola matrice che include più trasformazioni.

Trasformazioni con matrice

Nelle applicazioni che funzionano con 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 della trasformazione di 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 la conversione, la rotazione e il ridimensionamento. È possibile combinare le matrici che producono questi effetti in una singola matrice per calcolare diverse 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 scala in modo uniforme i vertici lungo ogni asse, nota come ridimensionamento uniforme, è rappresentata dalla matrice seguente usando la notazione matematica.

equazione di una matrice per il ridimensionamento 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 scalabilità 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 traduzione per un nuovo punto

È possibile creare manualmente una matrice di traduzione in C++. Nell'esempio seguente viene illustrato il codice sorgente per una funzione che crea una matrice per tradurre 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 funzione D3DXMatrixTranslation .

Scalabilità

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

equazione di una matrice di scala per un nuovo punto

Ruota

Le trasformazioni descritte di seguito sono per i sistemi di coordinate a sinistra e quindi possono essere diverse dalle matrici di trasformazione visualizzate altrove.

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

equazione di una matrice di rotazione x per un nuovo punto

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

equazione di una matrice di rotazione y per un nuovo punto

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

equazione di una matrice di rotazione z per un nuovo punto

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

In un'applicazione C++ usare le funzioni D3DXMatrixRotationX, D3DXMatrixRotationY e D3DXMatrixRotationZ 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;
}

Concatenare matrici

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

equazione della concatenazione matrice

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

Usare la funzione D3DXMatrixMultiply per eseguire la moltiplicazione della matrice.

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

equazione dello spin basato su una matrice di rotazione e una matrice di traduzione

In questa formula Ry è 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 alla sua posizione spaziale mondiale, 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.

Per iniziare