Какова цель канонического представления объема?

15

В настоящее время я изучаю OpenGL и не смог найти ответ на этот вопрос.

После применения матрицы проекции к пространству просмотра, пространство просмотра «нормализуется», так что все точки находятся в пределах диапазона [-1, 1]. Обычно это называется «объем канонического вида» или «нормализованные координаты устройства».

Хотя я нашел много ресурсов, рассказывающих мне о том, как это происходит, я ничего не видел о том, почему это происходит.

Какова цель этого шага?

breadjesus
источник

Ответы:

7

Наиболее важным является то, что он преобразует ваши точки (вершины) из пространства трехмерного мира в пространство двухмерного экрана.

Это означает, что после умножения вершины на эту матрицу координаты X и Y находятся на экране (между [-1, 1]), а Z - это глубина. Z используется для буфера глубины и определяет, как далеко вершина (или фрагмент) от вашей камеры около плоскости.

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

Также сохраняет пропорции пикселя, поэтому пиксель может быть квадратным. Это просто. Он просто срезает усечку камеры следующим образом: более широкий экран -> более вертикальный сдвиг и наоборот.

Простой ответ:
он определяет вашу усадьбу камеры и хорош для:

  • сделать объекты, которые находятся рядом с вами, больше, чем объекты, которые находятся далеко от вас.
  • сохранить пропорции пикселя - всем нравится квадратный пиксель, верно? :)
NotaBene
источник
Я не вижу ни одной части, где он спрашивает, что делает матрица проекции. Кажется, ему просто интересно, для чего нужны нормализованные координаты устройства.
Крис говорит восстановить Монику
Матрица проекции определяет усеченные камеры. Но это не объясняет причину использования [-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: это облегчает отсечение.

Редактировать: бобобо имеет суть этого. В общем, все треугольники: D.

Источник: Обучение в университете

Брайан
источник
Хотя интересно, кажется, что ваши очки частично верны. Вы не используете однородную матрицу, просто в пространстве клипа точки определяются в однородном пространстве. 2) правда, в клипе пространство на экране еще не спроецировано. Это происходит после разделения перспективы, хотя обратите внимание, что это обязательно произойдет, когда вы вернетесь из пространства клипа обратно в декартово пространство. 3) да и нет. Преобразование координат точек в пространство NDC все еще необходимо. Что не нужно, так это пространство клипа, характерное для графического процессора. ...
user18490
... Это ненужная стадия клипа, а не переназначение в единичный куб. Ваше последнее предположение также неверно. Вы переназначаете -1 на 1, потому что легче перейти из пространства NDC в пространство растра (преобразование области просмотра). На самом деле это даже проще, если пространство NDC находится в диапазоне [0,1], что имеет место для некоторой реализации. В конце концов, это все математика, так что можно использовать и другие соглашения. см. хороший веб-сайт для более подробной информации.
user18490
1

Я считаю, что это потому, что OpenGL не может делать предположения о том, как изображение должно отображаться (соотношение сторон или разрешение, детали оборудования и т. Д.). Он рендерит и образ в промежуточную форму, которая операционная система или драйвер или любой другой масштабируется до правильного разрешения / размера.

Чуви Гамбол
источник
Вы не правы, когда говорите об аппаратных деталях. Есть не. Также, если вы пишете свой собственный растаризатор для процессора (зачем это делать? Чтобы узнать, как это работает :)), вы используете те же матрицы, что и в gpu. Вам повезло, что у меня до сих пор нет привилегий для голосования :)
Notabene
Не нужно ли знать соотношение сторон? Из того, что я понимаю, он хранит коэффициенты масштабирования для X и Y, так что изображение будет иметь правильное соотношение сторон в дальнейшем.
breadjesus
3
Поправьте меня, если я ошибаюсь, но он говорит о том, как вы проецируете очки, и поэтому мы говорим о 2D. Если это так, то OpenGL не знает, где на экране вы помещаете это изображение, и как оно будет отображаться. Он создает изображение, которое затем легко масштабируется и корректно размещается, но не делает этого за вас. Я согласен, что детали оборудования были плохим названием, я просто имел в виду выше. Кроме того, вы можете указать матрицу проекции с соотношением сторон, но это соотношение не обязательно должно быть таким же, как у вашего монитора.
Chewy Gumball
3
Я должен сказать, что мне очень нравится этот разговор. Ты рядом, чтобы быть правым. Пойдем глубже. Изображение после вершин мультиплакации по projMat отсутствует. Результатом является просто набор 2D точек с глубиной. Чем начинается растаризация, и она создает образы. (если на процессоре он будет рисовать линии между вершинами треугольников и заполнять его (и затенять - что угодно) ... на GPU это выполняется непосредственно перед пиксельным / фрагментным шейдером). А соотношение сторон помещает точки, которые должны быть «уменьшены», до значений больше 1 или меньше -1, и они не будут отображаться.
Notabene
2
AHHH! Я вижу проблему здесь. Он сказал: «Обычно это называется« объем канонического вида »или« нормализованные координаты устройства »». Я отвечал так, как будто он спрашивал о нормализованных координатах устройства, однако на самом деле он вообще не спрашивал о них. На самом деле это две совершенно разные вещи, и поэтому мы здесь не в ладах. Возможно, это нужно уточнить, чтобы люди не совершали ту же ошибку, что и я.
Chewy Gumball
1

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

JasonD
источник
Правда, я немного отредактировал свой ответ, чтобы быть более ясным по этому поводу.
Notabene
Кстати, единичный куб - это куб со стороны 1. Так что название неуместно. Вместо этого его следует называть каноническим объемом просмотра.
user18490
1

Мне тоже интересно это. Есть несколько вещей, чтобы рассмотреть.

Во-первых, да, все в мире преобразуется в этот единичный куб [-1,1] с центром в начале координат. Если что-то не находится в этом единичном кубе, это не будет отображаться.

Самое приятное в этом то, что вы можете довольно легко отбирать треугольники. (Если все 3 вершины треугольника имеют x > 1или x < -1тогда этот треугольник можно отбраковать).

bobobobo
источник
0

Я бы порекомендовал проверить урок по матрице перспективной проекции на Scratchapixel

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

Это ясно объясняет, почему нужно деформировать пространство усеченного вида в единичный куб. Почему? По сути, потому что процесс проецирования трехмерных точек на холст задействован для преобразования их в пространство NDC, которое представляет собой пространство, в котором точки на экране переназначаются в диапазоне [-1,1] (при условии, что экран квадратный). Теперь мы также переназначаем точку Z-координаты в диапазон [0,1] (или иногда [-1,1]), поэтому в итоге вы получите куб. Дело в том, что когда точки содержатся в кубе, их легче обрабатывать, чем когда они определены в усеченном виде (странное пространство, усеченная пирамида). Другая причина заключается в том, что все виды проективного преобразования, которое вы можете себе представить в CG, можно перенести в одно и то же пространство (единичный куб). Таким образом, независимо от того, используете ли вы, например, перспективную или орфографическую проекцию,

Хотя, может быть, вы слишком сосредоточены на том, почему. Единичный куб на самом деле является просто результатом математического процесса, задействованного или используемого для проецирования вершин на экран, а затем переназначения их координат в растровое пространство.

user18490
источник