Pergunta

Estou começando a aprender sobre a renderização em 3D e tenho feito um bom progresso. Peguei muito em relação às matrizes e às operações gerais que podem ser executadas nelas.

Uma coisa que ainda não estou seguindo é o uso de matrizes do OpenGL. Eu vejo isso (e coisas assim) bastante:

x y z n
-------
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

Portanto, meu melhor entendimento é que é uma matriz normalizada (sem magnitude) 4 dimensional, coluna-major. Também que essa matriz em particular é chamada de "Matriz de Identidade".

Algumas perguntas:

  • Qual é a dimensão "Nth"?
  • Como e quando isso é aplicado?

Minha maior confusão surge de como o OpenGL faz uso desse tipo de dados.

Foi útil?

Solução

A resposta curta que pode ajudá -lo a começar é que a dimensão 'Nth', como você chama, não representa nenhuma quantidade visualizável. É adicionado como uma ferramenta prática para ativar as multiplicações da matriz que causam tradução e projeção de perspectiva. Uma matriz 3x3 intuitiva não pode fazer essas coisas.

Um valor 3D que representa um ponto no espaço sempre recebe 1 anexado como o quarto valor para fazer com que esse truque funcione. Um valor 3D que representa uma direção (ou seja, um normal, se você estiver familiarizado com esse termo), recebe 0 anexado no quarto lugar.

Outras dicas

Na maioria dos gráficos 3D, um ponto é representado por um vetor de 4 componentes (x, y, z, w), onde w = 1. Operações usuais aplicadas em um ponto incluem tradução, escala, rotação, reflexão, distorção e combinação destes.

Essas transformações podem ser representadas por um objeto matemático chamado "Matrix". Uma matriz se aplica a um vetor como este:

[ a b c tx ] [ x ]   [ a*x + b*y + c*z + tx*w ]
| d e f ty | | y | = | d*x + e*y + f*z + ty*w |
| g h i tz | | z |   | g*x + h*y + i*z + tz*w |
[ p q r s  ] [ w ]   [ p*x + q*y + r*z +  s*w ]

Por exemplo, a escala é representada como

[ 2 . . . ] [ x ]   [ 2x ]
| . 2 . . | | y | = | 2y |
| . . 2 . | | z |   | 2z |
[ . . . 1 ] [ 1 ]   [ 1  ]

e tradução como

[ 1 . . dx ] [ x ]   [ x + dx ]
| . 1 . dy | | y | = | y + dy |
| . . 1 dz | | z |   | z + dz |
[ . . . 1  ] [ 1 ]   [   1    ]

Um dos motivos do quarto componente é tornar uma tradução representável por uma matriz.

A vantagem de usar uma matriz é que várias transformações podem ser combinadas em uma por meio de multiplicação da matriz.

Agora, se o objetivo é simplesmente trazer tradução sobre a mesa, então eu diria (x, y, z, 1) em vez de (x, y, z, w) e fazer a última linha da matriz sempre [0 0 0 1], como feito geralmente para gráficos 2D. De fato, o vetor de 4 componentes será mapeado de volta ao vetor normal de 3 vetores por meio desta fórmula:

[ x(3D) ]   [ x / w ]
| y(3D) ] = | y / w |
[ z(3D) ]   [ z / w ]

Isso é chamado coordenadas homogêneas. Permitir que isso torna a projeção de perspectiva expressa com uma matriz também, que pode combinar novamente com todas as outras transformações.

Por exemplo, como os objetos mais distantes devem ser menores na tela, transformamos as coordenadas 3D em 2D usando fórmula

x(2D) = x(3D) / (10 * z(3D))
y(2D) = y(3D) / (10 * z(3D))

Agora, se aplicarmos a matriz de projeção

[ 1 . .  . ] [ x ]   [  x   ]
| . 1 .  . | | y | = |  y   |
| . . 1  . | | z |   |  z   |
[ . . 10 . ] [ 1 ]   [ 10*z ]

Então as coordenadas 3D reais se tornariam

x(3D) := x/w = x/10z
y(3D) := y/w = y/10z
z(3D) := z/w = 0.1

Então, precisamos apenas cortar a coordenada Z para projetar para 2D.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top