Mengapa
Karena, kamera mewakili tampilan proyeksi.
Tetapi dalam kasus Kamera 3D (Kamera Virtual), kamera bergerak bukan dunia. Saya telah membuat penjelasan terperinci nanti dari jawaban ini.
Memahami secara matematis
Tampilan Proyeksi bergerak di sekitar ruang dan mengubah orientasinya. Hal pertama yang perlu diperhatikan adalah bahwa proyeksi yang diinginkan pada layar tidak berubah dengan arah tampilan.
Untuk alasan ini, kami mengubah hal-hal lain untuk mendapatkan proyeksi yang diinginkan.
Memahami Dari http://opengl.org
Untuk memberikan tampilan menggerakkan kamera, aplikasi OpenGL Anda harus memindahkan adegan dengan kebalikan dari transformasi kamera. dalam hal OpenGL terkait, tidak ada kamera. Lebih khusus lagi, kamera selalu terletak di koordinat ruang mata (0, 0, 0)
Memahami Dari http://open.gl
Juga ingin berbagi baris berikut dari bagian View matrix dari http://open.gl/transformations
Untuk mensimulasikan transformasi kamera, Anda benar-benar harus mengubah dunia dengan kebalikan dari transformasi itu. Contoh: jika Anda ingin memindahkan kamera ke atas, Anda harus memindahkan dunia ke bawah.
Memahami dengan perspektif
Di dunia nyata, kita melihat sesuatu dengan cara yang disebut "perspektif".
Perspektif mengacu pada konsep bahwa objek yang lebih jauh tampak lebih kecil daripada yang lebih dekat dengan Anda. Perspektif juga berarti bahwa jika Anda duduk di tengah jalan lurus, Anda benar-benar melihat batas jalan sebagai dua garis konvergen.
Itu perspektif. Perspektif sangat penting dalam proyek 3D. Tanpa perspektif, dunia 3D tidak terlihat nyata.
Meskipun ini mungkin tampak alami dan jelas, penting untuk mempertimbangkan bahwa ketika Anda membuat rendering 3D di komputer Anda mencoba untuk mensimulasikan dunia 3D di layar komputer, yang merupakan permukaan 2D.
Bayangkan di balik layar komputer ada semacam adegan 3D nyata, dan Anda menontonnya melalui "kaca" layar komputer Anda. Menggunakan perspektif, tujuan Anda adalah membuat kode yang membuat apa yang "diproyeksikan" pada "kaca" layar Anda ini seolah-olah ada dunia 3D nyata di belakang layar. Satu-satunya peringatan adalah bahwa dunia 3D ini tidak nyata ... itu hanya simulasi matematis dari dunia 3D.
Jadi, ketika menggunakan rendering 3D untuk mensimulasikan adegan dalam 3D dan kemudian memproyeksikan adegan 3D ke permukaan 2D layar Anda, proses ini disebut proyeksi perspektif.
Mulailah dengan membayangkan secara intuitif apa yang ingin Anda capai. Jika suatu objek lebih dekat ke penampil, objek tersebut harus tampak lebih besar. Jika objek lebih jauh, itu harus tampak lebih kecil. Selain itu, jika suatu objek bergerak menjauh dari penampil, dalam garis lurus, Anda ingin objek itu menyatu ke tengah layar, karena bergerak lebih jauh ke kejauhan.
Menerjemahkan perspektif ke dalam matematika
Saat Anda melihat ilustrasi dalam gambar berikut, bayangkan bahwa suatu objek diposisikan dalam adegan 3D Anda. Dalam dunia 3D, posisi objek dapat digambarkan sebagai xW, yW, zW, mengacu pada sistem koordinat 3D dengan asal pada titik mata. Di situlah objek sebenarnya diposisikan, dalam adegan 3D di luar layar.
Saat pemirsa melihat objek ini di layar, objek 3D "diproyeksikan" ke posisi 2D yang digambarkan sebagai xP dan yP, yang merujuk sistem koordinat 2D layar (bidang proyeksi).
Untuk memasukkan nilai-nilai ini ke dalam rumus matematika, saya akan menggunakan sistem koordinat 3D untuk koordinat dunia, di mana sumbu x menunjuk ke kanan, menunjuk ke atas, dan titik z positif di dalam layar. Asal 3D mengacu pada lokasi mata pemirsa. Jadi, kaca layar berada pada bidang ortogonal (pada sudut kanan) ke sumbu z, pada beberapa z yang saya sebut zProj.
Anda dapat menghitung posisi yang diproyeksikan xP dan yP, dengan membagi posisi dunia xW, dan yW, dengan zW, seperti ini:
xP = K1 * xW / zW
yP = K2 * yW / zW
K1 dan K2 adalah konstanta yang berasal dari faktor geometris seperti rasio aspek bidang proyeksi Anda (viewport Anda) dan "bidang pandang" mata Anda, yang memperhitungkan tingkat penglihatan sudut lebar.
Anda dapat melihat bagaimana transformasi ini mensimulasikan perspektif. Poin di dekat sisi layar didorong ke tengah saat jarak dari mata (zW) meningkat. Pada saat yang sama, titik yang lebih dekat ke pusat (0,0) jauh lebih sedikit dipengaruhi oleh jarak dari mata dan tetap dekat dengan pusat.
Pembagian oleh z ini adalah "pembagian perspektif" yang terkenal.
Sekarang, pertimbangkan bahwa objek dalam adegan 3D didefinisikan sebagai serangkaian simpul. Jadi, dengan menerapkan transformasi semacam ini ke semua simpul geometri, Anda secara efektif memastikan bahwa objek akan menyusut ketika lebih jauh dari titik mata.
Kasus Penting Lainnya
- Dalam hal Kamera 3D (Kamera Virtual), kamera bergerak sebagai ganti dunia.
Untuk mendapatkan pemahaman yang lebih baik tentang kamera 3D, bayangkan Anda merekam film. Anda harus mengatur adegan yang ingin Anda potret dan Anda membutuhkan kamera. Untuk mendapatkan rekaman, Anda akan menjelajahi adegan dengan kamera Anda, memotret objek dalam pemandangan dari berbagai sudut dan sudut pandang.
Proses pembuatan film yang sama terjadi dengan kamera 3D. Anda memerlukan kamera "virtual", yang dapat berkeliaran di sekitar adegan "virtual" yang telah Anda buat.
Dua gaya pemotretan populer melibatkan menonton dunia melalui mata karakter (juga dikenal sebagai kamera orang pertama) atau mengarahkan kamera ke suatu karakter dan membuatnya tetap terlihat (dikenal sebagai kamera orang ketiga).
Ini adalah premis dasar dari kamera 3D: kamera virtual yang dapat Anda gunakan untuk berkeliaran di sekitar adegan 3D, dan membuat rekaman dari sudut pandang tertentu.
Memahami ruang dunia dan melihat ruang
Untuk mengkode perilaku seperti ini, Anda akan merender konten dunia 3D dari sudut pandang kamera, tidak hanya dari sudut pandang sistem koordinat dunia, atau dari sudut pandang tertentu lainnya.
Secara umum, adegan 3D berisi serangkaian model 3D. Model didefinisikan sebagai seperangkat simpul dan segitiga, dirujuk ke sistem koordinat mereka sendiri. Ruang di mana model didefinisikan disebut ruang model (atau lokal).
Setelah menempatkan objek model ke dalam adegan 3D, Anda akan mengubah simpul model ini menggunakan matriks "transformasi dunia". Setiap objek memiliki matriks dunianya sendiri yang menentukan di mana objek berada di dunia dan bagaimana ia berorientasi.
Sistem referensi baru ini disebut "ruang dunia" (atau ruang global). Cara sederhana untuk mengelolanya adalah dengan mengaitkan matriks transformasi dunia ke setiap objek.
Untuk menerapkan perilaku kamera 3D, Anda harus melakukan langkah-langkah tambahan. Anda akan mereferensikan dunia — bukan ke asal dunia — tetapi ke sistem referensi kamera 3D itu sendiri.
Strategi yang baik melibatkan memperlakukan kamera sebagai objek 3D aktual di dunia 3D. Seperti objek 3D lainnya, Anda menggunakan matriks "transformasi dunia" untuk menempatkan kamera pada posisi dan orientasi yang diinginkan di dunia 3D. Matriks transformasi dunia kamera ini mengubah objek kamera dari aslinya, melihat rotasi ke depan (sepanjang sumbu z), ke posisi dunia nyata (xc, yc, zc), dan rotasi dunia.
Gambar berikut menunjukkan hubungan antara sistem koordinat Dunia (x, y, z) dan sistem tampilan (kamera) (x ', y', z ').