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 mengubah 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 secara semena-mena sebagai D, sehingga matriks proyeksi terlihat seperti ilustrasi berikut.

ilustrasi matriks proyeksi

Matriks tampilan menerjemahkan kamera ke asal dengan menerjemahkan ke arah z oleh - D. Matriks terjemahan seperti ilustrasi berikut.

ilustrasi matriks terjemahan

Mengalikan matriks terjemahan dengan matriks proyeksi (T*P) memberikan matriks proyeksi komposit, seperti yang ditunjukkan dalam ilustrasi berikut.

ilustrasi matriks proyeksi komposit

Transformasi perspektif mengubah 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.

diagram bagaimana perspektif mengubah frustum tampilan menjadi ruang koordinat baru

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 mempertimbangkan 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.

ilustrasi matriks 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 pandang horizontal dan vertikal viewport, dalam radian.

persamaan makna variabel

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.

persamaan arti variabel w dan h

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 mendalam menggunakan z-buffer 16-bit agak rumit.

Matriks proyeksi yang ramah

Direct3D dapat menggunakan komponen w 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 menyertakan 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.

ilustrasi matriks proyeksi yang tidak sesuai dan matriks dengan kabut relatif mata

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 menetapkan matriks proyeksi yang sesuai untuk menerima fitur berbasis w yang diinginkan, bahkan jika mereka tidak menggunakan Direct3D untuk transformasi.

Transformasi