Udostępnij za pośrednictwem


Transformacja świata (Direct3D 9)

Omówienie transformacji świata wprowadza podstawowe pojęcia i zawiera szczegółowe informacje na temat sposobu konfigurowania transformacji świata.

Co to jest transformacja świata?

Transformacja świata zmienia współrzędne z przestrzeni modelu, gdzie wierzchołki są definiowane względem lokalnego źródła modelu, do przestrzeni światowej, gdzie wierzchołki są definiowane względem źródła wspólnego dla wszystkich obiektów w scenie. W istocie świat przekształca model w świat; stąd jego nazwa. Na poniższym diagramie przedstawiono relację między układem współrzędnych świata a lokalnym układem współrzędnych modelu.

diagram współrzędnych świata i współrzędnych lokalnych

Transformacja świata może obejmować dowolną kombinację tłumaczeń, rotacji i skalowania.

Konfigurowanie macierzy świata

Podobnie jak w przypadku każdej innej transformacji, utwórz świat, łącząc serię macierzy w jedną macierz zawierającą sumę ich efektów. W najprostszym przypadku, gdy model znajduje się na świecie, a jego osie współrzędnych lokalnych są zorientowane tak samo jak przestrzeń światowa, macierz świata jest macierzą tożsamości. Częściej macierz świata jest kombinacją tłumaczenia na przestrzeń światową i prawdopodobnie co najmniej jedną rotację, aby przekształcić model zgodnie z potrzebami.

W poniższym przykładzie z fikcyjnej klasy modelu 3D napisanej w języku C++, użyto funkcji pomocnika zawartych w bibliotece narzędzi D3DX, aby utworzyć macierz świata zawierającą trzy rotacje umożliwiające orientację modelu i tłumaczenie, aby przenieść go w stosunku do swojej pozycji w przestrzeni światowej.

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

Po przygotowaniu macierzy świata wywołaj metodę IDirect3DDevice9::SetTransform, aby ją ustawić, określając makro D3DTS_WORLD dla pierwszego parametru.

Nuta

Funkcja Direct3D używa macierzy świata i wyświetlania ustawionych w celu skonfigurowania kilku wewnętrznych struktur danych. Za każdym razem, gdy ustawiasz nowy świat lub macierz widoków, system ponownie oblicza skojarzone struktury wewnętrzne. Ustawienie tych macierzy często, na przykład tysiące razy na ramę, jest czasochłonne. Możesz zminimalizować liczbę wymaganych obliczeń, łącząc świat i wyświetlając macierze w macierzy widoku świata ustawionej jako macierz świata, a następnie ustawiając macierz widoków na tożsamość. Zachowaj buforowane kopie poszczególnych środowisk i wyświetl macierze, aby można było modyfikować, łączyć i resetować macierz świata zgodnie z potrzebami. Aby uzyskać jasność, w tej dokumentacji przykłady Direct3D rzadko stosują tę optymalizację.

 

przekształcenia