Что делает видеокарта с четвертым элементом вектора в качестве конечной позиции?

25

Из этого вопроса выясняется, что вам нужен вектор положения из четырех элементов, так как проще изменить его положение с помощью умножения матриц.

Само по себе это означало бы, что четвертый элемент следует просто игнорировать, рассматривая его как представление трехмерной точки (при условии отсутствия преобразования), но я знаю, что это не так, как, например, когда я поставляю vector4 для GPU, если четвертый элемент не один, он не отображается - почему?

Какое значение имеет четвертый элемент, когда он находится в растеризаторе?

РЕДАКТИРОВАТЬ : На рассмотрении этот вопрос был несколько плохо сформулирован; для второго абзаца было бы точнее сказать: «если значение четвертого элемента не находится в определенном диапазоне, оно не отображается« правильно »/« как ожидалось »».

sebf
источник
разве вектор 4 с координатами (x, y, z, 0.5) не дает те же результаты, что и вектор 4 с координатами (2x, 2y, 2z, 1)?
FxIII
@FxIII, я не смог воспроизвести это точно, но вы правы, это было неверное общее заявление, сделанное в моем первоначальном посте, после еще нескольких экспериментов я обновил его.
sebf

Ответы:

23

Четвертый компонент - это уловка для отслеживания перспективного проецирования. Когда вы делаете перспективную проекцию, вы хотите разделить на z: x '= x / z, y' = y / z, но это не операция, которая может быть реализована с помощью матрицы 3x3, работающей с вектором x, y, z. Уловка, которая стала стандартной для этого, заключается в добавлении четвертой координаты w и объявлении, что x, y, z всегда будут делиться на w после применения всех преобразований и перед растеризацией.

Перспективная проекция затем достигается наличием матрицы, которая перемещает z в w, так что вы в итоге делитесь на z. Но это также дает вам возможность оставить w = 1.0, если вы не хотите делить; например, если вы просто хотите параллельную проекцию или поворот или что-то еще.

Возможность кодировать позиции как w = 1, направления как w = 0 и использовать четвертую строку / столбец матрицы для перевода - это приятное побочное преимущество, но это не основная причина добавления w. Можно использовать аффинные преобразования (матрица 3x3 плюс 3-компонентный вектор перевода), чтобы выполнить перевод без каких-либо видимых w. (Нужно было бы отслеживать, какое положение и какое направление, и применять разные функции преобразования к каждому; это немного неудобно, но на самом деле не имеет большого значения.)

(Кстати, математически, векторы, дополненные w, называются однородными координатами , и они живут в месте, называемом проективным пространством . Однако вам не нужно понимать высшую математику, чтобы делать трехмерную графику.)

Натан Рид
источник
Еще раз немного неправильно говорить о векторах и точках в этих терминах, так как между точками и векторами существует изоморфизм (точка и вектор, которые перемещают начало координат в эту точку, являются одной и той же сущностью). Было бы правильнее говорить о точках / векторах (w! = 0) и (проективных) направлениях (w = 0). В любом случае, неправильное использование термина «вектор» является довольно консолидированным стандартом в языке 3d-библиотек.
FxIII
@FxIII: исправлено. Было странно использовать «вектор» в стандартном математическом смысле и как синоним «направления» в том же посте.
Никол Болас
@FxIII и Никол Болас: я не согласен. Вы действительно кодируете векторы как w = 0 - включая как векторы, которые просто представляют направление, так и фактические векторы, где важна длина. Например, вы можете преобразовать вектор угловой скорости (направление = ось вращения, длина = скорость) объекта между локальным пространством и мировым пространством, используя матрицу объекта. Вы не хотите, чтобы угловая скорость добавляла перевод объекта; Вы только хотите, чтобы это было повернуто. Итак, вы установили w = 0. Я не вижу проблемы?
Натан Рид
@NathanReed Я надеюсь, что мой пост поможет прояснить суть, так или иначе, большая часть моей точки зрения связана с определениями и неправильным использованием термина «вектор» плюс превосходство линейной алгебры над терминологией стандартной библиотеки 3D. Конечно, оба спорны, поскольку каждое определение и утверждение первенства
FxIII
@ Натан, я теперь ясно вижу назначение четвертого элемента и то, как растровая информация используется в нем. Большое спасибо!
sebf
10

Чтобы ответить на соответствующий комментарий Натана, я сделал несколько соображений, которые могут быть полезны для понимания того, что действительно происходит, когда вы используете векторы в Affine Space для представления трехмерных векторов в стандартном евклидовом пространстве.

Сначала я назову вектор тем, что имеет координаты, поэтому точка и вектор - это одна и та же сущность; Вы можете видеть вектор как разность двух точек: V = B - A ; В перемещает А в В , потому что А + V = A + B - A = B . Положите A = 0 (начало координат), и вы получите, что V = B - 0 = B : точка B и вектор, который перемещается 0к Б это одно и то же.

Я назову «вектор» - в том смысле, который используется в большинстве трехмерных библиотек - когда вектор аффинного пространства имеет w = 0.

Матрица используется потому, что она позволяет вам представлять линейную функцию в компактной / элегантной / эффективной форме, но у линейных функций есть главный недостаток, который не может преобразовать источник: F ( 0 ) = 0, если F хочет быть линейным ( Еще одна вещь такая F (λ X ) = λF ( X ) и F ( A + B ) = F ( A ) + F ( B ))

Это означает, что вы не можете построить матрицу, которая выполняет перевод, поскольку вы никогда не будете перемещать вектор 0 . Здесь вступает в игру Affine Space . Аффинное пространство добавляет измерение к евклидовому пространству, так что перемещение может быть выполнено с масштабированием и вращением.

Аффинное пространство - это проективное пространство в том смысле, что вы можете построить отношение эквивалентности между аффинным и евклидовым векторами, чтобы вы могли перепутать их (как мы это делали с вершинами и векторами). Все аффинные векторы, проецируемые в начало координат с одинаковым направлением, могут рассматриваться как один и тот же евклидов вектор.

Это означает, что все векторы, имеющие одинаковые пропорции в координатах, можно считать эквивалентными:

Математически:

эквивалентность

т. е. каждый аффинный вектор может быть сведен к канонической версии, где w = 1 (мы выбираем среди каждого эквивалентного вектора тот, который нам больше нравится).

Визуально (2D евклидово - 3D аффинно):

визуальная эквивалентность

отсюда среднее «проективного» пространства; Вы должны заметить, что здесь евклидово пространство является двумерным (голубая область)

Существует конкретный набор аффинных векторов, которые не могут быть помещены в их канонической версии (с легкостью) той, которая лежит на (гипер) плоскости w = 0.

Мы можем показать это визуально:

введите описание изображения здесь

то, что вы (должны) увидеть, это то, что в то время как w -> 0, тогда проецируемый вектор в евклидово пространство уходит в бесконечность, но в бесконечность в определенном направлении .

Теперь ясно, что сложение двух векторов в проективном пространстве может привести к проблемам, когда вы рассматриваете вектор суммы как спроецированный вектор в евклидовом пространстве, это добавляется, потому что вы суммируете W-компоненты в аффинном пространстве и затем проецируете их на евклидова (гипер) плоскость.

Вот почему вы можете суммировать только «точки» с «векторами», потому что «вектор» не изменит координату w «точки». Это верно только для «точек», где w = 1:

введите описание изображения здесь

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

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

Сказал, что вполне разумно думать, что GPU предполагает, что Vector4 должен иметь w = 0 или w = 1, если вы действительно не знаете, что делаете.

FXIII
источник
Было очень трудно выбрать один ответ на этот вопрос, поскольку все они помогли понять, как используются отношения четвертого компонента и почему это необходимо. Ваше объяснение евклидова и аффинного пространства очень полезно, я бы, конечно, не понял его так, как сейчас, без такого уровня детализации. Большое спасибо!
sebf
+1 за хорошее объяснение (и диаграммы!) Проективного пространства. Однако аффинное пространство и проективное пространство - это не одно и то же (см. Определение аффинного пространства в Википедии ). Возможно, хороший способ сказать это так: проективное 3-пространство и аффинное 3-пространство могут быть вложены в R ^ 4, но вложения не совсем согласны. Кодирование векторов из аффинного пространства при w = 0 возможно и полезно, но не имеет смысла с проективной точки зрения. Аналогично, проективные направления (точки на бесконечности) не имеют смысла с аффинной точки зрения.
Натан Рид
1

Предположим, что вектор похож на (x, y, z, w). Этот вектор имеет 4 компонента x (координата x в пространстве), y (координата y в пространстве), z (координата z в пространстве) и интересный и загадочный w-компонент. На самом деле большинство 3d-игр работают в 4-мерном пространстве. Его также называют 4-мерным однородным пространством. Есть некоторые очевидные преимущества этого ->

1> Это помогает нам объединять матрицы перевода и вращения в одну. Но вы можете подумать, в чем польза от этого, мы могли бы просто умножить матрицу перевода и вращения, и это все, но не более того. Если у нас нет Компонент w во всех наших векторах, тогда, когда мы умножим трехмерный вектор (xyz) на объединенную матрицу перемещения и поворота любым способом, мы будем бессознательно масштабировать значения с помощью x, y или z (именно так работает матричное умножение), и это будет возможно, повреждена матрица позиции (переводная часть комбинированной матрицы) из-за масштабирования. Чтобы исправить эту проблему, введен 4-й компонентный вектор, и этот компонент вектора (w) будет иметь значение 1,0 в 99% случаев. Этот 4-й компонент позволяет нам иметь немасштабированные значения положения (перевод). Матрица представляется как->

 [x y z w] [rx1 rx2 rx3 1]
           [ry1 ry2 ry3 1]
           [rz1 rz2 rz3 1]
           [px  py  pz  1]

и тогда у нас есть простая, но мощная матрица. :)

2> Мы копируем значение z в компонент w на этапе перспективного проецирования и делим его на x, y. Таким образом, объекты становятся короче по мере удаления от экрана.

GamePro
источник
Спасибо! Я все больше вижу необходимость использования четвертого компонента в любом действительно полезном представлении сущности в трехмерном пространстве.
sebf