A partir dessa pergunta , parece que você deseja um vetor de posição com quatro elementos, pois é mais simples modificar sua posição com multiplicação de matrizes.
Por si só, isso implicaria que o quarto elemento deveria ser simplesmente ignorado ao considerá-lo como uma representação de um ponto 3D (assumindo que não haja transformação), mas sei que isso não é verdade, como quando forneço um vetor4 para a GPU, se o quarto elemento não é um, não é renderizado - por quê?
Qual é o significado do quarto elemento, uma vez que está no rasterizador?
EDIT : Na revisão, esta pergunta foi um pouco mal formulada; seria mais preciso que o segundo parágrafo dissesse: "se o valor do quarto elemento não estiver dentro de um determinado intervalo, ele não será renderizado 'corretamente' / 'conforme o esperado'".
Respostas:
O quarto componente é um truque para acompanhar a projeção em perspectiva. Ao fazer uma projeção em perspectiva, você deseja dividir por z: x '= x / z, y' = y / z, mas essa não é uma operação que pode ser implementada por uma matriz 3x3 operando em um vetor de x, y, z O truque que se tornou padrão para fazer isso é anexar uma quarta coordenada, w, e declarar que x, y, z sempre serão divididos por w após todas as transformações serem aplicadas e antes da rasterização.
A projeção em perspectiva é realizada com uma matriz que move z para w, para que você acabe dividindo por z. Mas também oferece a flexibilidade de deixar w = 1,0 se você não quiser fazer uma divisão; por exemplo, se você quer apenas uma projeção paralela, uma rotação ou o que seja.
A capacidade de codificar posições como w = 1, direções como w = 0 e usar a quarta linha / coluna de uma matriz para tradução é um bom benefício colateral, mas não é o principal motivo para anexar w. Poder-se-ia usar transformações afins (uma matriz 3x3 mais um vetor de tradução de 3 componentes) para realizar a tradução sem nenhum w à vista. (É preciso acompanhar o que é uma posição e o que é uma direção e aplicar diferentes funções de transformação a cada uma; isso é um pouco inconveniente, mas não é realmente um grande negócio.)
(BTW, matematicamente, vetores aumentados com w são conhecidos como coordenadas homogêneas e vivem em um local chamado espaço projetivo . No entanto, você não precisa entender a matemática mais alta para fazer gráficos 3D.)
fonte
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.
fonte
Suponha um vetor como (x, y, z, w). Esse vetor possui 4 componentes x (coordenada x no espaço), y (coordenada y no espaço), z (coordenada z no espaço) e o componente w interessante e misterioso. Na verdade, a maioria dos jogos 3D opera no espaço 4d, também chamado espaço homogêneo 4d. Existem alguns benefícios óbvios ->
1> Ele nos ajuda a combinar matrizes de translação e rotação em uma só. Mas você pode estar pensando qual é a utilidade disso, podemos apenas multiplicar a matriz de translação e rotação e é isso, mas não há mais. w em todos os nossos vetores, quando multiplicamos o vetor 3d (xyz) pela matriz combinada de translação e rotação de qualquer maneira que inconscientemente escalaremos os valores com x, y ou z (é assim que a multiplicação de matrizes opera) e isso provavelmente corromper a matriz de posição (parte da conversão da matriz combinada) devido ao dimensionamento. Para corrigir esse problema, o 4º vetor de componente é introduzido e esse componente do vetor (w) manterá o valor 1,0 em 99% dos casos.Este 4º componente nos permite ter valores de posição não escalados (tradução). A matriz é representada como->
e então temos a matriz simples, mas poderosa. :)
2> Copiamos o valor z no componente w no estágio de projeção em perspectiva e dividimos o x, y com ele. Dessa maneira, os objetos ficam mais curtos à medida que se afastam da tela.
fonte