Mengapa ruang klip di OpenGL memiliki 4 dimensi?


13

Saya akan menggunakan ini sebagai referensi umum, tetapi semakin saya membaca dokumen dan buku online, semakin sedikit saya mengerti tentang hal ini.

const float vertexPositions[] = {
    0.75f, 0.75f, 0.0f, 1.0f,
    0.75f, -0.75f, 0.0f, 1.0f,
    -0.75f, -0.75f, 0.0f, 1.0f,
};

dalam buku online ini ada contoh tentang cara menggambar hello world pertama dan klasik untuk OpenGL tentang membuat segitiga.

Struktur vertex untuk segitiga dideklarasikan sebagaimana dinyatakan dalam kode di atas.

Buku ini, seperti semua sumber lain tentang hal ini, menekankan pada titik bahwa Clip Space adalah struktur 4D yang pada dasarnya digunakan untuk memutuskan apa yang akan di raster dan ditampilkan di layar.

Di sini saya punya pertanyaan:

  • saya tidak dapat membayangkan sesuatu dalam 4D, saya tidak berpikir bahwa manusia dapat melakukan itu, apa itu 4D untuk ruang Klip ini?
  • dokumen yang paling bisa dibaca manusia yang pernah saya baca berbicara tentang kamera, yang hanya abstraksi atas konsep kliping, dan saya mengerti, masalahnya adalah, mengapa tidak menggunakan konsep kamera di tempat pertama yang lebih struktur 3D yang akrab? Satu-satunya masalah dengan konsep kamera adalah bahwa Anda perlu mendefinisikan calon dengan cara lain sehingga Anda pada dasarnya harus menambahkan pernyataan lain tentang jenis kamera yang ingin Anda miliki.
  • Bagaimana saya seharusnya membaca ini 0.75f, 0.75f, 0.0f, 1.0f? Yang saya dapatkan hanyalah bahwa semuanya adalah nilai float dan saya mendapatkan arti dari 3 nilai pertama, apa artinya yang terakhir?

4
Bab 4 menjelaskan dengan tepat apa yang dilakukan komponen keempat. Sebenarnya, goreskan itu; Bab 1 menjelaskan transformasi clip-to-NDC di bagian rasterisasi setengah jalan .
Nicol Bolas

2
@NicolBolas penulis memberikan penjelasannya di bab pertama dan tidak memberikan referensi untuk bab-bab berikutnya, juga ia berpura-pura menjelaskan apa yang terjadi selanjutnya ketika mengomentari beberapa kode c ++ dan masalahnya adalah jika ia tidak sepenuhnya menjelaskan semuanya dalam bab 1 tidak masuk akal untuk meletakkan apa yang seharusnya saya ketahui di tempat pertama di bab nomor 4, terutama jika saya perlu konsep ini untuk memecahkan kode apa yang ada di dalam bab 1. Saya membaca ini sekarang, dan bukan hanya 1 kali, sekarang saya tahu bahwa saya harus mencari jawabannya lebih jauh, saya akan membaca berbagai bab.
user827992

1
Anda tidak perlu memecahkan kode apa pun; ia mengatakan dalam bab 1: Komponen W dibagi menjadi 3 komponen lainnya. Ini juga dinyatakan dalam pendahuluan. Apa yang ditunda sampai bab 4 adalah mengapa OpenGL melakukan ini. Itu ditunda sampai nanti karena tidak relevan dengan tugas yang ada.
Nicol Bolas

3
Masih akan menjadi informasi yang tidak relevan untuk masalah yang sedang dihadapi (yaitu: rendering triangle). Anda ingin tahu tentang hal itu, tetapi Anda tidak perlu memahami mengapa ini adalah cara untuk memahami bahwa ini adalah cara kerjanya. Dalam mempelajari sesuatu, langkah pertama adalah memahami apa itu. Setelah Anda memahami apa yang terjadi, maka diskusi dapat terjadi tentang mengapa hal itu terjadi.
Nicol Bolas

1
Jawaban ini dapat membantu.
iammilind

Jawaban:


9

Istilah ajaibnya adalah "Koordinat homogen" yang digunakan dalam sistem di mana perspektif merupakan faktor. Periksa wiki untuk ikhtisar, tetapi ini adalah studi panjang untuk benar-benar memahaminya (yang saya tidak tahu).


10

Baca pengantar buku yang Anda baca, Anda akan terkejut;)

http://arcsynthesis.org/gltut/Basics/Intro%20Graphics%20and%20Rendering.html di bawah Tinjauan Rasterisasi

Nilai "w" (di mana 3 nilai pertama adalah x, y dan z) pada dasarnya mengatakan apa dimensi ruang klip. Karena ini adalah 1 nilai skalar, ketiga dimensi ruang klip sama (dan itulah sebabnya ruang klip adalah kubus). Setiap dhuwur memiliki ruang klip sendiri di mana ia ada (dan pada dasarnya perlu "cocok", jika tidak CLIPS: D), tidak ada 1 "dunia" yang merupakan ruang klip (meskipun semua ruang klip berada di tempat yang sama " dunia "Saya pikir, bahkan saya mengalami masalah dengan ini; P).

Jadi, jika titik Anda memiliki misalnya koordinat [1,1,1], jika ruang klip adalah 1 maka titik tersebut berada di sudut kanan atas dekat layar (ketika semua default, saya tidak tahu apakah arahnya dapat diubah). Tetapi jika simpul memiliki ruang klip 2, maka koordinat [1,1,1] akan berada di suatu tempat katakanlah, 3 perempat di layar ke kanan, 3 perempat di layar ke atas, dan dimensi ketiga Anda bisa menebak sendiri.

Saya pikir memiliki katakanlah ruang klip 5 akan berarti lokasi dalam ruang klip berkisar dari -5 hingga 5 pada setiap dimensi, alih-alih kubus menjadi 5x5x5. Tapi itu mungkin karena sederhananya: semua koordinat xy dan z dibagi dengan dimensi ruang klip, jadi pada dasarnya simpul Anda menjalani ini:

x = x / w

y = y / w

z = z / w

Dan itulah yang memungkinkan semuanya terjadi. Saya pikir alasan ini ada untuk perbandingan mudah. Jika koordinat telah dibagi dengan dimensi ruang klip, maka koordinat yang memiliki 1 atau lebih komponen dengan nilai lebih tinggi dari 1, ada di luar ruang klip. Jadi jika ruang klip Anda katakanlah 1024, tetapi koordinatnya adalah [2000,3, -100] maka komponen x (2000) berada di luar ruang klip (yang hanya berkisar dari -1024 hingga 1024).

Dengan komputasi mudah untuk mengetahui apakah ada sesuatu di dalam ruang klip jika yang harus Anda lakukan adalah (sangat kasar menempatkan ofc): (x / w) <1 && (x / w)> - 1 lalu render. Juga, saya kira memiliki semua ruang klip dari semua simpul ukuran yang sama (jadi setiap ruang klip klip mulai dari -1 hingga 1 di setiap dimensi) membuatnya lebih mudah untuk apa pun yang terjadi setelah proses normalisasi, mengingat sejak saat itu pada semua koordinat adalah mengapung mulai dari 0 hingga 1 (mengabaikan apa yang telah terpotong).


Pertanyaannya adalah mengapa ruang klip itu apa adanya, bukan apa arti ruang klip. Artinya, apa gunanya divide-by-W.
Nicol Bolas

2
Ini menjawab pertanyaan ke-3 dari 3 poin peluru =)
dammkewl

8

TL; DR itu bukan ruang 4D, itu 3D ditambah angka penskalaan yang hampir selalu 1. Jika itu 1, Anda bisa mengabaikannya dan tiga angka pertama adalah x, y, z. Jika tidak semakin rumit.

Inilah penjelasan sederhana. Vertikal dalam 3D seharusnya hanya memiliki tiga komponen

⌈x⌉ v = |y| ⌊z⌋

Jika kita ingin memanipulasi mereka (misalnya rotasi, penskalaan, dll.) Kita menggunakan matriks. Contoh paling umum tentu saja adalah matriks Model-View-Projection (MVP) yang mengubah koordinat dunia menjadi ruang klip. Seperti ini:

⌈m11 m12 m13⌉ ⌈x⌉ c = |m21 m22 m23| * |y| ⌊m31 m32 m33⌋ ⌊z⌋

Namun ini memiliki kelemahan besar: Anda tidak dapat melakukan terjemahan. Jika [x,y,z]nol, tidak peduli apa mhasilnya akan selalu nol, jadi kami tidak dapat memiliki MVP yang mencakup terjemahan. Jelas kami menyukainya. Solusinya adalah menambahkan 1 ke ujung vektor kami dan memperluas matriks ke 4x4:

⌈cx⌉ ⌈m11 m12 m13 tx⌉ ⌈x⌉ |cy| = |m21 m22 m23 ty| * |y| |cz| |m31 m32 m33 tz| |z| ⌊ 1⌋ ⌊ 0 0 0 1⌋ ⌊1⌋

(Jika Anda melihat matriks MVP ortogonal - misalnya dari glOrtho()- Anda akan menemukan baris ke-4 0 0 0 1. Kadang-kadang bahkan dibiarkan tersirat.) Jika Anda mengerjakan matematika Anda akan melihat bahwa itu sama dengan

⌈cx⌉ ⌈m11 m12 m13⌉ ⌈x⌉ ⌈tx⌉ |cy| = |m21 m22 m23| * |y| + |ty| ⌊cz⌋ ⌊m31 m32 m33⌋ ⌊z⌋ ⌊tz⌋

Komponen-4 disebut w, dan sementara itu tidak memiliki menjadi 1, hampir selalu merupakan ( sebelum transformasi pula, setelah itu biasanya kembali homogen dengan membagi seluruh vektor oleh wsehingga 1 lagi). Ini semacam peretasan untuk memungkinkan matriks transformasi memasukkan terjemahan.

Edit

Saya percaya motivasi asli adalah untuk proyeksi perspektif , yang tidak mungkin dilakukan dengan koordinat 3D. Ada transformasi lain yang hanya dapat Anda lakukan dengan vektor 4D, tetapi terjemahan adalah yang paling mudah dipahami.


2
Jelaskan downvotes Anda.
Timmmm

+1, dengan asumsi informasinya benar, ini adalah penjelasan yang bagus dan membantu saya. terima kasih
Luke

1

Ada juga satu alasan lagi yang saya lihat dan tidak disebutkan dalam jawaban sebelumnya.

Matriks terjemahan 4x4 sehingga Anda juga dapat menerjemahkan objek di sekitar "dunia". Karena dengan matriks 3x3 Anda dapat memutar dan skala koordinat 3d, tetapi Anda dapat menerjemahkan koordinat 3d hanya dengan matriks 4x4, dari sini perlu mengekspresikan koordinat 3d dalam vektor 4d.


Anda hanya "perlu" vektor 4d di bawah definisi tersebut. matriks 4x4 bukan hanya untuk tujuan menambahkan seperti semua orang suka mengasumsikan dan mengklaim kepada orang lain. jika yang Anda inginkan adalah menambahkan terjemahan setelah rotasi (ke titik 3d), Anda hanya perlu mendefinisikan matriks 4x3. itu jauh lebih efisien jika itu yang Anda cari. Anda tidak harus membatasi diri pada aturan yang dibuat untuk sekumpulan alasan lain hanya karena terlihat lebih rapi. lol
Puddle
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.