Freigeben über


Welttransformation (Direct3D 9)

Die Diskussion der Welttransformation führt grundlegende Konzepte ein und enthält Details dazu, wie eine Welttransformation eingerichtet werden kann.

Was ist eine Welttransformation?

Eine Welttransformation ändert koordinaten vom Modellraum, in dem Scheitelpunkte relativ zum lokalen Ursprung eines Modells definiert werden, in den Weltraum, in dem Scheitelpunkte relativ zu einem Ursprung definiert werden, der allen Objekten in einer Szene gemeinsam ist. Im Wesentlichen platziert die Welt ein Modell in die Welt; daher sein Name. Das folgende Diagramm zeigt die Beziehung zwischen dem Weltkoordinatensystem und dem lokalen Koordinatensystem eines Modells.

Diagramm der Beziehung zwischen Weltkoordinaten und lokalen Koordinaten

Die Welttransformation kann eine beliebige Kombination aus Übersetzungen, Drehungen und Skalierungen umfassen.

Einrichten einer Weltmatrix

Wie bei jeder anderen Transformation erstellen Sie die Welttransformation, indem Sie eine Reihe von Matrizen in einer einzelnen Matrix verketten, die die Summe ihrer Effekte enthält. Im einfachsten Fall, wenn sich ein Modell am Weltursprung befindet und seine lokalen Koordinatenachsen genauso ausgerichtet sind wie der Weltraum, ist die Weltmatrix die Identitätsmatrix. In der Regel ist die Weltmatrix eine Kombination aus einer Übersetzung in den Weltraum und möglicherweise einer oder mehreren Drehungen, um das Modell nach Bedarf zu drehen.

Im folgenden Beispiel wird aus einer fiktiven 3D-Modellklasse, die in C++ geschrieben wurde, die Hilfsfunktionen der D3DX-Hilfsprogrammbibliothek verwendet, um eine Weltmatrix zu erstellen, die drei Drehungen zum Ausrichten eines Modells und eine Übersetzung enthält, um es relativ zu seiner Position im Weltraum zu verschieben.

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

Nachdem Sie die Weltmatrix vorbereitet haben, rufen Sie die IDirect3DDevice9::SetTransform-Methode auf, um sie festzulegen, und geben Sie dabei das makro D3DTS_WORLD für den ersten Parameter an.

Hinweis

Direct3D verwendet die Welt- und Ansichtsmatrizen, die Sie festlegen, um mehrere interne Datenstrukturen zu konfigurieren. Jedes Mal, wenn Sie eine neue Welt- oder Sichtmatrix festlegen, berechnet das System die zugeordneten internen Strukturen neu. Das häufige Festlegen dieser Matrizen – z. B. tausende Male pro Frame – ist rechenaufwändig. Sie können die Anzahl der erforderlichen Berechnungen minimieren, indem Sie Ihre Welt- und Ansichtsmatrizen in einer Weltansichtsmatrix verketten, die Sie als Weltmatrix festlegen, und dann die Ansichtsmatrix auf die Identität festlegen. Speichern Sie zwischengespeicherte Kopien einzelner Welt- und Ansichtsmatrizen, damit Sie die Weltmatrix nach Bedarf ändern, verketten und zurücksetzen können. Aus Gründen der Übersichtlichkeit verwenden Direct3D-Beispiele in dieser Dokumentation selten diese Optimierung.

 

Transformationen