Por que precisamos de uma quarta coordenada para dividir por z?

12

Eu li a resposta aqui:

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

"O quarto componente é um truque para acompanhar a projeção em perspectiva. Quando você faz uma projeção em perspectiva, deseja dividir por z: x '= x / z, y' = y / z, mas essa não é uma operação que pode ser implementado 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 será sempre dividido por w depois que todas as transformações forem aplicadas e antes da rasterização ".

mas não entendi por que não conseguimos dividir por z usando uma matriz 3x3?

não podemos simplesmente multiplicar por

1/z 0 0
0 1/z 0
0 0 1/z

para obter [x/z y/z 1]

?

Comunidade
fonte
Tente expressar uma transformação (ou composição de transformações) que inclua a tradução em algum lugar da cadeia. Sem um valor aw, você não pode expressá-lo em uma única matriz.
DMGregory
Eu entendo a parte de tradução, mas eu simplesmente não entendia como a adição de uma quarta coordenada vai ajudar ou é aa truque para dividir por z
Pelo que vale a pena, você pode totalmente fazer o que disse. Dividir xey por z é um método válido para converter coordenadas 3d em um espaço de tela 2D com projeção em que objetos distantes ficam menores. O w é uma coordenada homogênea para levar até a quarta dimensão para poder fazer a tradução.
Alan Wolfe

Respostas:

14

Porque se você apenas dividir [x, y, z]por zvocê obtém [x/z, y/z, 1]e perdeu o valor real de z, o que é realmente útil se você deseja fazer um corte de plano próximo / distante ou preencher um buffer Z.

A melhor maneira de manter algumas informações sobre z , pelo menos na GPU, é usar 4 componentes em vez de 3. Na prática, o que está realmente nos dois últimos componentes vetoriais antes da divisão da perspectiva depende de que tipo de projeção e efeitos você quer.

Por exemplo, no caso de uma projeção em perspectiva, este é o vetor de 4 componentes resultante:

| a 0 0 0 |   | x |   |   ax   |
| 0 b 0 0 |   | y |   |   by   |
| 0 0 c d | × | z | = | cz + d |
| 0 0 1 0 |   | 1 |   |    z   |

Após a divisão da perspectiva, o vetor se torna:

|  ax/z   |
|  by/z   |
| c + d/z |
|    1    |

E a c + d/zpeça nos deixa com informações suficientes para preencher o buffer Z.

sam hocevar
fonte
Você pode dividir apenas X e Y por Z, produzindo [x / z, y / z, z]. A GPU não precisa fazer a divisão vetorial, poderia ter sido projetada para fazer qualquer cálculo.
user253751
3

Tecnicamente, você poderia fazer isso. Mas por que se preocupar? Quando você tiver essa final z, poderá:

  • construa uma matriz 3x3 como você descreveu, desperdiçando 9 * sizeof(float)bytes de espaço, gastando ciclos para calcular 1/z(uma divisão) e fazendo nove multiplicações e seis adições para obter seu vértice final, ou
  • você pode fazer três divisões, como o pipeline moderno atualmente

Um deles parece muito mais ideal para mim, e não é o primeiro. Mesmo que o hardware otimizado exista para a multiplicação da matriz, como certamente existe, ainda é conceitualmente mais complexo do que uma simples divisão.

Além disso, uma matriz 3x3 não pode codificar uma tradução, e assim por uma matriz 4x4 (e, portanto, o quarto wde coordenadas) é usado no início do gasoduto de qualquer maneira . Isso significa que você já tem o quarto componente ali, para que possa usá-lo para transportar um valor útil e fazer sua divisão com ele.


fonte