Чтобы ответить на соответствующий комментарий Натана, я сделал несколько соображений, которые могут быть полезны для понимания того, что действительно происходит, когда вы используете векторы в 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, если вы действительно не знаете, что делаете.