Почему пространство клипа в 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 - это 4-мерная структура, которая используется для определения того, что будет растеризовано и отображено на экране.

Здесь у меня есть свои вопросы:

  • я не могу представить что-то в 4D, я не думаю, что человек может сделать это, что такое 4D для этого пространства клипов?
  • самый читаемый человеком документ, который я читал, говорит о камере, которая является просто абстракцией над концепцией отсечения, и я понимаю, что проблема в том, почему бы не использовать концепцию камеры в первую очередь, которая является более знакомая 3D структура? Единственная проблема, связанная с концепцией камеры, заключается в том, что вам нужно определить перспективу другим способом, и поэтому вам нужно добавить еще одно утверждение о том, какую камеру вы хотите иметь.
  • Как я должен это читать 0.75f, 0.75f, 0.0f, 1.0f? Все, что я получаю, это то, что все они являются значениями с плавающей запятой, и я получаю значение первых трех значений, что это означает последнее?
user827992
источник
4
Глава 4 объясняет, что именно делает четвертый компонент. На самом деле, поцарапайте это; Глава 1 объясняет преобразование «клип в NDC» в разделе растеризации на полпути вниз .
Никол Болас
2
@NicolBolas автор дает свое объяснение в первой главе и не помещает никаких ссылок на следующие главы, а также делает вид, что объясняет, что происходит дальше, комментируя некоторый код на С ++, и проблема в том, что если он не полностью объяснит все в 1-я глава не имеет особого смысла ставить то, что я должен знать, на первое место в главе № 4, особенно если мне нужны эти концепции для расшифровки того, что находится в 1-й главе. Я читаю это сейчас, а не только один раз, теперь я знаю, что я должен искать ответ дальше, я пройдусь по различным главам.
user827992
1
Вам не нужно ничего декодировать; в главе 1 говорится: компонент W разделен на три других компонента. Это также было указано во введении. Откладывание до главы 4 - это то, почему OpenGL делает это. Это отложено на потом, потому что это не имеет отношения к поставленной задаче.
Николь Болас
3
Это было бы все еще несоответствующей информацией для рассматриваемой проблемы (то есть: отрисовка треугольника). Вам любопытно , но вам не нужно понимать, почему это так, чтобы понять, что это так. Изучая что-либо, первый шаг должен понять, что это такое. Как только вы поймете, что происходит, можно начать дискуссию о том, почему это так.
Николь Болас
1
Этот ответ может помочь.
Iammilind

Ответы:

9

Волшебный термин «Гомогенные координаты», которые используются в системах, где перспектива является фактором. Проверьте вики для обзора, но это действительно долгий курс обучения, чтобы понять его (чего я не знаю).

ddyer
источник
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 делятся на размерность пространства клипа, поэтому в основном ваши вершины проходят это:

х = х / ж

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 (независимо от того, что было обрезано).

dammkewl
источник
Вопрос был в том, почему clip-space такой, какой он есть, а не то, что означает clip-space. То есть какой смысл делить на W.
Никол Болас
2
Тем не менее, он отвечает на 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()- вы обнаружите, что 4-я строка - это 0 0 0 1. Иногда она даже остается неявной.) Если вы поработаете над математикой, вы увидите, что это то же самое, что и

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

4-й компонент вызывается w, и хотя он не должен быть равным 1, он почти всегда таков ( во всяком случае, перед преобразованием; впоследствии он обычно повторно гомогенизируется путем деления целого вектора на 1, wпоэтому он снова равен 1). Это своего рода хак, чтобы разрешить преобразованиям включать в матрицы преобразования.

редактировать

Я считаю, что первоначальная мотивация была для перспективных проекций , которые невозможны с трехмерными координатами. Существуют и другие преобразования, которые вы можете выполнять только с 4D-векторами, но перевод легче всего понять.

Timmmm
источник
2
Объясните свои отрицательные голоса.
Тимммм
+1, при условии, что информация верна, это было хорошее объяснение и было полезно для меня. спасибо
Люк
1

Я также вижу еще одну причину, которая не была упомянута в предыдущих ответах.

Матрицы перевода 4х4, так что вы также можете перевести объект вокруг «мира». Потому что с матрицей 3x3 вы можете вращать и масштабировать трехмерную координату, но вы можете перевести трехмерную координату только с матрицей 4x4, отсюда необходимо выразить трехмерные координаты в 4d-векторе.

Marco
источник
Вы только «нуждаетесь» в 4-мерном векторе при таких определениях. Матрица 4х4 предназначена не только для того, чтобы добавлять, как все любят предполагать и претендовать на других. если все, что вам нужно, это добавить перевод после поворота (в трехмерную точку), вы просто определите матрицу 4x3. гораздо эффективнее, если это все, что вам нужно. Вы не должны ограничивать себя правилами, которые были сделаны по целому ряду других причин, просто потому что это выглядит аккуратнее. лол
Лужа