Ce que vous demandez s'appelle la rotation Arcball. Les quaternions ne sont la solution facile que si vous comprenez comment ils fonctionnent. Vous pouvez cependant obtenir la même chose sans quaternions.
Conditions préalables
Savez-vous comment faire pivoter des objets en général? Disons que vous avez un objet à l'origine. Savez-vous comment vous le faites pivoter (indice: multipliez par une matrice de rotation)? Si oui, je suppose que vous savez ce qui se passera si vous traduisez d'abord l'objet, puis le faites pivoter?
Vous devez savoir comment calculer une matrice de rotation à partir de l'angle-axe (simple comme bonjour, regardez la myriade d'équations en ligne, beaucoup d'entre elles vous donnent également le code)
Solution
- Obtenez les vecteurs haut et droit de la caméra . Notez qu'ils doivent être normalisés.
- Obtenez le vecteur du point AF à la caméra (camPosition - Focus). C'est le vecteur que vous allez faire tourner. Appelons ce camFocusVector .
- Décidez à quel point vous souhaitez faire pivoter en lacet / tangage par rapport à la caméra
- Créez deux matrices de rotation. La 1ère matrice de rotation utilisera le haut de la caméra comme axe et angle de lacet que vous avez décidé. La 2ème matrice de rotation utilisera la droite de la caméra comme axe et angle de tangage que vous avez décidé.
- Faites maintenant tourner le camFocusVector avec les nouvelles matrices de rotation. C'est maintenant votre nouvelle position de la caméra par rapport à l'origine. Nous voulons bien sûr que cela soit relatif au point focal ...
- Ajoutez la position du point AF à camFocusVector . C'est maintenant la nouvelle position de votre caméra. Traduisez votre appareil photo en conséquence.
- Enfin, demandez à la caméra de se concentrer sur le point AF en appelant votre fonction lookAt ()
Avertissements
Vous devrez rechercher certains cas ou singularités auxquels votre appareil photo cessera de fonctionner. Regarder vers le bas / haut par exemple. Je vais vous laisser comprendre comment y faire face.
EDIT1: Comment recalculer les vecteurs orthonormaux de la caméra
Vous connaissez déjà la direction de la caméra ((cameraPos - focusPoint) .normalize ()). Supposons maintenant que le haut de votre appareil photo soit + Y (ou w / e l'axe actuel de votre monde est ... c'est à vous de décider). Maintenant, traversez simplement la direction avec le haut pour obtenir la bonne . Terminé? Nan! Votre vecteur haut n'est plus orthogonal aux deux autres. Pour résoudre ce problème, croix à droite avec la direction et vous obtenez votre nouvelle place .
Notez que le Gram-Schmidt est vraiment ce qui devrait être utilisé pour orthonormaliser des vecteurs.
Encore une fois, notez les mises en garde car cela ne fonctionnera pas dans certains cas (la direction est parallèle à up par exemple).