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).
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: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:
fonte
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, é:
ou
É 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.
fonte