Question

Je suis en train d'écrire un moteur 3D et je suis tombé sur l'algorithme LookAt décrit dans la documentation 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 très bien, c’est la raison pour laquelle la composante de traduction de la matrice est constituée de ces produits scalaires. En l'examinant un peu, il semblerait qu'il modifie légèrement la position de la caméra en fonction d'une projection des nouveaux vecteurs de base sur la position de l'œil / de la caméra.

La question est pourquoi a-t-il besoin de faire cela? Qu'est-ce que cela accomplit?

Était-ce utile?

La solution

Je construis une matrice de référence en créant une matrice de rotation 3x3 comme vous l'avez fait ici, puis en l'agrandissant en 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 du point de l'œil négatif (pas de produit scalaire) et multiplie les deux matrices ensemble. Mon hypothèse est que cette multiplication donne l'équivalent des produits scalaires dans la dernière ligne de votre exemple, mais il faudrait que je travaille sur du papier pour en être sûr.

La rotation 3D transforme vos axes. Par conséquent, vous ne pouvez pas utiliser directement le point de vision sans le transformer également en ce nouveau système de coordonnées. C’est ce que les multiplications matricielles - ou dans ce cas, les 3 valeurs du produit scalaire - accomplissent.

Autres conseils

Notez que l'exemple donné est une matrice majeure pour gauchers .

L'opération est donc la suivante: faire la conversion vers l'origine en premier (déplacer de - œil ), puis effectuer une rotation pour que le vecteur de œil à À aligne avec + z:

En gros, vous obtenez le même résultat si vous pré-multipliez la matrice de rotation par une traduction - œil :

[      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ée : multipliez chaque sommet par cette matrice pour "déplacer le monde". de sorte que la partie que vous souhaitez voir se retrouve dans le volume de la vue canonique.

Notez également que le composant de matrice de rotation (appelez-le R ) de la matrice LookAt est une matrice à changement de base inversé où les lignes de R sont les nouveaux vecteurs de base en fonction des anciens vecteurs de base (d'où le nom de variable xaxis.x, .. xaxis est le nouveau axe x après le changement de base). Cependant, à cause de l'inversion, les lignes et les colonnes sont transposées.

Juste quelques informations générales:

La matrice de look est une matrice qui positionne / fait pivoter quelque chose vers (regarder) un point dans l’espace, à partir d’un autre point dans l’espace.

La méthode utilise le "centre" souhaité. de la vue des caméras, un "haut" vecteur, qui représente la direction " up " pour la caméra (presque toujours (0,1,0), mais ce n’est pas obligatoirement), et un "œil" vecteur qui est l'emplacement de la caméra.

Ceci est principalement utilisé pour l'appareil photo, mais peut également être utilisé pour d'autres techniques telles que les ombres, les projecteurs, etc.

Franchement, je ne suis pas tout à fait sûr de savoir pourquoi le composant de traduction est défini tel quel dans cette méthode. Dans gluLookAt (à partir d'OpenGL), le composant de traduction est défini sur 0,0,0 car la caméra est toujours considérée comme étant à 0,0,0.

Ce composant de traduction vous aide à créer un base orthonormée avec votre & oeil " à l'origine et tout ce qui est exprimé en termes d'origine (votre "œil") et des trois axes.

Le concept n’est pas tellement que la matrice ajuste la position de la caméra. Il s’agit plutôt de simplifier les calculs: lorsque vous souhaitez rendre une image de tout ce que vous pouvez voir à partir de votre "œil". 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 les calculs beaucoup plus faciles.

Répondre à la question dans le commentaire: la raison pour laquelle vous ne soustrayez pas simplement le "œil" position de tout a à voir avec l'ordre des opérations. Pensez-y de la manière suivante: 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, yaxis et zaxis), vous souhaitez maintenant exprimer les distances en fonction de ce nouveau cadre de référence (pivoté). C’est pourquoi vous utilisez le produit scalaire des nouveaux axes avec la position de l’œil: cela représente la même distance que celle que les choses doivent parcourir, mais le nouveau système de coordonnées est utilisé.

Le produit ponctuel projette simplement un point sur un axe pour obtenir la composante x, y ou z de l'œil. Vous déplacez l'appareil photo vers l'arrière de sorte que regarder (0, 0, 0) à partir de (10, 0, 0) et à partir de (100000, 0, 0) aurait un effet différent.

La matrice de recherche effectue ces deux étapes:

  1. Traduisez votre modèle à l'origine,
  2. Faites-le pivoter en fonction de l'orientation définie par le vecteur ascendant et le regard recherché.
    direction.

Le produit scalaire signifie simplement que vous effectuez d'abord une traduction, puis que vous le faites pivoter. Au lieu de multiplier deux matrices, le produit scalaire multiplie simplement une ligne avec une colonne.

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

La combinaison des eux transformerait un point de l’espace A en espace B, c’est donc une matrice de transformation M_ab

.

Maintenant, l'emplacement de la caméra est dans l'espace A et il ne s'agit donc pas d'une transformation valide pour l'espace B. Vous devez donc multiplier cet emplacement par la transformation de rotation.

La seule question qui reste ouverte est de savoir 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,0) dans l’espace mondial. Ce n’est pas le point zéro dans l’espace de la caméra, vous devez donc savoir quelle est sa représentation, car la rotation et l’échelle laissent à zéro!

acclamations

Il est nécessaire de placer le point de l'oeil dans votre espace des axes, pas dans l'espace du monde. Lorsque vous parsemez un vecteur avec un vecteur de base d'unité de coordonnée, l'un des x, y, z, il vous donne les coordonnées de l'œil dans cet espace. Vous transformez l'emplacement en appliquant les trois traductions à la dernière place, dans ce cas la dernière ligne. Ensuite, déplacer l'œil en arrière avec un négatif revient à déplacer tout le reste de l'espace vers l'avant. Comme si vous montiez dans un ascenseur, vous vous sentez comme si le reste du monde se retirait de dessous vous.

Utiliser une matrice pour les gauchers, avec la traduction à la 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 globales en locales (cinématique directe) de gauche à droite, dans un ordre de lecture naturel, lors de la création d’esquisses arborescentes. L'utilisation de matrices gaucher vous oblige à écrire ces réponses de droite à gauche.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top