Le calcul d'une matrice LookAt
Je suis dans le milieu de l'écriture d'un moteur 3d, et je suis venu à travers la LookAt algorithme 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 reçois la façon dont il fonctionne sur le côté de rotation, mais ce que je n'ai pas tout à fait obtenir est pourquoi il met la traduction de composants de la matrice à ceux point des produits. En examinant un peu, il semble que c'est le réglage de la position de la caméra par une petite quantité sur une projection des nouveaux vecteurs de base sur la position de l'œil/la caméra.
La question est pourquoi est-il nécessaire de le faire? Que faut-il accomplir?
- Lisez des choses sur msdn.microsoft.com/en-au/library/bb206269(SV.85).aspx
- Notons que c'est un ligne principale, de gauche à regarder matrix
- est la lettre L ("l") en bas à droite censé être un (1)
Vous devez vous connecter pour publier un commentaire.
- Je construire un look à la matrice par la création d'un 3x3 matrice de rotation comme vous l'avez fait ici, puis l'étendre à un 4x4 avec des zéros et la seule 1 dans le coin en bas à droite. Puis-je construire un 4x4 de la traduction de la matrice à l'aide de l'négatif œil, les coordonnées des points (pas de point de produits), et de multiplier les deux matrices ensemble. Ma conjecture est que cette multiplication des rendements, l'équivalent de la dot produits dans la ligne en bas de votre exemple, mais j'aurais besoin de travailler sur le papier pour vous en assurer.
La rotation 3D transforme vos axes. Par conséquent, vous ne pouvez pas utiliser le point de vue directement, sans transformation dans ce nouveau système de coordonnées. C'est ce que la matrice de multiplications, ou dans ce cas, le dot 3-les valeurs de produit de le faire.
Remarque l'exemple est donné de la main gauche, ligne principale de la matrice.
De sorte que le fonctionnement est: Traduire à l'origine de la première (passer par -œil), puis faites-la pivoter de sorte que le vecteur de œil à À lignes avec +z:
Fondamentalement, vous obtenez le même résultat si vous pré-multiplier la matrice de rotation d'une traduction -œil:
Remarques supplémentaires:
Noter qu'une transformation de visualisation est (volontairement) inversé: vous multipliez chaque sommet par cette matrice de "bouger le monde", de sorte que la partie que vous voulez voir se termine dans la canonique de vue volume.
Également de noter que la matrice de rotation (appeler R) de la composante LookAt matrice est un inversé changement de base matrice dont les lignes de R sont les nouveaux vecteurs de base en fonction de l'ancienne vecteurs de base (d'où les noms de variable xaxis.x, .. xaxis est le nouveau de l'axe x, après le changement de base se produit). En raison de l'inversion, cependant, les lignes et les colonnes sont transposées.
Juste quelques informations générales:
La lookat de la matrice est une matrice positions /tourne quelque chose à point à (regarder) un point dans l'espace, à partir d'un autre point de 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.
Ceci est utilisé principalement pour la caméra, mais peut également être utilisé pour d'autres techniques comme des ombres, les lumières, etc.
Franchement, je ne suis pas entièrement sûr de savoir pourquoi la traduction composant est défini en tant que c'est dans cette méthode. Dans
gluLookAt
(à partir d'OpenGL), la traduction composant est défini pour 0,0,0 depuis l'appareil photo est considéré comme étant à 0,0,0 toujours.Que la traduction composant permet de créer un base orthogonale avec votre "œil" à l'origine et tout le reste exprimé dans les termes de l'origine (votre "œil") et les trois axes.
Le concept n'est pas tellement que la matrice est le réglage de la position de la caméra. C'est plutôt d'essayer de simplifier le calcul: lorsque vous souhaitez afficher une image de tout ce que vous pouvez voir à partir de votre "œil" de la position, il est plus facile de prétendre que votre œil est le centre de l'univers.
Donc, la réponse courte est que cela rend le calcul plus facile.
De répondre à la question dans le commentaire: la raison pour laquelle vous n'avez pas juste soustraire la "vue" de la position à partir de tout ce qui 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 (c'est à dire, la position de la tête représentée par xaxis, ordonnée, et zaxis) que vous voulez maintenant exprimer les distances en termes de ce nouveau (rotation) cadre de référence. C'est pourquoi vous utilisez le produit scalaire de la nouvelle axes avec la position des yeux: que représente la même distance que les choses doivent bouger, mais il utilise le nouveau système de coordonnées.
Produit scalaire simplement des projets d'un point à un axe afin d'obtenir le x-, y-, z-composante de l'œil. 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.
La lookat matrice n'ces deux étapes:
direction.
Le produit scalaire signifie simplement que vous faites une traduction de la première et de la faire pivoter. Au lieu de la multiplication de deux matrices le produit scalaire juste multiplie une ligne et une colonne.
Une transformation de la matrice de 4x4, contient deux-trois éléments:
1. matrice de rotation
2. traduction pour ajouter.
3. l'échelle (de nombreux moteur de ne pas l'utiliser directement dans la matrice).
La combinaison de ce qui leur permettrait de transformer un point de l'espace à l'Espace B, c'est donc une matrice de transformation M_ab
Maintenant, l'emplacement de la caméra est dans l'espace Un et donc il n'est pas de la validité de la transformation de l'espace B, de sorte que vous besoin de multiplier ce lieu avec la rotation de la transformation.
La seule question qui reste est pourquoi les points?
Eh bien, si vous écrivez les 3 points sur un papier, vous découvriraient que 3 points avec X, Y et Z est exactement comme la multiplication par une matrice de rotation.
Un exemple pour que de suite de ligne/colonne serait de prendre zéro point (0,0,0) dans l'espace. Il n'est pas le point zéro de l'appareil photo de l'espace, et si vous avez besoin de savoir quelle est la représentation de l'appareil photo de l'espace, puisque la rotation et l'échelle de la laisser à zéro!
acclamations
Il est nécessaire de mettre le point de vue dans votre axe de l'espace, pas dans le monde de l'espace. Lorsque vous dot d'un vecteur avec une coordonnée de l'unité de base de vecteur, l'un des x,y,z, il vous donne les coordonnées de l'œil dans que de l'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 ascenseur qui vous fait sentir comme le reste du monde, est l'abandon de dessous de vous.
À l'aide de la main gauche de la matrice, avec la traduction en tant que dernière ligne de la dernière colonne, est une différence de religion, qui n'a absolument rien à voir avec la réponse. Cependant, il est un dogme qui devraient être strictement évités. Il est préférable de la chaîne de niveau mondial au niveau local (de l'avant de la cinématique) transforme de gauche à droite, dans un environnement naturel de l'ordre de lecture, lors de l'élaboration de croquis. À l'aide de gaucher matrices forces de vous écrire ces de droite à gauche.