Partager via


World Transform (Direct3D 9)

La discussion sur la transformation du monde présente 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 de monde change les coordonnées de l’espace de 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 substance, la transformation du monde place un modèle dans le monde; d’où 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 montrant comment les coordonnées mondiales et les coordonnées locales sont liées

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

Configuration d’une matrice mondiale

Comme pour toute 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 locales sont orientés de la même façon que l’espace mondial, la matrice mondiale est la matrice d’identité. Plus généralement, la matrice mondiale est une combinaison d’une traduction dans l’espace du monde 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 de l’utilitaire D3DX pour créer une matrice de monde qui comprend trois rotations pour orienter un modèle et une traduction pour le 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.

Notes

Direct3D utilise les matrices world et view que vous définissez pour configurer plusieurs structures de données internes. Chaque fois que vous définissez un nouveau monde ou une nouvelle matrice de vue, le système recalcule les structures internes associées. La définition de ces matrices fréquemment (par exemple, des milliers de fois par image) prend du temps de calcul. Vous pouvez réduire le nombre de calculs requis en concaténant vos matrices de monde et de vue dans une matrice de vue du monde que vous définissez comme matrice du monde, puis en définissant la matrice d’affichage sur l’identité. Conservez des copies mises en cache des matrices de monde et de vue individuelles afin de pouvoir modifier, concaténer et réinitialiser la matrice du monde en fonction des besoins. Pour plus de clarté, dans cette documentation, les exemples Direct3D utilisent rarement cette optimisation.

 

Transformations