Яке призначення обсягу канонічного виду?


15

Зараз я вивчаю OpenGL і не змогла знайти відповідь на це питання.

Після того, як матриця проекцій буде застосована до простору перегляду, простір перегляду «нормалізується» так, що всі точки лежать у межах [-1, 1]. Зазвичай це називається "об'єм канонічного перегляду" або "нормалізовані координати пристрою".

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

Яка мета цього кроку?

Відповіді:


7

Найважливіше те, що воно перетворює ваші точки (вершини) з простору 3D-простору в 2D-простір екрану.

Це означає, що після множення вершин за допомогою цієї матриці координати X і Y розташовуються на екрані (між [-1, 1]), а Z - глибиною. Z використовується для буфера глибини і визначає, наскільки далеко знаходиться вершина (або фрагмент) від ваших камер поблизу площини.

Проекція означає, що вершини, які розташовані ближче від площини, розташовані ближче до середини екрана -> трикутник, що знаходиться ближче до камери, здається, більший за той, що знаходиться далеко. І це грунтується на вашому полі зору - ви вводите його в якусь функцію createProjectionMatrix або createFrustum. Це спрацьовує, що вона зрізає та розміщує ваші фрукти камери та вершини в кубі одиниці. Значення, що перевищують 1 і менше -1, не відображаються.

Також зберігає піксельне співвідношення сторін, тому піксель може бути більшим. Це просто. Він просто зрізує камери таким чином: більш широкий екран -> більш вертикальний зсув і навпаки.

Проста відповідь:
він визначає ваш фруктовий замах і добре:

  • зробіть предмети, які знаходяться поруч із вами, виглядати більшими, ніж об’єкти, які знаходяться далеко від вас.
  • зберігати співвідношення пікселів - Всім подобається квадратний піксель, так? :)

Я не бачу жодної частини, де він запитує, що робить матриця проекцій. Він, здається, цікавиться, для чого потрібні нормовані координати пристрою.
Кріс каже, що відбудеться Моніка

Матриця проекції визначає усічені камери. Але це не пояснює причину того, що [-1,1] є канонічним обсягом перегляду. Чому б натомість не [-100,100]?
бобобобо

1
тому що 1 - "більш поширене число", ніж 100: D (0 навіть частіше, але куб 0x0x0 не дуже цікавий ...)
Іван Кукір

5

Ця відповідь буде довго після факту, але оскільки я знайшов це в Google, можливо, це все-таки допоможе комусь. Я просто хочу уточнити, що говорили JasonD і Notabene: Набагато простіше робити обрізні обчислення (з'ясовуйте, що ви повинні бачити, а що ви не повинні бачити, через який шлях ви дивитесь, наскільки це далеко, тощо. .). Замість того, щоб перевіряти, чи все перетинає площини на кордонах вашої точки зору, ви просто порівнюєте x, y, z усього з xMax, xMin, yMax, ect. , оскільки у вас просто куб. Це трохи складніше, якщо ви хочете мати лише щось із показаних, але математика все-таки краща з одиничним кубом, ніж з фрустумом.

Кілька речей, які я знайшов оманливими в інших відповідях:

-Ви не стрижете сторони огляду фрустуму, ви перетворюєте його на куб, використовуючи однорідні перетворення матриці.

-Ми не перетворюємося на 2D-екран з цим кроком. Цей крок не потрібен для цього. Теоретично ми могли б виконати всю свою роботу, не перетворивши спочатку фрукт на куб, що було б більш інтуїтивно, але важче математику - але графіка - це все, щоб робити обчислення дуже швидко, оскільки є багато обчислень за секунду для середньої гри / що завгодно.

Більш детально: це не обов'язково одиничний куб, який ми перетворюємо, він просто повинен бути прямокутним коробкою, щоб ми могли розробити макс-хв розрахунки. Насправді в класі ми використовували вікно, де камера спрямована вниз по осі z, z йде від 0 до 1, x йде від -1 до 1, а y - від -1 до 1. Загалом у математиці 1, 0, і -1 - хороші цифри для спрощення обчислень, я вважаю, що тому ми не переходимо від -100 до 100 або щось подібне.

TLDR: Це робить відсікання простішим.

Редагувати: bobobobo має суть цього. Все - це трикутники, загалом: D.

Джерело: Приймаючи університетський клас графіки


Хоча цікаво, здається, що ваші пункти частково правдиві. Ви не використовуєте однорідну матрицю, це просто те, що в просторі кліпу точки визначаються в однорідному просторі. 2) правда, у просторі кліпів понти ще не проектуються на екран. Це трапляється після розділення точки зору, хоча зауважте, що це обов'язково трапляється, коли ви повертаєтеся з простору кліпу назад до декартового простору. 3) так і ні. Перетворення координат точок у простір NDC все ще якимось чином необхідно. Що не потрібно, це місце для кліпів, яке є специфічним для GPU. ...
користувач18490

... Це не просто необхідний етап кліпу, а не перенастроювання на одиничний куб. Ваше останнє припущення також не вірно. Ви перезаписуєте до -1 до 1, тому що простіше перейти з простору NDC до растрового простору (перетворення вікна перегляду). Насправді ще простіше, якщо ви простір NDC знаходиться в діапазоні [0,1], що стосується певної реалізації. Зрештою, це все математика, тому впевнені, що можна використовувати інші умовності. дивіться хороший веб-сайт scrapipixel для отримання більш детальної інформації.
користувач18490


1

Я вважаю, що це тому, що OpenGL не може робити припущення щодо відображення зображення (співвідношення сторін або роздільну здатність, деталі обладнання тощо). Він перетворює і зображення в проміжну форму, яку операційна система або драйвер або що-небудь масштабує до правильної роздільної здатності / розміру.


Ви неправі, коли ви говорите про деталі обладнання. Є не. Крім того, якщо ви пишете, що у вас є власний растаризатор на процесорі (навіщо це робити? Щоб дізнатися, як працює цей матеріал :)), ви використовуєте ті ж матриці, що і на gpu. Вам пощастило, що я все ще не маю привілеїв, щоб проголосувати вниз :)
Нотабене

Чи не потрібно знати співвідношення сторін? Як я розумію, він зберігає коефіцієнти масштабування для X і Y, щоб згодом зображення матиме правильне співвідношення сторін.
breadjesus

3
Виправте мене, якщо я помиляюся, але він говорить про те, як ви проектуєте пункти, і таким чином ми говоримо 2D. Якщо це так, то OpenGL не знає, куди на екран ви ставите це зображення, а також про те, як воно буде відображатися. Він створює зображення, яке потім легко масштабувати та розміщувати правильно, але це не робить для вас. Я згоден, що деталі апаратних засобів були поганою назвою для цього, я просто мав на увазі вище. Також ви можете вказати матрицю проекцій із співвідношенням сторін, але це співвідношення не повинно бути таким, як у монітора.
Chewy Gumball

3
Треба сказати, що мені дуже подобається ця розмова. Ви поруч, щоб мати рацію. Давайте заглибимось. Немає зображення після багатопланових вершин projMat. Результатом є лише встановлення 2D точки з глибиною. Після чого починається растаризація, вона створює зображення. (якщо на процесорі він намалював лінії між вершинами трикутників і заповнив його (і заштрихував би його) - на gpu він виконується безпосередньо перед шейдером пікселів / фрагментів). І співвідношення сторін ставить бали, які слід "зменшити" до значень більше 1 або менше -1, і вони не відображатимуться.
Нотабене

2
AHHH! Я бачу питання тут. Він сказав, що "це, як правило, називається" об'єм канонічного перегляду "або" нормалізовані координати пристрою ". Я відповідав так, ніби він питав про нормалізовані координати пристрою, проте насправді він взагалі не питав про них. Насправді це дві абсолютно різні речі, і саме тому ми тут розходимося. Можливо, це слід уточнити, щоб люди не робили тієї самої помилки, яку я робив.
Chewy Gumball

1

Я зауважу, що відповідь вже прийнято, але для відсікання зазвичай корисно перетворити фрустум виду в одиничний куб.


Правда, я трохи відредагував свою відповідь, щоб бути більш зрозумілим з цього приводу.
Нотабене

До речі, одиничний куб - це куб сторони 1. Отже, назва недоречна. Натомість слід називати канонічний обсяг перегляду.
користувач18490

1

Мені теж це було цікаво. Є кілька речей, які слід розглянути.

По-перше, так, все у світі перетворюється на той одиничний куб [-1,1], зосереджений навколо походження. Якщо чогось немає в одиничному кубі, він не відображатиметься.

Приємна річ у цьому зараз, ви можете скласти трикутники досить легко. (Якщо всі 3 вершини трикутника мають x > 1або x < -1тоді цей трикутник можна збити).


0

Я б рекомендував перевірити урок з матриці перспективного проекції на Scratchapixel

http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix

Це чітко пояснює, що тому, щоб перетворити простір плоду виду на одиничний куб. Чому? По суті, тому, що процес проектування 3D-точок на полотно бере участь у перетворенні на них простору NDC, тобто простору, в якому точки на екрані перезастосовуються в діапазоні [-1,1] (якщо припустимо, що екран є квадратним). Тепер ми також переставляємо точку Z-координати до діапазону [0,1] (або іноді [-1,1]), тому в кінцевому підсумку ви закінчуєте кубом. Справа в тому, що, коли точки містяться в кубі, їх легше обробити, ніж коли вони визначені у вигляд фрустру (що є дивним простором, усіченою пірамідою). Ще одна причина полягає в тому, що це своєрідне приведення всіляких проективних перетворень, які ви можете уявити в CG, до того ж простору (одиничний куб). Тож незалежно від того, використовуєте ви, наприклад, перспективну чи ортографічну проекцію,

Хоча, можливо, ви занадто зосереджуєтесь на чому. Одиничний куб насправді є лише результатом процесу математики, що бере участь або використовується для проектування вершин на екран, а потім переставляє їх координати на растровий простір.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.