Partager via


World Transform (Direct3D 9)

La discussion sur la transformation mondiale introduit des concepts de base et fournit des détails sur la façon de configurer une transformation mondiale.

Qu’est-ce qu’une transformation mondiale ?

Une transformation mondiale change les coordonnées de l’espace du modèle, où les sommets sont définis par rapport à l’origine locale d’un modèle, à l’espace mondial, où les sommets sont définis par rapport à une origine commune à tous les objets d’une scène. En essence, le monde transforme un modèle dans le monde ; donc son nom. Le diagramme suivant montre la relation entre le système de coordonnées mondial et le système de coordonnées local d’un modèle.

diagramme de la façon dont les coordonnées mondiales et les coordonnées locales sont liées

La transformation mondiale peut inclure n’importe quelle combinaison de traductions, rotations et mises à l’échelle.

Configuration d’une matrice mondiale

Comme avec n’importe quelle autre transformation, créez la transformation mondiale en concaténant une série de matrices en une matrice unique qui contient la somme totale de leurs effets. Dans le cas le plus simple, lorsqu’un modèle est à l’origine du monde et que ses axes de coordonnées locaux sont orientés de la même façon que l’espace mondial, la matrice du monde est la matrice d’identité. Plus souvent, la matrice mondiale est une combinaison d’une traduction dans l’espace mondial et éventuellement d’une ou plusieurs rotations pour transformer le modèle en fonction des besoins.

L’exemple suivant, à partir d’une classe de modèle 3D fictive écrite en C++, utilise les fonctions d’assistance incluses dans la bibliothèque utilitaire D3DX pour créer une matrice mondiale qui comprend trois rotations pour orienter un modèle et une traduction pour la déplacer par rapport à sa position dans l’espace mondial.

/*
 * 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);
    }
}

Après avoir préparé la matrice mondiale, appelez la méthode IDirect3DDevice9 ::SetTransform pour la définir, en spécifiant la macro D3DTS_WORLD pour le premier paramètre.

Note

Direct3D utilise les matrices mondiales et d’affichage que vous avez définies pour configurer plusieurs structures de données internes. Chaque fois que vous définissez une nouvelle matrice de monde ou d’affichage, le système recalcule les structures internes associées. La définition de ces matrices fréquemment, par exemple, des milliers de fois par trame est fastidieuse de calcul. Vous pouvez réduire le nombre de calculs requis en concaténant vos matrices de monde et d’affichage dans une matrice d’affichage mondial que vous définissez comme matrice mondiale, puis en définissant la matrice d’affichage sur l’identité. Conservez les copies mises en cache des matrices de monde et d’affichage individuelles afin que vous puissiez modifier, concaténer et réinitialiser la matrice mondiale si nécessaire. Pour plus de clarté, dans cette documentation, les exemples Direct3D utilisent rarement cette optimisation.

 

transformations