Comment obtenir la traduction de la matrice de vue

11

Comment puis-je récupérer la position de l'espace-monde de la caméra à partir de sa matrice de vue? Les seules réponses que j'ai vues à cette question suggèrent que la traduction est dans la dernière ligne / col mais cela ne fonctionnerait pas car la matrice contient [x (point) à droite, y (point) vers le haut, z (point) look]

nuit5
la source

Réponses:

10

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).

David Gouveia
la source
1
Pourquoi inverser la matrice en premier? Si vous (espérons-le) savez si vous êtes en ligne principale ou en colonne, l'emplacement du vecteur de traduction devrait être évident.
3Dave
7

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:

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

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:

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

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:

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

ou

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

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.

msell
la source