Condividi tramite


Trasformazione globale (Direct3D 9)

La discussione sulla trasformazione globale introduce concetti di base e fornisce informazioni dettagliate su come configurare una trasformazione globale.

Che cos'è una trasformazione globale?

Una trasformazione globale modifica le coordinate dallo spazio del modello, in cui i vertici vengono definiti rispetto all'origine locale di un modello, allo spazio globale, in cui i vertici vengono definiti rispetto a un'origine comune a tutti gli oggetti in una scena. In sostanza, il mondo trasforma un modello nel mondo; di conseguenza il suo nome. Il diagramma seguente illustra la relazione tra il sistema di coordinate globale e il sistema di coordinate locale di un modello.

diagramma del modo in cui le coordinate del mondo e le coordinate locali sono correlate

La trasformazione globale può includere qualsiasi combinazione di traduzioni, rotazioni e ridimensionamenti.

Configurazione di una matrice globale

Come per qualsiasi altra trasformazione, creare la trasformazione globale concatenando una serie di matrici in una singola matrice che contiene la somma totale dei relativi effetti. Nel caso più semplice, quando un modello si trova all'origine globale e i relativi assi di coordinate locali sono orientati allo spazio globale, la matrice globale è la matrice di identità. Più comunemente, la matrice globale è una combinazione di una traslazione nello spazio globale e possibilmente una o più rotazioni per trasformare il modello in base alle esigenze.

Nell'esempio seguente, da una classe di modello 3D fittizia scritta in C++, vengono usate le funzioni helper incluse nella libreria di utilità D3DX per creare una matrice globale che include tre rotazioni per orientare un modello e una traduzione per rilocarla rispetto alla relativa posizione nello spazio globale.

/*
 * For the purposes of this example, the following variables
 * are assumed to be valid and initialized.
 *
 * The m_xPos, m_yPos, m_zPos variables contain the model's
 * location in world coordinates.
 *
 * The m_fPitch, m_fYaw, and m_fRoll variables are floats that 
 * contain the model's orientation in terms of pitch, yaw, and roll
 * angles, in radians.
 */
 
void C3DModel::MakeWorldMatrix( D3DXMATRIX* pMatWorld )
{
    D3DXMATRIX MatTemp;  // Temp matrix for rotations.
    D3DXMATRIX MatRot;   // Final rotation matrix, applied to 
                         // pMatWorld.
 
    // Using the left-to-right order of matrix concatenation,
    // apply the translation to the object's world position
    // before applying the rotations.
    D3DXMatrixTranslation(pMatWorld, m_xPos, m_yPos, m_zPos);
    D3DXMatrixIdentity(&MatRot);

    // Now, apply the orientation variables to the world matrix
    if(m_fPitch || m_fYaw || m_fRoll) {
        // Produce and combine the rotation matrices.
        D3DXMatrixRotationX(&MatTemp, m_fPitch);         // Pitch
        D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
        D3DXMatrixRotationY(&MatTemp, m_fYaw);           // Yaw
        D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
        D3DXMatrixRotationZ(&MatTemp, m_fRoll);          // Roll
        D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
 
        // Apply the rotation matrices to complete the world matrix.
        D3DXMatrixMultiply(pMatWorld, &MatRot, pMatWorld);
    }
}

Dopo aver preparato la matrice globale, chiamare il metodo IDirect3DDevice9::SetTransform per impostarlo, specificando la macro D3DTS_WORLD per il primo parametro.

Nota

Direct3D usa le matrici di mondo e di visualizzazione impostate per configurare diverse strutture di dati interne. Ogni volta che si imposta una nuova matrice di mondo o vista, il sistema ricalcola le strutture interne associate. L'impostazione di queste matrici spesso, ad esempio migliaia di volte per fotogramma, richiede molto tempo. È possibile ridurre al minimo il numero di calcoli necessari concatenando il mondo e visualizzare le matrici in una matrice di visualizzazione globale impostata come matrice globale e quindi impostando la matrice di visualizzazione sull'identità. Conservare le copie memorizzate nella cache delle singole matrici di mondo e di visualizzazione in modo da poter modificare, concatenare e reimpostare la matrice globale in base alle esigenze. Per maggiore chiarezza, in questa documentazione gli esempi Direct3D usano raramente questa ottimizzazione.

 

Trasformazioni