Calcul d'une matrice de LookAt

je suis en train d'écrire un moteur 3d et je suis tombé sur L'algorithme LookAt décrit dans la documentation de DirectX:

zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)

 xaxis.x           yaxis.x           zaxis.x          0
 xaxis.y           yaxis.y           zaxis.y          0
 xaxis.z           yaxis.z           zaxis.z          0
-dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  l

maintenant je comprends comment cela fonctionne du côté de la rotation, mais ce que je ne comprends pas tout à fait est pourquoi il met le composant de traduction de la matrice pour être ces produits de points. En l'examinant un peu, il semble qu'il ajuste la position de la caméra d'une petite quantité basée sur une projection des nouveaux vecteurs de base sur la position du des yeux/de la caméra.

la question est pourquoi doit-il faire cela? Que faut-il accomplir?

32
demandé sur Judge Maygarden 2008-12-08 13:04:08

8 réponses

je construis une matrice de regard en créant une matrice de rotation de 3x3 comme vous l'avez fait ici et en l'étendant ensuite à un 4x4 avec des zéros et le simple 1 dans le coin inférieur droit. Ensuite, je construis une matrice de traduction 4x4 en utilisant les coordonnées de points oculaires négatifs (pas de produits de points), et je multiplie les deux matrices ensemble. À mon avis, cette multiplication donne l'équivalent des produits de points dans la rangée du bas de votre exemple, mais j'aurais besoin de travailler sur le papier pour être sûr.

la rotation 3D transforme vos axes. Par conséquent, vous ne pouvez pas utiliser le point oculaire directement sans le transformer en ce nouveau système de coordonnées. C'est ce que les multiplications matricielles -- ou dans ce cas-ci, les 3 valeurs dot-product -- accomplissent.

15
répondu Judge Maygarden 2008-12-09 17:31:48

Note l'exemple donné est une matrice principale de la ligne de gauche .

ainsi l'opération est: Traduire à l'origine d'abord (déplacer par - oeil ), puis tourner de sorte que le vecteur de oeil à à s'aligne avec + z:

fondamentalement, vous obtenez le même résultat si vous pré-multiplier la matrice de rotation par une traduction - oeil :

[      1       0       0   0 ]   [ xaxis.x  yaxis.x  zaxis.x 0 ]
[      0       1       0   0 ] * [ xaxis.y  yaxis.y  zaxis.y 0 ]
[      0       0       1   0 ]   [ xaxis.z  yaxis.z  zaxis.z 0 ]
[ -eye.x  -eye.y  -eye.z   1 ]   [       0        0        0 1 ]

  [         xaxis.x          yaxis.x          zaxis.x  0 ]
= [         xaxis.y          yaxis.y          zaxis.y  0 ]
  [         xaxis.z          yaxis.z          zaxis.z  0 ]
  [ dot(xaxis,-eye)  dot(yaxis,-eye)  dot(zaxis,-eye)  1 ]

Notes complémentaires:

notez qu'une transformation de visualisation est (intentionnellement) inversé : vous multipliez chaque vertex par cette matrice pour" déplacer le monde " de sorte que la partie que vous voulez voir se termine dans le volume de vue canonique.

notez également que le composant de la matrice de rotation (appelé R ) de la matrice LookAt est une matrice de changement de base inversé où les lignes de R sont les nouveaux vecteurs de base en termes d'anciens Vecteurs de base (d'où les noms de variables xaxis.x,.. xaxis est le nouvel x axis après le changement de base se produit). En raison de l'inversion, cependant, les lignes et les colonnes sont transposées.

43
répondu bobobobo 2012-10-13 16:05:13

quelques informations générales:

la matrice lookat est une matrice qui positionne / fait pivoter quelque chose pour pointer vers (Regarder) un point dans l'espace, à partir d'un autre point dans l'espace.

La méthode prend un choix "centre" de la caméras de vue, un" vecteur qui représente la direction "haut" de la caméra est presque toujours (0,1,0), mais il n'a pas à l'être), et un "œil" vecteur, qui est l'emplacement de la caméra.

Il est utilisé principalement pour la caméra mais peut aussi être utilisé pour d'autres techniques comme les ombres, les projecteurs, etc.

franchement, Je ne suis pas tout à fait sûr de la raison pour laquelle le composant de traduction est défini comme il l'est dans cette méthode. Dans gluLookAt (D'OpenGL), le composant de traduction est réglé à 0,0,0 car la caméra est toujours considérée comme étant à 0,0,0.

3
répondu TM. 2008-12-09 17:44:23

Dot produit projette simplement un point à un axe pour obtenir le X-, y-, ou z-composante de l'oeil. Vous déplacez la caméra vers l'arrière afin de (0, 0, 0) de (10, 0, 0) et de (100000, 0, 0) ont un effet différent.

2
répondu Eugene Yokota 2008-12-08 10:12:45

cette composante de traduction vous aide en créant une base orthonormale avec votre" oeil "à l'origine et tout le reste exprimé en termes de cette Origine (votre" oeil") et les trois axes.

le concept n'est pas tellement que la matrice ajuste la position de la caméra. Plutôt, il essaie de simplifier le calcul: quand vous voulez rendre une image de tout ce que vous pouvez voir à partir de votre "oeil" position, il est plus facile de prétendre que votre l'œil est le centre de l'univers.

Donc, la réponse courte est que cela rend le calcul plus facile.

répondre à la question dans le commentaire: la raison pour laquelle vous ne faites pas simplement soustraire la position "oeil" de tout A à voir avec l'ordre des opérations. Pensez - y de cette façon: une fois que vous êtes dans le nouveau cadre de référence (i.e., la position de la tête représentée par xaxis, yaxis et zaxis) vous voulez maintenant exprimer des distances en termes de cette nouvelle (rotation) cadre de référence. C'est pourquoi vous utilisez le produit dot des nouveaux axes avec la position de l'oeil: cela représente la même distance que les choses doivent se déplacer mais il utilise le nouveau système de coordonnées.

2
répondu Bob Cross 2008-12-09 21:32:42

La lookat matrice n'ces deux étapes:

  1. Traduire votre modèle à l'origine,
  2. la tourner selon l'orientation mise en place par le vecteur ascendant et le regard

    direction.

le produit de point signifie simplement que vous faites une traduction d'abord et puis tourner. Au lieu de multiplier deux matrices, le produit dot multiplie simplement une rangée par une colonne.

1
répondu Kalle 2008-12-09 17:50:38

Une transformation de la matrice de 4x4, contient deux-trois composants: 1. matrice de rotation 2. traduction pour ajouter. 3. échelle (plusieurs moteurs ne l'utilisent pas directement dans la matrice).

la combinaison des them transformerait un point de l'espace A à L'Espace B, donc c'est une matrice de transformation M_ab

maintenant, l'emplacement de la caméra est dans l'Espace A et donc ce n'est pas la transformation valide pour l'Espace B, donc vous devez multiplier cet emplacement avec la transformation de rotation.

La seule question qui reste est pourquoi les points? Eh bien, si vous écrivez les 3 points sur un papier, vous découvrirez que 3 points avec X, Y et Z est exactement comme une multiplication avec une matrice de rotation.

un exemple pour cette quatrième ligne / colonne serait de prendre le point zéro - (0,0) dans l'espace du monde. Ce n'est pas le point zéro dans l'espace de la caméra, et donc vous devez savoir ce qui est la représentation dans l'espace de la caméra, depuis la rotation et l'échelle laisser à zéro!

cheers

1
répondu Adi 2009-02-15 14:58:28

il est nécessaire de placer le point oculaire dans l'espace de votre axe, pas dans l'espace du monde. Lorsque vous marquez un vecteur avec un vecteur de base d'Unité de coordonnées, l'un des x,y,z, il vous donne les coordonnées de l'oeil dans que espace. Vous transformer emplacement en appliquant les trois traductions en dernier lieu, dans ce cas, la dernière ligne. Puis en déplaçant l'œil vers l'arrière, avec un négatif, soit l'équivalent de bouger tout le reste de l'espace vers l'avant. Tout comme le déplacement dans un l'ascenseur vous fait vous sentir comme le reste du monde, est l'abandon de dessous de vous.

L'utilisation d'une matrice gaucher, avec la traduction comme dernière ligne au lieu de la dernière colonne, est une différence religieuse qui n'a absolument rien à voir avec la réponse. Cependant, c'est un dogme qui doit être strictement évité. Il est préférable d'enchaîner les transformations de global-to-local (cinématique vers l'avant) de gauche à droite, dans un ordre de lecture naturel, lorsque l'on dessine des croquis d'arbre. Utilisation de la main gauche les matrices vous obligent à écrire de droite à gauche.

0
répondu DragonLord 2014-04-24 01:10:39