Apa tujuan dari volume tampilan kanonik?


15

Saat ini saya sedang belajar OpenGL dan belum dapat menemukan jawaban untuk pertanyaan ini.

Setelah matriks proyeksi diterapkan ke ruang tampilan, ruang tampilan "dinormalisasi" sehingga semua titik berada dalam kisaran [-1, 1]. Ini umumnya disebut sebagai "volume tampilan kanonik" atau "koordinat perangkat dinormalisasi".

Meskipun saya telah menemukan banyak sumber daya yang memberi tahu saya tentang bagaimana ini terjadi, saya belum melihat apa-apa tentang itu mengapa hal itu terjadi.

Apa tujuan dari langkah ini?

Jawaban:


7

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? :)

Saya tidak melihat ada bagian di mana dia bertanya apa yang dilakukan matriks proyeksi. Dia sepertinya bertanya-tanya untuk apa koordinat perangkat yang dinormalisasi itu.
Chris berkata Reinstate Monica

The matriks proyeksi mendefinisikan frustum kamera. Tapi ini tidak menjelaskan alasan memiliki [-1,1] sebagai volume tampilan kanonik. Mengapa tidak memiliki [-100.100] saja?
bobobobo

1
karena 1 adalah "angka yang lebih umum" dari 100: D (0 bahkan lebih umum, tetapi kubus 0x0x0 tidak terlalu menarik ...)
Ivan Kuckir

5

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


Meskipun menarik, sepertinya poin Anda sebagian benar. Anda tidak menggunakan matriks homogen, hanya saja dalam ruang klip, titik didefinisikan dalam ruang homogen. 2) benar, di ponts ruang klip belum diproyeksikan ke layar. Ini terjadi setelah pembagian perspektif, meskipun perhatikan bahwa ini harus terjadi ketika Anda kembali dari ruang klip kembali ke ruang kartesius. 3) ya dan tidak. Konversi titik koordinat ke ruang NDC masih diperlukan. Yang tidak perlu adalah ruang klip, yang khusus untuk GPU. ...
user18490

... Ini tahap ruang klip yang tidak perlu, bukan memetakan kembali ke unit cube. Asumsi terakhir Anda juga tidak benar. Anda memetakan ke -1 ke 1 karena lebih mudah untuk kemudian pergi dari ruang NDC ke ruang raster (transformasi viewport). Sebenarnya lebih mudah jika ruang NDC Anda berada dalam kisaran [0,1] yang merupakan kasus untuk beberapa implementasi. Pada akhirnya itu semua matematika, jadi pastikan konvensi lain dapat digunakan. lihat situs web scratchapixel yang baik untuk lebih jelasnya.
user18490


1

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.


Anda salah ketika berbicara tentang detail perangkat keras. Tidak ada. Juga jika Anda menulis Anda memiliki rastarizator di cpu (mengapa melakukannya? Untuk mempelajari cara kerja ini :)) Anda menggunakan matriks yang sama seperti pada gpu. Anda beruntung bahwa saya masih tidak memiliki hak pribadi untuk memilih :)
Notabene

Tidak perlu tahu aspek rasio? Dari apa yang saya mengerti, ini menyimpan faktor penskalaan untuk X dan Y sehingga gambar akan memiliki rasio aspek yang benar di kemudian hari.
breadjesus

3
Koreksi saya jika saya salah, tetapi dia berbicara tentang setelah Anda memproyeksikan poin, dan dengan demikian kita berbicara 2D. Jika ini masalahnya, maka OpenGL tidak tahu di mana pada layar Anda meletakkan gambar ini, atau tentang bagaimana itu akan ditampilkan. Ini menciptakan gambar yang kemudian mudah untuk skala dan tempat dengan benar, tetapi tidak melakukannya untuk Anda. Saya setuju bahwa detail perangkat keras adalah nama yang buruk untuk itu, saya hanya bermaksud di atas. Selain itu, Anda dapat menentukan matriks proyeksi dengan rasio aspek, tetapi rasio itu tidak harus sama dengan monitor Anda.
Chewy Gumball

3
Saya harus mengatakan bahwa saya sangat menikmati percakapan ini. Anda hampir benar. Ayo masuk lebih dalam. Tidak ada gambar setelah simpul multiplacation oleh projMat. Hasilnya hanya mengatur titik 2D dengan kedalaman. Kemudian rastarisasi dimulai dan ia menciptakan gambar. (jika pada cpu itu akan menarik garis antara segitiga segitiga dan mengisinya (dan menaungi itu-apa pun) ... pada gpu itu dilakukan tepat sebelum pixel / fragmen shader). Dan aspek rasio menempatkan titik yang harus "diperkecil" ke nilai yang lebih besar dari 1 atau lebih kecil dari -1 dan mereka tidak akan ditampilkan.
Notabene

2
AHHH! Saya melihat masalah di sini. Dia mengatakan "Ini umumnya disebut sebagai" volume tampilan kanonik "atau" koordinat perangkat dinormalisasi "." Saya menjawab seolah-olah dia bertanya tentang koordinat perangkat yang dinormalisasi, namun dia tidak benar-benar bertanya tentang itu sama sekali. Mereka, pada kenyataannya, adalah dua hal yang sangat berbeda dan itulah sebabnya kami berselisih di sini. Mungkin itu harus diklarifikasi sehingga orang tidak melakukan kesalahan yang sama seperti yang saya lakukan.
Chewy Gumball

1

Saya perhatikan jawaban sudah diterima, tetapi umumnya berguna untuk kliping agar tampilan frustum diubah menjadi unit cube.


Benar, saya sedikit mengedit jawaban saya untuk lebih jelas tentang ini.
Notabene

Ngomong-ngomong, unit cube adalah kubus sisi 1. Jadi namanya tidak pantas. Ini seharusnya disebut volume tampilan kanonik.
user18490

1

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 > 1atau x < -1kemudian segitiga itu dapat dimusnahkan).


0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.