Partage
  • Partager sur Facebook
  • Partager sur Twitter

Vecteurs et angles

Sujet résolu
    3 juin 2011 à 14:42:05

    Bonjour,

    Je suis en train de programmer une caméra dans un programme 3D et pour cela j'ai besoin de calculer 2 angles.
    Lorsque je créer la caméra je fourni deux informations : La position et la direction.
    Mon repère est un repère direct xyz, avec l'axe y orienté vers le haut.
    Ce que je voudrais c'est calculer les angles xRot et yRot (respectivement par rapport à l'axe x et y) entre le vecteur direction et le vecteur forward (0; 0; -1).
    Ainsi lorsque mon vecteur direction est (0; 0; 1) je doit obtenir les angles xRot = 0 et yRot = pi.
    Le problème étant que j'ai un peu de mal à trouver les calculs adéquat. J'ai bien trouvé les formules de coordonnées sphériques sur internet mais ça n'a pas l'air donné les bons résultats (surement à cause de mon axe forward).

    Merci de votre aide.
    • Partager sur Facebook
    • Partager sur Twitter
      3 juin 2011 à 15:22:20

      Salut,

      Si tu pouvais faire un petit schéma pour nous, ça serait bien, car je suis pas certain d'avoir tout saisit ^^
      • Partager sur Facebook
      • Partager sur Twitter
        3 juin 2011 à 15:38:41

        voici une image pour représenter mon problème :
        Image utilisateur
        En noir c'est donc mon repère direct (je rappel que l'axe du haut est l'axe y). En rouge c'est mon vecteur direction et en bleu mon vecteur forward (qui est colinéaire à l'axe z).
        Je veux donc calculer les angles entre direction et forward (afin de construire une matrice de rotation avec laquelle le vecteur forward deviendrait le vecteur direction.
        • Partager sur Facebook
        • Partager sur Twitter
          3 juin 2011 à 18:55:07

          Alors, c'est pas très simple, mais je pense que tu peux prendre :

          <math>\(xRot = \frac{\pi}{2} - \arccos(y)\)</math>
          <math>\(yRot = \arccos\left(-\frac{z}{\sqrt{x^2+z^2}}\right)\)</math>

          où <math>\((x,y,z)\)</math> est ton vecteur direction (qui doit être unitaire pour appliquer les formules)

          Je garantis pas que ce soit juste dans tous les cas, mais pour le cas d'un vecteur direction <math>\((0,0,1)\)</math> ça donne bien <math>\(0\)</math> et <math>\(\pi\)</math>

          N.B. Il faut impérativement effectuer la rotation d'angle xRot avant celle d'angle yRot.

          Edit : je posterais une explication, schéma à l'appuie après mangé ^^

          Une heure et un crumble plus tard ...

          Alors, l'idée est de faire tourner <math>\(\vec{f}\)</math> (le vecteur forward) autour de <math>\(\vec{ex}\)</math> afin de le placer sur le même cône (cône de direction <math>\(\vec{ey}\)</math>) que le vecteur direction. Ensuite on tourne autour de <math>\(\vec{ey}\)</math> afin de ramener le tout sur le vecteur direction.
          Voila pour le résumer. En détail ça donne :

          Étape 1 :
          On calcule l'angle <math>\(\theta\)</math> entre le vecteur direction (qu'on notera <math>\(\vec{d} = (x,y,z)\)</math>) et <math>\(\vec{ey}\)</math>, cet angle est l'angle du cône :
          Image utilisateur
          Si <math>\(\vec{d}\)</math> est unitaire, alors <math>\(\cos(\theta) = \vec{d}.\vec{ey} = y\)</math>
          On en déduit immédiatement xRot :
          Image utilisateur
          <math>\(xRot = \frac{\pi}{2} - \arccos(y)\)</math>

          Étape 2 :
          On regarde de combien on doit tourner pour tomber sur <math>\(\vec{d}\)</math>, le plus simple est de tout projeter sur le plan (xOz) et de normaliser tout ça ^^ c'est-à-dire de considérer les deux vecteurs unitaires : <math>\(\vec{f}\)</math> et <math>\(\vec{u'} = \frac{1}{\sqrt{x^2+z^2}}\vec{u} = \frac{1}{\sqrt{x^2+z^2}} (x,0,z)\)</math> où <math>\(\vec{u}\)</math> est le projeté de <math>\(\vec{d}\)</math> sur (xOy) (<math>\(\vec{u} = (\vec{d}.\vec{x})\vec{x} + (\vec{d}.\vec{z})\vec{z}\)</math>) :
          Image utilisateur
          On voit que <math>\(cos(yRot) = \vec{u'}.\vec{f} = \frac{1}{\sqrt{x^2+z^2}}(-z)\)</math>
          d'où <math>\(yRot = \arccos\left(-\frac{z}{\sqrt{x^2+z^2}}\right)\)</math>

          J'espère avoir été assez clair.
          • Partager sur Facebook
          • Partager sur Twitter

          Vecteurs et angles

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown