Bagikan melalui


Tumpukan Matriks (Direct3D 9)

Catatan

Pustaka utilitas D3DX tidak digunakan lagi. Kami menyarankan agar Anda menggunakan DirectXMath sebagai gantinya bersama dengan header ini dari GitHub.

Pustaka utilitas D3DX menyediakan antarmuka ID3DXMATRIXStack . Ini memasok mekanisme untuk memungkinkan matriks didorong ke dan muncul dari tumpukan matriks. Menerapkan tumpukan matriks adalah cara yang efisien untuk melacak matriks saat melintas hierarki transformasi.

Pustaka utilitas D3DX menggunakan tumpukan matriks untuk menyimpan transformasi sebagai matriks. Berbagai metode antarmuka ID3DXMATRIXStack menangani matriks saat ini, atau matriks yang terletak di atas tumpukan. Anda dapat menghapus matriks saat ini dengan metode ID3DXMATRIXStack::LoadIdentity . Untuk secara eksplisit menentukan matriks tertentu untuk dimuat sebagai matriks transformasi saat ini, gunakan metode ID3DXMATRIXStack::LoadMatrix . Kemudian Anda dapat memanggil metode ID3DXMATRIXStack::MultMatrix atau metode ID3DXMATRIXStack::MultMatrixLocal untuk mengalikan matriks saat ini dengan matriks yang ditentukan.

Metode ID3DXMATRIXStack::P op memungkinkan Anda kembali ke matriks transformasi sebelumnya dan metode ID3DXMATRIXStack::P ush menambahkan matriks transformasi ke tumpukan.

Matriks individu pada tumpukan matriks direpresentasikan sebagai matriks homogen 4x4, yang ditentukan oleh struktur D3DXMATRIX pustaka utilitas D3DXMATRIX .

Pustaka utilitas D3DX menyediakan tumpukan matriks melalui objek model objek komponen (COM).

Menerapkan Hierarki Adegan

Tumpukan matriks menyederhanakan konstruksi model hierarkis, di mana objek rumit dibangun dari serangkaian objek yang lebih sederhana.

Adegan, atau transformasi, hierarki biasanya diwakili oleh struktur data pohon. Setiap simpul dalam struktur data pohon berisi matriks. Matriks tertentu mewakili perubahan sistem koordinat dari induk simpul ke simpul. Misalnya, jika Anda memodelkan lengan manusia, Anda mungkin menerapkan hierarki yang diperlihatkan dalam diagram berikut.

diagram hierarki lengan manusia

Dalam hierarki ini, matriks Tubuh menempatkan tubuh di dunia. Matriks UpperArm berisi rotasi bahu, matriks LowerArm berisi rotasi siku, dan matriks Tangan berisi rotasi pergelangan tangan. Untuk menentukan di mana tangan relatif terhadap dunia, Anda mengalikan semua matriks dari Tubuh ke bawah melalui Tangan bersama-sama.

Hierarki sebelumnya terlalu sederhana, karena setiap simpul hanya memiliki satu anak. Jika Anda mulai memodelkan tangan secara lebih rinci, Anda mungkin akan menambahkan jari dan jempol. Setiap digit dapat ditambahkan ke hierarki sebagai turunan Tangan, seperti yang ditunjukkan dalam diagram berikut.

diagram hierarki tangan manusia

Jika Anda melintasi grafik lengkap lengan dalam urutan mengutamakan kedalaman - melintasi sejauh mungkin ke satu jalur sebelum melanjutkan ke jalur berikutnya - untuk menggambar adegan, Anda melakukan urutan penyajian tersegmentasi. Misalnya, untuk merender tangan dan jari, Anda menerapkan pola berikut.

  1. Dorong matriks Tangan ke tumpukan matriks.
  2. Gambar tangannya.
  3. Dorong matriks Jempol ke tumpukan matriks.
  4. Gambar jempolnya.
  5. Buka matriks Jempol dari tumpukan.
  6. Dorong matriks Finger 1 ke tumpukan matriks.
  7. Gambar jari pertama.
  8. Munculkan matriks Jari 1 dari tumpukan.
  9. Dorong matriks Finger 2 ke tumpukan matriks. Anda terus dengan cara ini sampai semua jari dan jempol dirender.

Setelah Anda selesai merender jari, Anda akan memunculkan matriks Tangan dari tumpukan.

Anda dapat mengikuti proses dasar ini dalam kode dengan contoh berikut. Saat Anda menemukan simpul selama pencarian kedalaman pertama struktur data pohon, dorong matriks ke bagian atas tumpukan matriks.

MatrixStack->Push();

MatrixStack->MultMatrix(pNode->matrix);

Ketika Anda selesai dengan simpul, pop matriks dari bagian atas tumpukan matriks.

MatrixStack->Pop();

Dengan cara ini, matriks di bagian atas tumpukan selalu mewakili transformasi dunia dari simpul saat ini. Oleh karena itu, sebelum menggambar setiap simpul, Anda harus mengatur matriks Direct3D.

pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0), *MatrixStack->GetTop());

Untuk informasi selengkapnya tentang metode tertentu yang dapat Anda lakukan pada tumpukan matriks D3DX, lihat topik referensi ID3DXMATRIXStack .

Alur Vertex