Transformasi proyeksi
Transformasi proyeksi mengontrol internal kamera, seperti memilih lensa untuk kamera. Ini adalah yang paling rumit dari tiga jenis transformasi.
Matriks proyeksi biasanya merupakan proyeksi skala dan perspektif. Transformasi proyeksi mengonversi frustum tampilan menjadi bentuk cuboid. Karena ujung dekat frustum tampilan lebih kecil dari ujung jauh, ini memiliki efek memperluas objek yang dekat dengan kamera; ini adalah bagaimana perspektif diterapkan ke adegan.
Dalam frustum tampilan, jarak antara kamera dan asal ruang transformasi tampilan didefinisikan semena-mena sebagai D, sehingga matriks proyeksi terlihat seperti ilustrasi berikut.
Matriks tampilan menerjemahkan kamera ke asal dengan menerjemahkan ke arah z oleh - D. Matriks terjemahan seperti ilustrasi berikut.
Mengalikan matriks terjemahan dengan matriks proyeksi (T*P) memberikan matriks proyeksi komposit, seperti yang ditunjukkan dalam ilustrasi berikut.
Transformasi perspektif mengonversi frustum tampilan menjadi ruang koordinat baru. Perhatikan bahwa frustum menjadi cuboid dan juga bahwa asal bergerak dari sudut kanan atas adegan ke tengah, seperti yang ditunjukkan pada diagram berikut.
Dalam transformasi perspektif, batas arah x dan y adalah -1 dan 1. Batas arah z adalah 0 untuk bidang depan dan 1 untuk bidang belakang.
Matriks ini menerjemahkan dan menskalakan objek berdasarkan jarak yang ditentukan dari kamera ke bidang kliping dekat, tetapi tidak menganggap bidang pandang (fov), dan nilai z yang dihasilkannya untuk objek di kejauhan bisa hampir identik, membuat perbandingan kedalaman sulit. Matriks berikut mengatasi masalah ini, dan menyesuaikan simpul untuk memperhitungkan rasio aspek viewport, menjadikannya pilihan yang baik untuk proyeksi perspektif.
Dalam matriks ini, Zn adalah nilai z dari bidang kliping dekat. Variabel w, h, dan Q memiliki arti berikut. Perhatikan bahwa fovw dan fovk mewakili bidang tampilan horizontal dan vertikal viewport, dalam radian.
Untuk aplikasi Anda, menggunakan sudut bidang pandang untuk menentukan koefisien penskalaan x dan y mungkin tidak senyaman menggunakan dimensi horizontal dan vertikal viewport (di ruang kamera). Saat matematika berhasil, dua persamaan berikut untuk w dan h menggunakan dimensi viewport, dan setara dengan persamaan sebelumnya.
Dalam rumus ini, Zn mewakili posisi bidang kliping dekat, dan variabel Vw dan Vh mewakili lebar dan tinggi viewport, di ruang kamera.
Rumus apa pun yang Anda putuskan untuk digunakan, pastikan untuk mengatur Zn ke nilai sebesar mungkin, karena nilai z yang sangat dekat dengan kamera tidak bervariasi banyak. Ini membuat perbandingan kedalaman menggunakan z-buffer 16-bit agak rumit.
Matriks proyeksi yang ramah
Direct3D dapat menggunakan komponen w dari vertex yang telah diubah oleh matriks dunia, tampilan, dan proyeksi untuk melakukan perhitungan berbasis kedalaman dalam efek buffer kedalaman atau kabut. Komputasi seperti ini mengharuskan matriks proyeksi Anda menormalkan w agar setara dengan z ruang dunia. Singkatnya, jika matriks proyeksi Anda mencakup koefisien (3,4) yang bukan 1, Anda harus menskalakan semua koefisien dengan inversi koefisien (3,4) untuk membuat matriks yang tepat. Jika Anda tidak memberikan matriks yang sesuai, efek kabut dan buffer kedalaman tidak diterapkan dengan benar.
Ilustrasi berikut menunjukkan matriks proyeksi yang tidak sesuai, dan matriks yang sama diskalakan sehingga kabut relatif mata akan diaktifkan.
Dalam matriks sebelumnya, semua variabel diasumsikan bukan nol. Untuk informasi tentang buffering kedalaman berbasis w, lihat Buffer kedalaman.
Direct3D menggunakan matriks proyeksi yang saat ini ditetapkan dalam perhitungan kedalaman berbasis w. Akibatnya, aplikasi harus mengatur matriks proyeksi yang sesuai untuk menerima fitur berbasis w yang diinginkan, bahkan jika mereka tidak menggunakan Direct3D untuk transformasi.
Topik terkait