Réponse courte
Inversez d'abord la matrice de vue. Récupérez ensuite la traduction de la dernière ligne / colonne.
Longue réponse
Une façon de déduire le contenu d'une matrice de vue est de considérer la caméra comme n'importe quel autre objet dans le monde et de calculer une matrice mondiale pour elle:
RightX RightY RightZ 0
UpX UpY UpZ 0
LookX LookY LookZ 0
PosX PosY PosZ 1
Une matrice mondiale transforme les coordonnées de l'espace local en espace mondial. Mais dans ce cas, l'espace local de la caméra et l'espace de vue sont une seule et même chose, nous pouvons donc également dire que cette matrice transforme les coordonnées de l'espace de vue en espace mondial.
Puisque nous avons besoin d'une conversion dans la direction opposée , nous devons inverser la matrice. Le résultat est ce que nous appelons la matrice de vue qui transforme les coordonnées de l'espace mondial en espace de vue:
RightX UpX LookX 0
RightY UpY LookY 0
RightZ UpZ LookZ 0
-(Pos*Right) -(Pos*Up) -(Pos*Look) 1 // * = dot product
Et c'est le genre de matrice que vous avez. Donc, pour récupérer la position de la caméra, vous devez d'abord l'inverser, puis vous pouvez récupérer la traduction de la dernière ligne (ou colonne selon le système).
Tout d'abord, je recommanderais FORTEMENT de simplement stocker la position en tant que vecteur séparément, cela facilitera considérablement les calculs. Quoi qu'il en soit ...
[x (dot) right, y (dot) up, z (dot) look]
n'est pas la matrice de vue réelle. La matrice elle-même est de la forme:où la matrice 3x3 en haut à gauche représente les rotations, l'échelle, etc. Toute l'orientation de la caméra s'y fait. La ligne et la colonne restantes sont utilisées pour la traduction et d'autres éléments de perspective compliqués dans lesquels je ne vais pas entrer en ce moment.
Lorsque vous obtenez la matrice (en supposant qu'il s'agit d'une matrice 4x4), la traduction sera toujours stockée dans la dernière ligne ou la dernière colonne, selon que votre classe de matrice est de l'ordre des lignes principales ou des colonnes principales.
Ce qui vous rend probablement confus, c'est que vous avez besoin des produits scalaires. Ce qui se passe est la simplification des mathématiques matricielles, il y a des réponses plus détaillées dans cette question Stack Overflow: /programming/349050/calculating-a-lookat-matrix
La solution peut être trouvée ici , vous devez prendre l'inverse de la matrice et obtenir la traduction de cela:
la source
D'autres réponses expliquent ici comment obtenir la position de la caméra à partir de l'inverse de la matrice de la caméra.
Si la partie 3x3 de la matrice de la caméra n'a qu'une rotation (pas de mise à l'échelle ou de cisaillement) comme elles le font habituellement, le calcul peut être optimisé en multipliant la translation de la matrice de la caméra avec la transposition de la rotation de la caméra. La position de la caméra est alors le vecteur de translation transformé multiplié par -1. En GLSL, c'est:
ou
C'est ce que j'ai utilisé dans mes vertex shaders si je ne veux pas calculer et passer la position de la caméra comme uniforme.
la source