Tentang Transformasi Koordinat Model 3D
zat
Pertama-tama
Anda mungkin sering melihat gambar 3D di layar TV dan tampilan di game, tetapi bagaimana Anda menampilkan objek yang ada di ruang 3D, seperti karakter dan bangunan yang bergerak di layar, di layar 2D?
Dalam game 2D, hanya ada elemen dua dimensi "X dan Y" sebagai nilai koordinat, dan tampilannya juga 2D, jadi jika Anda menggambar objek dengan menentukan posisi koordinat X dan Y, Anda akan secara intuitif memahami bagaimana objek itu akan digambar pada posisi mana.
Namun, dalam 3D, itu tidak semudah itu. Seperti namanya, 3D adalah "3 dimensi" dan memiliki tiga informasi koordinat: "X, Y, dan Z". Karena koordinatnya berbeda dari tampilan 2D, tidak mungkin untuk menggambar objek apa adanya.
Kemudian, yang harus dilakukan adalah "mengubah informasi tiga dimensi menjadi informasi dua dimensi". Ini biasanya disebut sebagai "transformasi koordinat". Perlu diingat bahwa transformasi koordinat ini sangat penting untuk pemrograman 3D.
Ada beberapa jenis transformasi koordinat untuk mengonversi 3D ke 2D, tetapi ada tiga jenis utama transformasi koordinat yang ditangani oleh pemrogram: "transformasi dunia", "transformasi tampilan", dan "transformasi proyeksi". Di sini, kami akan menjelaskan segala sesuatu yang berhubungan dengan transformasi koordinat.
Sistem koordinat kidal dan kanan
Dalam 3D, ada dua sistem koordinat, "sistem koordinat tangan kiri" dan "sistem koordinat tangan kanan", yang memiliki orientasi berbeda untuk setiap koordinat seperti yang ditunjukkan pada gambar di bawah ini.
Direct3D terutama menggunakan sistem koordinat tangan kiri, tetapi ada juga fungsi untuk menghitung sistem koordinat tangan kanan. Namun, XNA hanya menyediakan metode perhitungan untuk sistem koordinat tangan kanan. Hal ini tampaknya sejalan dengan fakta bahwa aplikasi lain sering menggunakan sistem koordinat tangan kanan.
Semua tips XNA di situs ini menggunakan sistem koordinat tangan kanan.
Sistem Koordinat Lokal (Sistem Koordinat Model)
Setiap model memiliki sistem koordinat yang berpusat pada asal. Saat membuat model dengan perangkat lunak pemodelan, saya pikir lebih mudah dipahami jika Anda membayangkan membuatnya dengan asal sebagai pusatnya.
Sistem Koordinat Dunia
Sistem koordinat dunia memungkinkan Anda untuk menempatkan model di mana saja. Jika Anda tidak melakukan apa-apa dalam transformasi dunia ini, model akan ditempatkan di titik asal dengan cara yang sama seperti koordinat lokal. Penempatan tidak hanya untuk bergerak dari asal, tetapi juga untuk memutar dan menskalakan.
Lihat Sistem Koordinat
Setelah Anda menempatkan model di koordinat dunia, Anda memerlukan informasi tentang di mana Anda melihat dan di mana Anda melihat ruang 3D. Inilah yang kami sebut "transformasi tampilan". Transformasi tampilan umumnya sering direpresentasikan sebagai kamera.
Parameter yang diperlukan untuk konversi ini adalah "posisi kamera", "titik menarik kamera", dan "arah ke atas kamera". Orientasi kamera ditentukan oleh ketiga parameter ini. Gambar di bawah ini menunjukkan kamera dari perspektif pihak ketiga.
Gambar di bawah ini sebenarnya dilihat dari sudut pandang kamera dengan susunan yang ditunjukkan pada gambar di atas (pada titik ini, kita belum mengonversi koordinat ke layar, jadi itu hanya gambar).
Pada penjelasan sebelumnya, tampaknya kamera diposisikan dan koordinatnya diubah, tetapi dalam perhitungan sebenarnya, koordinat dunia dikonversi sesuai dengan posisi dan orientasi kamera. Oleh karena itu, asalnya adalah posisi kamera seperti yang ditunjukkan pada gambar di bawah ini.
Sistem koordinat proyektif
Setelah Anda memutuskan dari posisi mana untuk melihat ruang 3D, langkah selanjutnya adalah memproses tampilan "benda-benda kecil yang jauh" dan "benda-benda besar yang berada di dekatnya". Ini disebut transformasi proyektif. Ada dua metode transformasi proyeksi, "proyeksi perspektif" dan "proyeksi ortografis", tetapi gambar "proyeksi perspektif" yang umum digunakan adalah sebagai berikut.
Proyeksi perspektif menggunakan parameter berikut: Viewing Angle, Aspect Ratio, Forward Clip Position, dan Rear Clip Position. Area berlabel "frustum" pada gambar di atas akhirnya akan muncul di layar.
"Viewing Angle" menentukan jangkauan tampilan yang terlihat dari kamera. Mengurangi sudut memperbesar, meningkatkannya memperkecil. Sudut pandang akan menjadi nilai vertikal frustum.
Rasio Aspek digunakan untuk menentukan sudut pandang horizontal, sedangkan sudut pandang adalah sudut vertikal. Sudut horizontal biasanya ditentukan oleh "sudut pandang × rasio aspek", dan rasio aspek pada dasarnya adalah nilai "lebar ÷ tinggi" layar yang Anda coba tampilkan. Jika Anda mengubah nilai ini, objek 3D yang ditampilkan akan tampak meregang secara horizontal atau vertikal.
Posisi Klip Maju dan Posisi Klip Belakang ditentukan untuk menentukan apakah objek ditampilkan di rentang depan atau belakang. Karena sifat komputer, tidak mungkin untuk menampilkan hingga tak terbatas, jadi kami akan menetapkan batas. Nilai ini juga memengaruhi keakuratan Z-buffer, jadi tidak disarankan untuk memasukkannya ke area gambar di luar rentang yang tidak perlu ditampilkan.
Objek yang diubah perspektif diubah menjadi ruang seperti di bawah ini. Objek yang dekat dengan kamera diperbesar, dan objek yang jauh diperkecil.
Ini diilustrasikan dalam diagram yang mudah dipahami di bawah ini.
Jika Anda benar-benar melihatnya dari sudut pandang kamera, itu terlihat seperti di bawah ini.
Metode lain dari transformasi proyektif adalah proyeksi ortografi, yang memproyeksikan area yang terlihat seperti yang ada di bawah ini. Karena lebar dan tinggi konstan terlepas dari kedalamannya, ukuran objek tidak berubah dengan kedalaman.
Sistem Koordinat Layar
Setelah transformasi proyeksi, itu diubah menjadi koordinat layar yang sebenarnya. Meskipun ini adalah layar, posisi dan jangkauan tampilan berubah tergantung pada pengaturan viewport yang diatur pada perangkat. Namun, dalam kasus game, koordinat klien jendela seringkali merupakan viewport apa adanya, jadi saya rasa Anda tidak perlu terlalu khawatir.
Koordinat layar (0, 0) dikonversi dari koordinat proyeksi (-1, 1, z). Demikian pula, koordinat layar (lebar, tinggi) dikonversi dari koordinat proyeksi (1, -1 ,z).