[RESOLU] Rotation xyz entre deux vecteurs

Bonjour à tous,

Je suis actuellement en train créer un programme où j'utilise OpenGL pour faire de la 3d.

Voici le problème : j'ai une sphère de rayon r sur laquelle j'aimerais positionner plusieurs êtres humains (un modèle 3d) tous normaux à la surface.
Au départ, mon modèle est positionné à l'origine du repère, au point $P0$ (les axes : en vert $\vec{x}+$, en rouge $\vec{y}-$ et en bleu $\vec{z}+$). Ensuite je lui applique une translation vers le point $P1$ positionné sur la sphere (flèche violette).

Maintenant je veux lui appliquer une rotation qui correspond à la rotation du vecteur unitaire y- vers le vecteur $\vec{P0P1}$ (deuxième image). Cependant, la librairie que j'utilise ne me permet que d'effectuer des rotations sur les axes $X$, $Y$ et $Z$ avec :
rotateX(angle_en_radians)
rotateY(angle_en_radians)
rotateZ(angle_en_radians)

Ce que je veux : des formules qui puissent me calculer les trois composantes de cette rotation d'un vecteur à un autre.
J'ai regardé sur internet les histoires de matrice de rotation mais je ne sait pas comment m'y prendre.

N'hésitez pas à me poser des questions.
Merci d'avance


Voici un aperçu :85478
85480

Réponses

  • Bonsoir, je pense que tu as besoin de l'expression "angles d'Euler"
    un lien: https://fr.wikipedia.org/wiki/Angles_d'Euler
    cordialement.
  • Bonjour
    Merci pour votre réponse.
    En effet j'avais regardé les angles d'Euler mais je ne comprends toujours pas.

    Sur la page Wikipédia, il m'est donné la matrice de passage pour passer de la base $(x,y,z)$ à $(x',y',z')$ en fonction des 3 angles. Cependant, je cherche l'inverse, j'ai les coordonnées $x_1'$, $y_1'$ et $z_1'$ et je veux connaître les 3 angles d'Euler.

    Merci de m'éclairer un peu plus.
    Bonne soirée.
  • Bonjour
    Il vaut mieux faire une recherche sur les coordonnées sphériques.
    Techniquement Johhry a besoin de sections locales du fibré principal du fibré tangent à la sphère.
    C'est un peu pédant de dire cela mais comment faire autrement?
    Si quelqu'un a une meilleure idée?
    Amicalement
    [small]p[/small]appus
  • En fait j'ai juste besoin de calculer indépendamment les trois composantes (en $x, y, z$ même si la rotation en $y$ n'est pas importante car le modèle est quand même normal à la surface) de la rotation du vecteur $-\vec{y}$ vers le vecteur (en rose) $\vec{P_0P_1}$.
  • Bonjour
    Allez, je me risque à calculer une de ces maudites sections mais je ne donne pas son domaine de validité, il y a trop de signes à contrôler et je suis très très fatigué:
    $(x,y,z)\mapsto \begin{pmatrix}
    x&-\dfrac y{\sqrt{x^2+y^2}}&-\dfrac{xz}{\sqrt{x^2+y^2}}\\
    y&\dfrac x{\sqrt{x^2+y^2}}&-\dfrac{yz}{\sqrt{x^2+y^2}}\\
    z&0&\sqrt{x^2+y^2}
    \end{pmatrix}
    $
    Le point $(x,y,z)$ est quelque part sur la sphère de Riemann, la seule sphère qui nous reste provisoirement à nous mettre sous la dent, alors profitons en pendant qu'il est encore temps.
    Amicalement
    [small]p[/small]appus
    PS
    Il n'est pas interdit de mettre ma matrice à la poubelle, (ce n'est sans doute pas cela que recherche Johhry) et de faire des contre-propositions!
  • Bonjour pappus,

    Merci pour votre réponse mais malheureusement je ne la comprends pas, à quoi correspond la matrice que vous avez envoyé?
  • Mon idée, donc à vérifier soigneusement.

    Les matrices de rotation
    $ri$ d'un angle $t1$ autour de $ox$ et
    $rk$ d'un angle $t3$ autour de $oz$ sont
    $$
    (ri) = \begin{pmatrix} 1&0&0\\0&\cos(t1)&-\sin(t1)\\0&\sin(t1)&\cos(t1) \end{pmatrix} \qquad\text{et}\qquad
    (rk) = \begin{pmatrix} \cos(t3)&-\sin(t3)&0\\\sin(t3)&\cos(t3)&0\\0&0&1 \end{pmatrix}
    $$
    Le produit matriciel $(rk)(ri)(0,1,0)^t $ donne l'image de $(0,1,0)^t$ par la composée des rotations correspondantes.
    En divisant le résultat par $\cos(t1)$ on obtient $(-\sin(t3),\cos(t3),\tan(t1))^t$,
    un vecteur caractérisé par le fait que la somme des carrés des deux premières composantes vaut 1.

    Partons du vecteur $(a,b,c)^t$ et divisons-le par $\sqrt{a^2+b^2}$; soit $(a',b',c')$ le résultat. On a
    $$
    t1=\arctan(c') \qquad\text{et}\qquad t3=-\text{sgn}(a')\,\arccos(b')
    $$
    Pour le transit réciproque on change le signe des angles et on permute les matrices.
  • Bonjour

    Je ne sais pas mettre les flèches sur les vecteurs et j'emploie donc la convention anglo-saxonne d'écrire les vecteurs en gras, sans flèche.

    Je suppose que tu connais au départ les coordonnées cartésiennes du vecteur P0P1. Comme cela a été signalé dans les réponses précédentes, pour ton problème les coordonnées polaires sont plus adaptées que les coordonnées cartésiennes ; autrement dit il faut raisonner en latitude et longitude.

    Si l'on note (a,b,c) les coordonnées du vecteur P0P1 dans la base (x,y,z) on a P0P1 = a x + b y + cz avec a²+b²+c² = 1 puisque c'est un vecteur unitaire.

    Tu réalises d'abord une rotation d'axe x et d'angle arcos(b). Cela amène le bonhomme à la bonne latitude.
    Tu réalises ensuite une rotation d'axe y et d'angle arcsin(a/sin(arcos(b)) si c>0, ou pi moins cet angle si c<0. Cela positionne le bonhomme à la bonne longitude.

    Selon les conventions adoptées par le logiciel pour le sens des rotations il se peut que tu doives changer les signes des angles.

    Tu peux aussi réaliser une rotation supplémentaire si tu veux contrôler la direction vers laquelle ton bonhomme regarde. Le plus simple est alors de réaliser une rotation d'axe y avant les deux autres rotations (naturellement, l'ordre des rotations est important).

    Si la translation est réalisée en dernier les rotations sont de centre P0, si la translation est réalisée en premier les rotations sont de centre P1.

    Ce n'est pas la seule façon de faire mais c'est l'une des plus simples.

    Cela t'aide-t-il ?
  • Mon procédé est strictement le même,
    avec les formules numériques en plus (tu)
    et les explications détaillées en moins. (td)

    Il semble que c'est bien le procédé le plus simple. :-)
  • Bonsoir,

    Merci pour toutes vos réponses, je viens de résoudre mon problème (en fait c'était assez simple :-)) :

    J'effectue dans l'ordre ces transformations ($r$ le rayon de la sphère et $\phi$ et $\theta$ sont les angles en coordonnées sphériques) :
    rotateY(theta);
    rotateX(phi);
    translate(0, 0, r);
    

    Comme ça mon modèle est positionné à la bonne place sur la sphère.

    Bonne soirée
Connectez-vous ou Inscrivez-vous pour répondre.