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?
Jawaban:
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).
sumber
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).
sumber
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 apam
hasilnya 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-40 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 olehw
sehingga 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.
sumber
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.
sumber