Partage
  • Partager sur Facebook
  • Partager sur Twitter

Rotation d'un vecteur 3D

Modélisation d'une caméra dans l'espace

25 mai 2020 à 19:58:06

Bonjour,

Je suis en train de modéliser une caméra dans un espace 3D. J'ai un point (la position de la caméra), et un vecteur (son orientation).

Pour déplacer la caméra ça va, par contre pour changer son orientation je suis en difficulté. J'ai bien pris connaissances des 3 matrices de rotation dans l'espace, mais je ne sais pas comment les combiner.

Je n'y arrive que dans des cas bien définis. Par exemple lorsque l'orientation est "parallèle" au sol, (on va dire l'axe x), je n'ai qu'à multiplier mon vecteur d'orientation par la matrice de rotation par rapport à l'axe y (perpendiculaire au sol). Ce qui me permet de tourner l'orientation vers la "gauche" et la "droite".

Sauf que comme je l'ai dis, ceci ne marche que si le vecteur d'orientation est parallèle à l'axe x, car si le vecteur est orienté ailleurs, la "gauche" et la "droite" ne sont plus les mêmes, et ce n'est plus (en tout cas pas que) autour de l'axe y qu'il faut tourner.

C'est là que je bloque, pouvez-vous m'aider svp ?

  • Partager sur Facebook
  • Partager sur Twitter
J'adorerais changer le monde, mais il ne veut pas me fournir le code source.
29 mai 2020 à 14:26:53

Bonjour, tu as une explication bien complexe pour quelque chose de basique, j'utilise "Blender" tu n'as pas précisé le logiciel utilisé.
  • Partager sur Facebook
  • Partager sur Twitter
15 juin 2020 à 4:55:45

le plus simple serait que tu definisses directement une matrice 4x4 pour ta camera. Les 3 premieres lignes representant l'orientation actuelle de ta camera. Par exemple, par default, utilise une identity matrix : 

1 0 0 0

0 1 0 0

0 0 1 0

0 0 0 1

Dans ce cas, l'axe X de ta camera pointe vers le X du monde (la premiere ligne, 3 premiers nombres -> 1 0 0 ), l'axe Y pointe vers le Y du monde (2e ligne, 0 1 0), etc... La derniere ligne etant ta position. La derniere colonne n'a aucun autre interet que de te permettre de multiplier cette matrix par une autre, parce que tu peux multiplier une matrix 4x4 par une autre matrix 4x4. Par contre, pour multiplier une 4x3, il te faudrait une 3x4.

Une fois que tu as cette matrix definie, il te suffit de construire ton autre matrix de rotation (ce que tu as (je crois?) deja fait), qui sera donc une matrix 3x3, mais que tu peux tres facilement etendre a 4x4, en lui rajoutant une position a 0, et donc la derniere colonne. Il te suffit ensuite de multiplier ta matrix initiale par cette matrix de rotation (trivial avec numpy si tu es en python, Eigen si tu es en cpp), et tu obtiendras ta matrix finale, apres rotation.

Alternativement, tu peux appliquer le meme genre de logique en utilisant les quaternions, si tu n'es interesse que par la rotation,  mais c'est tres probable que tu veuilles combiner translations et rotations dans la meme operation, tu n'as en general pas envie de traiter les 2 separement (ce qui est aussi un peu l'interet de tout faire via des matrices de transformation)

Voila, j'espere que c'est clair, sinon n'hesite pas a preciser ton besoin =]

Edit> J'ai oublié de preciser, mais tu veux donner 3 vecteurs a ta camera, pas un seul: le "aim" vecteur (disons X, par convention), mais egalement un "up" vecteur (tu peux le definir selon plein de regles, en fonction de ce que tu recherches ; scene up, object up, un vecteur donne par l'utilisateur, etc... Tout ce qu'il compte, c'est qu'il soit perpendiculaire a ton X. Par exemple, (X.x, -X.y, 0) / ||X|| (pour le normaliser) te donnera un vecteur qui sera toujours perpendiculaire a X. Ensuite, il te suffit de generer un vecteur Z qui soit perpendiculaire a X et Y pour avoir ton repere orthonormé et donc ta matrix de rotation. Le plus simple c'est de faire le cross product entre ton X et Y (ou Y et X en fonction de si tu es dans un systeme right-handed ou left-handed) mais tu peux aussi utiliser l'algorithme de gram schmidt si tu veux optimiser. Hesite pas a me mp si tu as des questions (je crois qu'un mp m'enverra un mail pour me prevenir alors qu'une simple reponse risque de m'echapper)

-
Edité par fruity' 15 juin 2020 à 5:03:38

  • Partager sur Facebook
  • Partager sur Twitter