Condividi tramite


Panoramica delle trasformazioni

Le trasformazioni della matrice gestiscono molti calcoli matematici di basso livello della grafica 3D.

La pipeline di geometria prende come input i vertici. Il motore di trasformazione applica le trasformazioni mondiali, di visualizzazione e di proiezione ai vertici, ritaglia il risultato e passa tutto al rasterizzatore.

Trasformazione e spazio Descrizione
Coordinate del modello nello spazio del modello All'inizio della pipeline, i vertici di un modello sono dichiarati relativi 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 . Le singole coordinate vengono denominate coordinate del modello .
Il mondo si trasforma nello spazio globale La prima fase della pipeline di geometria trasforma i vertici di un modello dal loro sistema di coordinate locale a un sistema di coordinate utilizzato per tutti gli oggetti nella scena. Il processo di riorientamento dei vertici è denominato trasformazione mondo, che converte dallo spazio del modello a un nuovo orientamento denominato spazio mondo. Ogni vertice nello spazio mondiale viene dichiarato usando le coordinate di spazio mondiale .
Trasforma la visualizzazione nello spazio di visualizzazione (spazio della fotocamera) 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 in spazio di visualizzazione (noto anche come spazio della fotocamera ). Si tratta della trasformazione di vista, che converte dallo spazio globale a quello di visualizzazione.
Trasformazione della proiezione in spazio di proiezione La fase successiva è la trasformazione di proiezione, che converte dallo spazio di visualizzazione allo spazio di proiezione. In questa parte della pipeline, gli oggetti vengono in genere ridimensionati in base alla loro distanza dall'osservatore per dare l'illusione di profondità a una scena; gli oggetti vicini vengono fatti apparire più grandi rispetto a quelli distanti. Per semplicità, in questa documentazione si fa riferimento allo spazio in cui i vertici esistono dopo la trasformazione della proiezione come spazio di proiezione . Alcuni libri di grafica 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 denominata proiezione affine o ortogonale.
Ritaglio nello spazio dello schermo Nella parte finale della pipeline, tutti i vertici che non saranno visibili sullo schermo vengono rimossi, in modo che il rasterizzatore non impieghi tempo a 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. Le matrici creano trasformazioni 3D. È possibile combinare matrici per produrre una singola matrice che include più trasformazioni.

È possibile trasformare le coordinate tra lo spazio del modello, lo spazio globale e lo spazio di visualizzazione.

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 riga-colonna. 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 le matrici come array bidimensionale, utilizzando una struttura matrix. Nell'esempio seguente viene illustrato come inizializzare una struttura D3DMATRIX per fungere da matrice di scalabilità uniforme (fattore di scala "s").

D3DMATRIX scale = {
    5.0f,            0.0f,            0.0f,            0.0f,
    0.0f,            5.0f,            0.0f,            0.0f,
    0.0f,            0.0f,            5.0f,            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

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

Ruota

Le trasformazioni descritte qui sono destinate a sistemi di coordinate sinistrorse e 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.

Il codice seguente illustra una funzione per gestire la rotazione sull'asse X.

    // Inputs are a pointer to a matrix (pOut) and an angle in radians.
    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;
}

Matrici di concatenazione

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.

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. Immagina di creare la matrice del mondo per un disco volante stereotipico. Probabilmente si desidera ruotare il disco volante intorno al suo centro, l'asse y dello spazio del modello, e trasferirlo 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 di traslare il disco volante nella sua posizione nel mondo e quindi ruotarlo intorno all'origine del mondo.

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

Trasformazioni