Bonjour,
"Géométrie vectorielle" ça veut peut-être pas dire grand chose mais ça parle bien.
Concernant un projet de lancer de rayon je tente de rotationner la caméra.
contexte
La caméra possède une position (qui, ici, restera fixe, mais en un point quelconque), et deux vecteurs target et up orthonormés.
Le vecteur target définit la direction dans laquelle regarder.
Le vecteur up définit la direction du "haut de l'appareil". Globalement, il sert à pencher vers la droite ou vers la gauche.
Le but
Étant donné un vecteur newtarget il faut rotationner la caméra de manière à ce que target devienne newtarget et que l'inclinaison droite-gauche reste la même.
précisions
Comment définir cette inclinaison ?
Disons que pour une caméra donnée, c'est l'angle entre le vecteur up et le plan (target, Z).
Je précise que je considère que Z est vers le haut (même si ça importe peu) et que target ne peut jamais être égale à Z ou -Z (je traiterai le cas spécialement).
tentative
J'ai essayé ceci, mais les tests montrent des résultats bizarres (comprendre "incorrectes") :
1) Calculer la matrice de rotation M1 qui replacerait target en Y sans toucher l'inclinaison droite-gauche. C'est à dire que la matrice "remonte" target jusqu'au plan (X, Y) puis rotationne autour de l'axe Z;
2) Calculer la matrice M2 qui placerait Y en newtarget sans toucher l'inclinaison non plus
3) Appliquer M1^-1 . M2 aux vecteurs target et up
Soit Y et Z les vecteurs (0, 1, 0) et (0, 0, 1)
Soit le vecteur right = target ^ Z
Soit le vecteur fake_up = right ^ target
Soit M1 = (right, target, fake_up) (les vecteurs sont mis en colonne)
Soit le vecteur right' = newtarget ^ Z
Soit le vecteur fake_up' = right' ^ newtarget
Soit M2 = (right', newtarget, fake_up') (les vecteurs sont mis en colonne)
Appliquer la matrice M1^-1 . M2 devrait être équivalent à replacer le vecteur target de la caméra sur Y, puis l'emmener jusqu'à newtarget.
Quelqu'un voit une erreur ?
Quelqu'un a un autre méthode moins tordue ? (si possible sans passer par des angles).
Merci d'avance.
Et désolé pour le message un peu long...
Partager