Como obter tradução da matriz de exibição

11

Como recuperar a posição do espaço no mundo da câmera a partir de sua matriz de exibição? As únicas respostas que vi para essa pergunta sugerem que a tradução está na última linha / coluna, mas isso não funcionaria, pois a matriz contém [x (ponto) à direita, y (ponto) para cima, aparência de z (ponto)]

nuit5
fonte

Respostas:

10

Resposta curta

Primeiro inverta a matriz da vista. Busque a tradução da última linha / coluna.

Resposta longa

Uma maneira de deduzir o conteúdo de uma matriz de vista é começar considerando a câmera como qualquer outro objeto no mundo e calculando uma matriz mundial para ela:

RightX  RightY  RightZ  0
UpX     UpY     UpZ     0
LookX   LookY   LookZ   0
PosX    PosY    PosZ    1

Uma matriz mundial transforma coordenadas do espaço local para o espaço mundial. Mas, neste caso, o espaço local da câmera e o espaço de visualização são um e o mesmo, portanto, também podemos dizer que essa matriz transforma coordenadas do espaço de visualização no espaço do mundo.

Como precisamos de uma conversão na direção oposta , temos que inverter a matriz. O resultado é o que chamamos de matriz de exibição que transforma coordenadas do espaço mundial para visualizar o espaço:

   RightX        UpX        LookX      0
   RightY        UpY        LookY      0
   RightZ        UpZ        LookZ      0
-(Pos*Right)  -(Pos*Up)  -(Pos*Look)  1      // * = dot product

E esse é o tipo de matriz que você tem. Portanto, para recuperar a posição da câmera, primeiro você precisa invertê-la e depois pode pegar a tradução da última linha (ou coluna, dependendo do sistema).

David Gouveia
fonte
11
Por que inverter a matriz primeiro? Se você (espero) souber se está na linha principal ou na coluna principal, a localização do vetor de conversão deve ser óbvia.
3Dave
7

Primeiro, eu recomendo apenas armazenar a posição como um vetor separadamente, isso facilitará muito as coisas computacionalmente. Enfim...

[x (dot) right, y (dot) up, z (dot) look]não é a matriz de exibição real. A matriz em si é da forma:

1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1

onde a matriz 3x3 superior esquerda representa rotações, escala, etc. Toda a orientação da câmera é feita lá. A linha e a coluna restantes são usadas para tradução e algumas outras coisas de perspectiva complicadas nas quais não vou entrar agora.

Quando você obtém a matriz (assumindo que seja uma matriz 4x4), a tradução sempre será armazenada na última linha ou na última coluna, dependendo de sua classe de matriz ser da ordem da linha principal ou da coluna principal.

O que você provavelmente está confundindo é o fato de precisar dos produtos de ponto. O que está acontecendo é a simplificação da matemática da matriz, há respostas mais detalhadas nesta pergunta do Stack Overflow: /programming/349050/calculating-a-lookat-matrix

A solução pode ser encontrada aqui , você precisa pegar o inverso da matriz e obter a tradução disso:

Vector3 ViewTrans = Matrix.Invert(ViewMatrix).Translation;
Position = ViewTrans;
Robert Rouhani
fonte
5

Outras respostas aqui explicam como obter a posição da câmera inversa da matriz da câmera.

Se a parte 3x3 da matriz da câmera tiver apenas rotação (sem escala ou cisalhamento), como costuma fazer, o cálculo poderá ser otimizado multiplicando a tradução da matriz da câmera pela transposição da rotação da câmera. A posição da câmera é então o vetor de conversão transformado multiplicado por -1. No GLSL, é:

vec3 cameraPosition = -transpose(mat3(worldToCameraMatrix)) * worldToCameraMatrix[3].xyz;

ou

vec3 cameraPosition = -worldToCameraMatrix[3].xyz * mat3(worldToCameraMatrix);

É isso que tenho usado nos meus shaders de vértice, se não quiser calcular e passar a posição da câmera como uniforme.

msell
fonte