Transformasi (Direct3D 9)

Bagian dari Direct3D yang mendorong geometri melalui alur geometri fungsi tetap adalah mesin transformasi. Ini menemukan model dan penampil di dunia, memproyeksikan simpul untuk ditampilkan di layar, dan klip simpul ke viewport. Mesin transformasi juga melakukan komputasi pencahayaan untuk menentukan komponen difus dan spekular di setiap puncak.

Alur geometri mengambil simpul sebagai input. Mesin transformasi menerapkan dunia, tampilan, dan proyeksi berubah ke simpul, mengklip hasilnya, dan meneruskan semuanya ke rasterizer.

Di kepala alur, simpul model dinyatakan relatif terhadap sistem koordinat lokal. Ini adalah asal lokal dan orientasi. Orientasi koordinat ini sering disebut sebagai ruang model, dan koordinat individu disebut koordinat model.

Tahap pertama alur geometri mengubah simpul model dari sistem koordinat lokal mereka ke sistem koordinat yang digunakan oleh semua objek dalam adegan. Proses reorientasi puncak disebut transformasi dunia. Orientasi baru ini biasanya disebut sebagai ruang dunia, dan setiap puncak di ruang dunia dideklarasikan menggunakan koordinat dunia.

Pada tahap berikutnya, simpul yang menggambarkan dunia 3D Anda berorientasi pada kamera. Artinya, aplikasi Anda memilih titik pandang untuk adegan, dan koordinat ruang dunia direlokasi dan diputar di sekitar tampilan kamera, mengubah ruang dunia menjadi ruang kamera. Ini adalah transformasi tampilan.

Tahap berikutnya adalah transformasi proyeksi. Di bagian alur ini, objek biasanya diskalakan dengan kaitannya dengan jaraknya dari penampil untuk memberikan ilusi kedalaman ke adegan; objek dekat dibuat untuk tampak lebih besar dari objek jauh, dan sebagainya. Untuk kesederhanaan, dokumentasi ini mengacu pada ruang di mana simpul ada setelah proyeksi berubah sebagai ruang proyeksi. Beberapa buku grafis mungkin menyebut ruang proyeksi sebagai ruang homogen pasca-perspektif. Tidak semua proyeksi mengubah skala ukuran objek dalam adegan. Proyeksi seperti ini terkadang disebut proyeksi affine atau ortogonal.

Di bagian akhir alur, simpul apa pun yang tidak akan terlihat di layar dihapus, sehingga rasterizer tidak meluangkan waktu untuk menghitung warna dan bayangan untuk sesuatu yang tidak akan pernah terlihat. Proses ini disebut kliping. Setelah kliping, simpul yang tersisa diskalakan sesuai dengan parameter viewport dan dikonversi menjadi koordinat layar. Simpul yang dihasilkan, terlihat di layar ketika adegan dirasterisasi, ada di ruang layar.

Transformasi digunakan untuk mengonversi geometri objek dari satu ruang koordinat ke ruang koordinat lainnya. Direct3D menggunakan matriks untuk melakukan transformasi 3D. Bagian ini menjelaskan bagaimana matriks membuat transformasi 3D, menjelaskan beberapa kegunaan umum untuk transformasi, dan merinci bagaimana Anda dapat menggabungkan matriks untuk menghasilkan satu matriks yang mencakup beberapa transformasi.

Transformasi Matriks

Dalam aplikasi yang bekerja dengan grafik 3D, Anda dapat menggunakan transformasi geometris untuk melakukan hal berikut:

  • Mengekspresikan lokasi objek relatif terhadap objek lain.
  • Putar dan ukuran objek.
  • Ubah posisi tampilan, arah, dan perspektif.

Anda dapat mengubah titik apa pun (x,y,z) menjadi titik lain (x', y', z') dengan menggunakan matriks 4x4, seperti yang ditunjukkan dalam persamaan berikut.

persamaan mengubah titik apa pun ke titik lain

Lakukan persamaan berikut pada (x, y, z) dan matriks untuk menghasilkan titik (x', y', z').

persamaan untuk titik baru

Transformasi yang paling umum adalah terjemahan, rotasi, dan penskalaan. Anda dapat menggabungkan matriks yang menghasilkan efek ini menjadi satu matriks untuk menghitung beberapa transformasi sekaligus. Misalnya, Anda dapat membuat satu matriks untuk menerjemahkan dan memutar serangkaian titik.

Matriks ditulis dalam urutan kolom baris. Matriks yang secara merata menskalakan simpul di sepanjang setiap sumbu, yang dikenal sebagai penskalaan seragam, diwakili oleh matriks berikut menggunakan notasi matematika.

persamaan matriks untuk penskalaan seragam

Dalam C++, Direct3D mendeklarasikan matriks sebagai array dua dimensi, menggunakan struktur D3DMATRIX . Contoh berikut menunjukkan cara menginisialisasi struktur D3DMATRIX untuk bertindak sebagai matriks penskala seragam.

// In this example, s is a variable of type float.

D3DMATRIX scale = {
    s,               0.0f,            0.0f,            0.0f,
    0.0f,            s,               0.0f,            0.0f,
    0.0f,            0.0f,            s,               0.0f,
    0.0f,            0.0f,            0.0f,            1.0f
};

Terjemahan

Persamaan berikut menerjemahkan titik (x, y, z) ke titik baru (x', y', z').

persamaan matriks terjemahan untuk titik baru

Anda dapat membuat matriks terjemahan secara manual di C++. Contoh berikut menunjukkan kode sumber untuk fungsi yang membuat matriks untuk menerjemahkan simpul.

D3DXMATRIX Translate(const float dx, const float dy, const float dz) {
    D3DXMATRIX ret;

    D3DXMatrixIdentity(&ret);
    ret(3, 0) = dx;
    ret(3, 1) = dy;
    ret(3, 2) = dz;
    return ret;
}    // End of Translate

Untuk kenyamanan, pustaka utilitas D3DX memasok fungsi D3DXMatrixTranslation .

Skala

Persamaan berikut menskalakan titik (x, y, z) dengan nilai arbitrer dalam x-, y-, dan z-directions ke titik baru (x', y', z').

persamaan matriks skala untuk titik baru

Putar

Transformasi yang dijelaskan di sini adalah untuk sistem koordinat sebelah kiri, sehingga mungkin berbeda dari matriks transformasi yang telah Anda lihat di tempat lain.

Persamaan berikut memutar titik (x, y, z) di sekitar sumbu x, menghasilkan titik baru (x', y', z').

persamaan matriks rotasi x untuk titik baru

Persamaan berikut memutar titik di sekitar sumbu y.

persamaan matriks rotasi y untuk titik baru

Persamaan berikut memutar titik di sekitar sumbu z.

persamaan matriks rotasi z untuk titik baru

Dalam contoh matriks ini, theta huruf Yunani adalah singkatan dari sudut rotasi, dalam radian. Sudut diukur searah jarang saat melihat sepanjang sumbu rotasi menuju asal.

Dalam aplikasi C++, gunakan fungsi D3DXMatrixRotationX, D3DXMatrixRotationY, dan D3DXMatrixRotationZ yang disediakan oleh pustaka utilitas D3DX untuk membuat matriks rotasi. Berikut ini adalah kode untuk fungsi D3DXMatrixRotationX .

D3DXMATRIX* WINAPI D3DXMatrixRotationX
    ( D3DXMATRIX *pOut, float angle )
{
#if DBG
    if(!pOut)
        return NULL;
#endif

    float sin, cos;
    sincosf(angle, &sin, &cos);  // Determine sin and cos of angle

    pOut->_11 = 1.0f; pOut->_12 =  0.0f;   pOut->_13 = 0.0f; pOut->_14 = 0.0f;
    pOut->_21 = 0.0f; pOut->_22 =  cos;    pOut->_23 = sin;  pOut->_24 = 0.0f;
    pOut->_31 = 0.0f; pOut->_32 = -sin;    pOut->_33 = cos;  pOut->_34 = 0.0f;
    pOut->_41 = 0.0f; pOut->_42 =  0.0f;   pOut->_43 = 0.0f; pOut->_44 = 1.0f;

    return pOut;
}

Menggabungkan Matriks

Salah satu keuntungan menggunakan matriks adalah Anda dapat menggabungkan efek dari dua matriks atau lebih dengan mengalikannya. Ini berarti bahwa, untuk memutar model dan kemudian menerjemahkannya ke beberapa lokasi, Anda tidak perlu menerapkan dua matriks. Sebagai gantinya, Anda mengalikan matriks rotasi dan terjemahan untuk menghasilkan matriks komposit yang berisi semua efeknya. Proses ini, yang disebut perangkaian matriks, dapat ditulis dengan persamaan berikut.

persamaan perangkaian matriks

Dalam persamaan ini, C adalah matriks komposit yang dibuat, dan M₁ melalui Mn adalah matriks individu. Dalam kebanyakan kasus, hanya dua atau tiga matriks yang digabungkan, tetapi tidak ada batasan.

Gunakan fungsi D3DXMatrixMultiply untuk melakukan perkalian matriks.

Urutan di mana perkalian matriks dilakukan sangat penting. Rumus sebelumnya mencerminkan aturan kiri-ke-kanan dari perangkaian matriks. Artinya, efek matriks yang terlihat yang Anda gunakan untuk membuat matriks komposit terjadi dalam urutan kiri-ke-kanan. Matriks dunia yang khas ditampilkan dalam contoh berikut. Bayangkan bahwa Anda menciptakan matriks dunia untuk piring terbang stereotip. Anda mungkin ingin memutar pelau terbang di sekitar pusatnya - sumbu y ruang model - dan menerjemahkannya ke beberapa lokasi lain di adegan Anda. Untuk mencapai efek ini, Anda terlebih dahulu membuat matriks rotasi, lalu mengalikannya dengan matriks terjemahan, seperti yang ditunjukkan dalam persamaan berikut.

persamaan putaran berdasarkan matriks rotasi dan matriks terjemahan

Dalam rumus ini, Ry adalah matriks untuk rotasi tentang sumbu y, dan Tw adalah terjemahan ke beberapa posisi dalam koordinat dunia.

Urutan di mana Anda mengalikan matriks penting karena, tidak seperti mengalikan dua nilai skalar, perkalian matriks tidak komutatif. Mengalikan matriks dalam urutan yang berlawanan memiliki efek visual menerjemahkan pelukis terbang ke posisi ruang dunianya, dan kemudian memutarnya di sekitar asal dunia.

Apa pun jenis matriks yang Anda buat, ingat aturan kiri ke kanan untuk memastikan bahwa Anda mencapai efek yang diharapkan.

Memulai