O que a placa gráfica faz com o quarto elemento de um vetor como posição final?

25

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'".

sebf
fonte
um vetor4 com coordenadas (x, y, z, 0,5) fornece os mesmos resultados do vetor4 com coordenadas (2x, 2y, 2z, 1)?
FxIII 1/10/11
@FxIII, eu não consegui reproduzir exatamente, mas você está certo de que foi uma declaração incorreta feita no meu post original, depois de mais algumas experiências, atualizei.
sebf 2/10/11

Respostas:

23

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.)

Nathan Reed
fonte
Mais uma vez, é um pouco incorreto falar sobre vetores e pontos nesses termos, pois existe um isomorfismo entre pontos e vetores (o ponto e o vetor que movem a origem para esse ponto são a mesma entidade). Seria mais correto falar sobre pontos / vetores (w! = 0) e direções (projetivas) (w = 0). De qualquer forma, o uso indevido do termo "vetor" é um padrão bastante consolidado na linguagem das bibliotecas 3D.
FxIII 1/10/11
@FxIII: corrigido. Era confuso usar "vetor" no sentido matemático padrão e como sinônimo de "direção" no mesmo post.
Nicol Bolas
@FxIII e Nicol Bolas: eu discordo. Você realmente codifica vetores como w = 0 - incluindo os dois vetores que representam apenas uma direção e os vetores reais em que o comprimento é importante. Por exemplo, você pode transformar o vetor de velocidade angular (direção = eixo de rotação, comprimento = velocidade) de um objeto entre o espaço local e o espaço do mundo usando a matriz do objeto. Você não deseja que a velocidade angular inclua a tradução do objeto; você só quer que seja girado. Então você define w = 0. Não vejo o problema?
Nathan Reed
@NathanReed Espero que meu post ajude a esclarecer o assunto, de qualquer forma, uma grande parte do meu argumento diz respeito às definições e ao uso indevido do termo vetor mais a primazia da álgebra linear sobre a terminologia padrão da biblioteca 3D. É claro que ambos são discutíveis como toda definição e reivindicar primazia é
FXIII
@ Nathan, agora posso ver claramente o objetivo do quarto elemento e como as informações que ele contém são usadas pelo rasterizador. Muito obrigado!
sebf 2/10/11
10

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:

equivalência

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):

equivalência visual

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:

insira a descrição da imagem aqui

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:

insira a descrição da imagem aqui

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.

FxIII
fonte
Foi muito difícil escolher uma resposta para essa pergunta, pois todas contribuíram para o entendimento de como o relacionamento do quarto componente é usado e por que é necessário. Sua explicação sobre o espaço euclidiano e afim é muito útil, eu certamente não o entenderia como o faço agora sem esse nível de detalhe. Muito obrigado!
sebf 2/10/11
+1 para uma boa explicação (e diagramas!) Do espaço projetivo. No entanto, espaço afim e espaço projetivo não são a mesma coisa (consulte a definição de espaço afim na Wikipedia ). Talvez uma boa maneira de dizer isso seja: os 3 espaços projetivos e os 3 espaços afins podem ser incorporados no R ^ 4, mas os embeddings não são inteiramente consoantes. A codificação de vetores do espaço afim como w = 0 é possível e útil, mas não é significativa do ponto de vista projetivo. Da mesma forma, as direções projetivas (pontos no infinito) não são significativas do ponto de vista afim.
Nathan Reed
1

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->

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

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.

gamePro
fonte
Obrigado! Estou vendo cada vez mais a necessidade de usar o quarto componente em qualquer representação verdadeiramente útil de uma entidade no espaço 3D.
sebf 2/10/11