Чому простір кліпів у OpenGL має 4 розміри?


13

Я буду використовувати це як загальну довідку, але чим більше я переглядаю онлайн-документи та книги, тим менше я розумію про це.

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,
};

в цій онлайн-книзі є приклад про те, як намалювати перший та класичний світ привіт для OpenGL щодо складання трикутника.

Структура вершин для трикутника оголошується так, як зазначено в коді вище.

Книга, як і всі інші джерела про це, наголошує на тому, що Clip Space - це 4D структура, яка використовується в основному для вирішення того, що буде растровано та виведено на екран.

Ось у мене є мої запитання:

  • я не можу уявити щось у 4D, я не думаю, що людина може це зробити, що таке 4D для цього простору кліпу?
  • найбільш читаний людиною документ, який я читав, говорить про камеру, яка є лише абстракцією над концепцією відсікання, і я розумію, проблема полягає в тому, чому б не використовувати концепцію камери в першу чергу, що більше знайома 3D структура? Єдина проблема з поняттям камери є те , що вам потрібно визначити передбачуваний іншим способом , і тому ви в основному повинні додати ще одну заяву про те, що вид камери ви хочете мати.
  • Як я маю це прочитати 0.75f, 0.75f, 0.0f, 1.0f? Все, що я отримую, - це те, що вони всі плаваючі значення, і я отримую значення перших трьох значень, що це означає останнє?

4
Глава 4 пояснює, що саме робить четвертий компонент. Власне, подряпайте це; Глава 1 пояснює перетворення кліпу на NDC у розділі растризації на півдорозі .
Нікол Болас

2
@NicolBolas автор дає своє пояснення в першій главі і не посилається на наступні глави, а також робить вигляд, що пояснює, що буде далі, коментуючи якийсь код c ++, і проблема полягає в тому, що якщо він не повністю пояснить все в 1 глава не має особливого сенсу ставити те, що я повинен знати, на перше місце в главі № 4, особливо якщо мені потрібні ці поняття, щоб розшифрувати те, що знаходиться в 1 главі. Я читаю це зараз, і не лише 1 раз, тепер я знаю, що мені слід шукати відповідь далі, я перейду до різних розділів.
user827992

1
Вам не потрібно нічого розшифровувати; в главі 1 сказано: компонент W розділений на інші 3 компоненти. Це було зазначено і у вступі. Відкладено до глави 4, чому OpenGL робить це. Це затримано до цього пізніше, оскільки це не має значення для завдання, яке виконується.
Нікол Болас

3
Це все ще буде неактуальною інформацією для проблеми, що розглядається (тобто: надання трикутника). Вам цікаво про це, але вам не потрібно розуміти, чому саме так потрібно розуміти, що саме так воно працює. Навчаючись чому-небудь, перший крок - зрозуміти, що це таке. Як тільки ви зрозумієте, що відбувається, тоді може відбутися дискусія про те, чому саме так.
Нікол Болас

1
Ця відповідь може допомогти.
iammilind

Відповіді:


9

Чарівний термін - "Однорідні координати", які використовуються в системах, де перспективність є фактором. Перевірте вікі на огляд, але це довгий курс вивчення, щоб реально його зрозуміти (чого я не знаю).


10

Прочитайте вступ прочитаних книг, ви здивуєтеся;)

http://arcsynthesis.org/gltut/Basics/Intro%20Graphics%20and%20Rendering.html у розділі Огляд растеризації

Значення "w" (де перші 3 значення x, y і z) в основному говорить про те, якими є розміри простору кліпу. Оскільки це 1 скалярне значення, всі 3 розміри простору кліпу рівні (і тому простір кліпу є кубом). У кожної вершини є власний простір кліпу, в якому він існує (і в основному його потрібно «помістити», інакше це CLIPS: D), не існує 1 «світу», який є простором кліпу (хоча всі кліп простору є однаковими » світ "Я думаю, навіть у мене виникають проблеми з цим; P).

Отже, якщо ваша вершина має, наприклад, координату [1,1,1], якщо простір кліпу дорівнює 1, то вершина знаходиться у верхньому правому верхньому куті екрана (коли все за замовчуванням, я не знаю, чи напрямки можуть бути змінені). Але якщо вершина має простір кліпу 2, то координата [1,1,1] буде десь скажімо, 3 чверті екрана праворуч, 3 чверті екрана вгорі, а третій вимір Ви можете самі здогадатися.

Я думаю, що, скажімо, простір кліпу 5 означатиме, що місця в межах простору кліпу становлять від -5 до 5 у кожному вимірі, замість того, щоб куб був 5x5x5. Але це, мабуть, тому, що просто сказати: всі координати xy і z розділені на розмір простору кліпу, тому в основному ваші вершини зазнають цього:

x = x / w

y = y / w

z = z / w

І саме це робить все можливим. Я думаю, що причина цього існує в легких порівняннях. Якщо координати були розділені на розмір простору кліпу, то координата, яка має 1 або більше компонентів зі значенням вище 1, існує поза простором кліпу. Отже, якщо у вашому просторі кліпу припустимо 1024, але координата є [2000,3, -100], то компонент x (2000) знаходиться поза простором кліпу (який становить лише від -1024 до 1024).

за допомогою обчислень легко зрозуміти, чи є щось у просторі кліпів, якщо все, що вам потрібно зробити, це (дуже грубо поставлено ofc): (x / w) <1 && (x / w)> - 1, то виведіть. Крім того, я вважаю, що всі проміжки кліпів усіх вершин мають однаковий розмір (тому кожен куб простору кліпу становить від -1 до 1 у кожному вимірі) полегшує те, що настає після нормалізації, оскільки з цього моменту всі координати є плаває від 0 до 1 (не враховуючи того, що було відрізано).


Питання полягало в тому, чому кліп-простір такий, який він є, а не те, що означає простір кліпу. Тобто, в чому сенс поділу на W.
Нікол Болас

2
Він відповідає на 3-е питання про 3 пункти кулі, хоча =)
dammkewl

8

TL; DR - це не 4D простір, це 3D плюс число масштабування, яке практично завжди є 1. Якщо це 1, ви можете проігнорувати його, а перші три числа - x, y, z. Якщо ні, то це стає складніше.

Ось просте пояснення. Вершини в 3D повинні мати лише три компоненти

⌈x⌉ v = |y| ⌊z⌋

Якщо ми хочемо маніпулювати ними (наприклад, обертання, масштабування тощо), ми використовуємо матрицю. Найпоширеніший приклад звичайно - матриця Model-View-Projection (MVP), яка перетворює світові координати в простір кліпу. Подобається це:

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

Однак це має великий недолік: не можна робити переклад. Якщо [x,y,z]дорівнює нулю, незалежно від того, mякий результат завжди буде нульовим, тому ми не можемо мати MVP, що включає переклад. Очевидно, нам це б хотілося. Рішення полягає в тому, щоб додати 1 до кінця наших векторів і розширити матрицю до 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⌋

(Якщо ви подивитеся на будь-яку ортогональну MVP-матрицю - наприклад, з glOrtho()- ви знайдете, що четвертий ряд є 0 0 0 1. Іноді це навіть залишається неявним.) Якщо ви працюєте з математикою, ви побачите, що це те саме, що

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

Четвертий компонент називається w, і хоча він не повинен бути 1, він майже завжди є ( до перетворення все-таки; після цього, як правило, повторно гомогенізується шляхом ділення всього вектора на w1 раз). Це свого роду хак, щоб дозволити матриці трансформації включати переклад.

Редагувати

Я вважаю, що первісна мотивація була для перспективних проекцій , які неможливо з 3D-координатами. Є й інші перетворення, які можна виконати лише з 4D векторами, але переклад - це найлегше зрозуміти.


2
Поясніть свої голоси.
Тиммммм

+1, якщо вважати, що інформація правильна, це було гарним поясненням і було мені корисно. дякую
Люк

1

Також я бачу ще одну причину, яку я не згадував у попередніх відповідях.

Матриці перекладу розміром 4х4, щоб ви могли також перекладати об’єкт навколо "світу". Оскільки за допомогою матриці 3x3 ви можете обертати та масштабувати 3d координату, але ви можете перевести 3d координату лише за допомогою матриці 4x4, звідси необхідність вираження 3d координат у 4d векторі.


вам потрібно лише "4d" вектор під такими визначеннями. матриця 4x4 не просто з метою додавання, як кожен любить приймати та претендувати на інших. якби все, що ви хотіли, було додати переклад після обертання (до 3d точки), ви просто визначите матрицю 4x3. це набагато ефективніше, якщо це все, що ти хочеш. не потрібно обмежувати себе правилами, які були зроблені з цілого ряду інших причин, лише тому, що це виглядає охайніше. lol
Калюжа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.