Tentando responder ao comentário apropriado de Natan, fiz algumas considerações que podem ser úteis para entender o que realmente acontece quando você usa vetores no Affine Space para representar vetores 3D no espaço euclidiano padrão.
Primeiro, chamarei o vetor de qualquer coordenada; portanto, um ponto e um vetor são a mesma entidade; você pode ver um vetor como diferença de dois pontos: V = B - A ; V move
A em B , porque A + V = A + B - A = B . Coloque A = 0 (a origem) e você obterá que V = B - 0 = B : o ponto B e o vetor que se move 0para B são a mesma coisa.
Vou chamar "vetor" - no sentido usado na maioria das bibliotecas 3D - quando um vetor do espaço afim tiver w = 0.
A matriz é usada porque permite representar uma função linear de forma compacta / elegante / eficiente, mas as funções lineares têm a principal desvantagem que não pode transformar a origem: F ( 0 ) = 0 se F quiser ser linear ( amog outra coisa como F (λ X ) = λF ( X ) e F ( A + B ) = F ( A ) + F ( B ))
Isso significa que você não pode construir uma matriz que faça uma tradução, pois nunca moverá o vetor 0 . Aqui entra em jogo o Affine Space . O espaço afim adiciona uma dimensão ao espaço euclidiano para que as transferências possam ser feitas com escala e rotações.
O Espaço Afim é um espaço projetivo no sentido de que você pode construir uma relação de equivalência entre os vetores Afim e Euclidiano, para confundi-los (como fizemos com os poins e os vetores). Todos os vetores afins que se projetam na origem com a mesma direção podem ser vistos como o mesmo vetor euclidiano.
Isso significa que todos os vetores que têm as mesmas proporções nas coordenadas podem ser considerados equivalentes:
Matematicamente:
ou seja, todo vetor afim pode ser reduzido a uma versão canônica em que w = 1 (escolhemos entre cada vetor equivalente o que mais gostamos).
Visualmente (2D euclidiano - 3D afim):
daí a média do espaço "projetivo" ; Você deve notar que aqui o espaço euclidiano é 2D (a região ciana)
Existe um conjunto particular de vetores afins que não podem ser colocados em sua versão canônica (com facilidade) a que está no plano (hiper) w = 0.
Podemos mostrar visualmente:
o que você deve ver é que, enquanto w -> 0, o vetor projetado no espaço euclidiano vai para o infinito, mas para o infinito em uma direção específica .
Agora está claro que a adição de dois vetores no espaço projetivo pode levar a problemas quando você considera o vetor soma como um vetor projetado no espaço euclidiano, isso acrescenta porque você somará os componentes W no espaço afim e os projetará para o (hiper) plano euclidiano.
É por isso que você pode somar "pontos" a "vetores", porque um "vetor" não altera a coordenada w do "ponto", isso é válido apenas para "pontos" onde w = 1:
Como você vê, o ponto verde é o obtido adicionando os dois vetores afins que representam o "ponto" ciano e o vetor "V" , mas se você aplicar V a cada vetor afim em uma forma diferente da do cânone, obterá resultados errados (o "ponto" vermelho ").
Você vê que o Affine Space não pode ser usado de forma transparente para descrever operações em espaços euclidianos, e o uso indevido do termo "vetor" faz sentido sob a restrição (estrita) de somas de computação apenas em vetores projetivos canônicos .
Dito isso, é bastante razoável pensar que a GPU pressupõe que um Vector4 tenha w = 0 ou w = 1, a menos que você realmente saiba o que está fazendo.