Intentando responder al comentario apropiado de Natan, hice algunas consideraciones que pueden ser útiles para entender lo que realmente sucede cuando usas vectores en Affine Space para representar vectores 3D en el espacio euclidiano estándar.
Primero llamaré vector lo que tenga coordenadas, por lo que un punto y un vector son la misma entidad; puedes ver un vector como diferencia de dos puntos: V = B - A ; V mueve
A en B porque A + V = A + B - A = B . Pon A = 0 (el origen) y obtendrás que V = B - 0 = B : el punto B y el vector que mueve 0a B son lo mismo.
Llamaré "vector" , en el sentido utilizado en la mayoría de las bibliotecas 3D, cuando un vector del espacio afín tiene w = 0.
La matriz se usa porque le permite representar una función lineal en una forma compacta / elegante / eficiente, pero las funciones lineales tienen la mayor desventaja que no puede transformar el origen: F ( 0 ) = 0 si F quiere ser lineal ( entre otras cosas como F (λ X ) = λF ( X ) y F ( A + B ) = F ( A ) + F ( B ))
Esto significa que no puede construir una matriz que haga una traducción, ya que nunca moverá el vector 0 . Aquí entra en juego el Affine Space . El espacio afín agrega una dimensión al espacio euclidiano para que se puedan realizar trasplantes con escala y rotaciones.
El espacio afín es un espacio proyectivo en el sentido de que puedes construir una relación de equivalencia entre vectores afines y euclidianos para que puedas confundirlos (como hicimos con los puntos y los vectores). Todos los vectores afines que se proyectan al origen con la misma dirección pueden verse como el mismo vector euclidiano.
Esto significa que todos los vectores que tienen las mismas proporciones en las coordenadas pueden considerarse equivalentes:
Matemáticamente:
es decir, cada vector afín se puede reducir a una versión canónica donde w = 1 (elegimos entre cada vector equivalente el que más nos guste).
Visualmente (2D euclidiano - 3D afín):
de ahí la media del espacio "proyectivo" ; Debes notar que aquí el espacio euclidiano es 2D (la región cian)
Hay un conjunto particular de vectores afines que no se pueden poner en su versión canónica (con facilidad) el que se encuentra en el (hiper) plano w = 0.
Podemos mostrarlo visualmente:
lo que (debería) ver es que mientras w -> 0, el vector proyectado en el espacio euclídeo va al infinito pero al infinito en una dirección particular .
Ahora está claro que sumar dos vectores en el espacio proyectivo puede ocasionar problemas cuando considera el vector suma como un vector proyectado en el espacio euclidiano, esto se suma porque sumará los componentes W en el espacio afín y luego los proyectará en el (hiper) plano euclidiano.
Es por eso que puede sumar solo "puntos" a "vectores" porque un "vector" no cambiará la coordenada w del "punto", esto es cierto solo para "puntos" donde w = 1:
Como puede ver, el punto verde es el que se obtiene agregando los dos vectores afines que representan el "punto" cian y el "vector" V , pero si aplica V a cada vector afín en una forma diferente al canon, obtendrá resultados incorrectos (el "" punto "rojo").
Verá que Affine Space no se puede usar de forma transparente para describir la operación en espacios euclidianos y el mal uso del término "vector" tiene sentido bajo la restricción (estricta) de sumas de cálculo solo en vectores proyectivos canónicos .
Dicho esto, es bastante razonable pensar que la GPU asume que un Vector4 debe tener w = 0 o w = 1, a menos que realmente sepa lo que está haciendo.