Transformasi Dunia (Direct3D 9)

Diskusi transformasi dunia memperkenalkan konsep dasar dan memberikan detail tentang cara menyiapkan transformasi dunia.

Apa itu Transformasi Dunia?

Transformasi dunia mengubah koordinat dari ruang model, di mana simpul didefinisikan relatif terhadap asal lokal model, ke Ruang Dunia, di mana simpul didefinisikan relatif terhadap asal umum untuk semua objek dalam adegan. Intinya, transformasi dunia menempatkan model ke dunia; oleh karena itu namanya. Diagram berikut menunjukkan hubungan antara sistem koordinat dunia dan sistem koordinat lokal model.

diagram tentang bagaimana koordinat dunia dan koordinat lokal terkait

Transformasi dunia dapat mencakup kombinasi terjemahan, rotasi, dan penskalaan apa pun.

Menyiapkan Matriks Dunia

Seperti halnya transformasi lainnya, buat transformasi dunia dengan menggabungkan serangkaian matriks menjadi satu matriks yang berisi jumlah total efeknya. Dalam kasus yang paling sederhana, ketika model berada di asal dunia dan sumbu koordinat lokalnya berorientasi sama dengan ruang dunia, matriks dunia adalah matriks identitas. Lebih umum, matriks dunia adalah kombinasi dari terjemahan ke ruang dunia dan mungkin satu atau beberapa rotasi untuk mengubah model sesuai kebutuhan.

Contoh berikut, dari kelas model 3D fiktif yang ditulis dalam C++, menggunakan fungsi pembantu yang disertakan dalam pustaka utilitas D3DX untuk membuat matriks dunia yang mencakup tiga rotasi untuk mengorientasi model dan terjemahan untuk merelokasinya relatif terhadap posisinya di ruang dunia.

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

Setelah Anda menyiapkan matriks dunia, panggil metode IDirect3DDevice9::SetTransform untuk mengaturnya, menentukan makro D3DTS_WORLD untuk parameter pertama.

Catatan

Direct3D menggunakan dunia dan melihat matriks yang Anda atur untuk mengonfigurasi beberapa struktur data internal. Setiap kali Anda mengatur dunia baru atau matriks tampilan, sistem menghitung ulang struktur internal terkait. Mengatur matriks ini sering-misalnya, ribuan kali per bingkai-secara komputasi memakan waktu. Anda dapat meminimalkan jumlah perhitungan yang diperlukan dengan menggabungkan dunia Anda dan melihat matriks ke dalam matriks tampilan dunia yang Anda tetapkan sebagai matriks dunia, lalu mengatur matriks tampilan ke identitas. Simpan salinan cache dunia individual dan lihat matriks sehingga Anda dapat memodifikasi, menggabungkan, dan mengatur ulang matriks dunia sesuai kebutuhan. Untuk kejelasan, dalam dokumentasi ini sampel Direct3D jarang menggunakan pengoptimalan ini.

 

Transformasi