Yang paling penting adalah ia mengubah titik Anda (simpul) dari ruang dunia 3D ke ruang layar 2D.
Itu berarti bahwa setelah titik dikalikan dengan matriks X dan koordinat Y ini posisi pada layar (antara [-1, 1]) dan Z adalah kedalaman. Z digunakan untuk buffer kedalaman dan mengidentifikasi seberapa jauh vertex (atau fragmen) dari kamera Anda dekat pesawat.
Proyeksi berarti bahwa simpul yang lebih dekat dari dekat pesawat lebih jauh dari tengah layar -> segitiga yang lebih dekat ke kamera tampaknya lebih besar daripada yang jauh. Dan ini didasarkan pada bidang pandang Anda - Anda memasukkannya di beberapa fungsi createProjectionMatrix atau createFrustum. Ini berfungsi bahwa itu memotong dan menskalakan frustum kamera Anda dan simpul di dalamnya menjadi unit kubus. Nilai yang lebih besar dari 1 dan lebih kecil dari -1 tidak ditampilkan.
Juga menjaga rasio aspek piksel, sehingga piksel dapat menjadi sqaure. Itu sederhana. Itu hanya menggeser kamera frustum seperti ini: layar lebih lebar -> lebih banyak geser vertikal dan sebaliknya.
Jawaban sederhana:
Ini mendefinisikan frustum kamera Anda dan bagus untuk:
- membuat objek yang berada di dekat Anda terlihat lebih besar dari objek yang jauh dari Anda.
- menjaga rasio aspek piksel - Semua orang suka piksel persegi, benar? :)
Jawaban ini sudah lama setelah kenyataan, tetapi karena saya menemukan ini di google mungkin ini masih akan membantu seseorang. Saya hanya ingin mengklarifikasi apa yang dikatakan JasonD dan Notabene: Jauh lebih mudah untuk melakukan perhitungan kliping (mencari tahu apa yang harus Anda lihat dan apa yang tidak boleh Anda lihat karena cara pandang Anda, seberapa jauh jaraknya, dll. .). Alih-alih memeriksa jika hal-hal berpotongan pesawat di perbatasan frustrasi tampilan Anda, Anda cukup membandingkan x, y, z dari segalanya dengan xMax, xMin, yMax, dll. , karena Anda hanya memiliki kubus. Ini sedikit lebih rumit jika Anda ingin hanya memiliki bagian dari sesuatu yang ditampilkan, tetapi matematika masih lebih baik dengan unit kubus daripada dengan frustum.
Beberapa hal yang saya temukan menyesatkan dalam jawaban lain:
-Anda tidak memotong sisi dari pandangan frustrasi, Anda semacam melengkung ke dalam kubus menggunakan transformasi matriks homogen.
-Kami tidak mengonversi ke layar 2D dengan langkah ini. Langkah ini tidak perlu dilakukan. Secara teoritis kita bisa melakukan semua pekerjaan kita tanpa mengubah frustum menjadi kubus terlebih dahulu, yang akan lebih intuitif tetapi lebih sulit matematika - tetapi grafik adalah semua tentang melakukan perhitungan sangat cepat karena ada BANYAK perhitungan per detik untuk rata-rata permainan / apa pun.
Lebih detail: Ini tidak harus menjadi unit cube yang akan kita konversi, hanya saja harus berupa kotak persegi panjang untuk perhitungan max-min kita. Sebenarnya di kelas kami menggunakan kotak di mana kamera menghadap ke bawah sumbu z, z bergerak dari 0 ke 1, x pergi dari -1 ke 1, dan y pergi dari -1 ke 1. Secara umum dalam matematika 1, 0, dan -1 adalah angka yang bagus untuk mempermudah perhitungan, saya berasumsi bahwa kita tidak beralih dari -100 ke 100 atau apalah.
TLDR: Membuat kliping lebih mudah.
Sunting: bobobobo memiliki intinya. Semuanya segitiga, umumnya: D.
Sumber: Mengambil kelas grafis universitas
sumber
Saya percaya ini karena OpenGL tidak dapat membuat asumsi tentang bagaimana gambar akan ditampilkan (aspek rasio atau resolusi, detail perangkat keras, dll). Ini membuat dan gambar ke dalam bentuk perantara di mana sistem operasi atau driver atau apa pun skala untuk resolusi / ukuran yang benar.
sumber
Saya perhatikan jawaban sudah diterima, tetapi umumnya berguna untuk kliping agar tampilan frustum diubah menjadi unit cube.
sumber
Saya juga sudah bertanya-tanya ini. Ada beberapa hal yang perlu dipertimbangkan.
Pertama, ya, semua yang ada di dunia ditransformasikan menjadi satuan kubus [-1,1] yang berpusat di sekitar titik asal. Jika ada sesuatu yang tidak ada di dalam unit kubus maka itu tidak akan ditampilkan.
Yang menyenangkan tentang ini adalah sekarang, Anda dapat menyisihkan segitiga dengan cukup mudah. (Jika ketiga simpul dari sebuah segitiga memiliki
x > 1
ataux < -1
kemudian segitiga itu dapat dimusnahkan).sumber
Saya akan merekomendasikan untuk memeriksa pelajaran tentang matriks proyeksi perspektif pada Scratchapixel
http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix
Ini jelas menjelaskan bahwa alasannya adalah untuk membelokkan pandangan frustum ruang ke unit kubus. Mengapa? Pada dasarnya karena proses memproyeksikan titik-titik 3D pada kanvas yang terlibat untuk mengubahnya menjadi ruang NDC yang merupakan ruang di mana titik-titik pada layar dipetakan kembali dalam kisaran [-1,1] (dengan asumsi layar berbentuk persegi). Sekarang kita juga memetakan ulang titik Z-koordinat ke kisaran [0,1] (atau kadang-kadang [-1,1]) oleh karena itu pada akhirnya Anda berakhir dengan sebuah kubus. Faktanya adalah bahwa ketika poin terkandung dalam sebuah kubus, lebih mudah untuk memprosesnya daripada ketika mereka didefinisikan dalam view frustrum (yang merupakan ruang aneh, sebuah piramida terpotong). Alasan lain adalah bahwa itu semacam membawa semua jenis transformasi proyektif yang dapat Anda bayangkan di CG ke ruang yang sama (unit cube thingy). Jadi terlepas dari apakah Anda menggunakan perspektif atau proyeksi ortografi misalnya,
Meskipun mungkin Anda terlalu fokus pada alasannya. Unit cube benar-benar hanya hasil dari proses matematika yang terlibat atau digunakan untuk memproyeksikan simpul ke layar dan kemudian memetakan kembali koordinat mereka ke ruang raster.
sumber