IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

Quaternions : rebond sur un plan (3D)


Sujet :

Mathématiques

  1. #1
    Membre habitué Avatar de Polyfructol
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Avril 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Avril 2007
    Messages : 131
    Points : 157
    Points
    157
    Par défaut Quaternions : rebond sur un plan (3D)
    Bonjour,

    Dans le cadre d'un projet scolaire, je dois modéliser des organismes (entités) qui évoluent dans un aquarium. Le tout en 3D.

    Mon problème se situe au niveau du rebond sur les bords de l'aquarium.

    Une fois que j'ai détecté que l'entité est au bord de l'aquarium, je cherche à calculer le quaternion qui représente sa nouvelle orientation après avoir rebondi.



    Et c'est là que je bloque, impossible de trouver la formule pour obtenir q après le rebond.

    Sachant que mes entités possèdent :
    • Une position (Vecteur3D(x, y, z))
    • Une orientation (Quaternion)
    • Une Vitesse (Réel)

    Voici ma fonction de mouvement :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void Move()
    {
        double dt = GetTime() - lastUpdate;
     
        // ...
        // Récupération du vecteur normal au plan de collision
        // Si collision il y a -> isColliding = true
        // ...
     
        if (isColliding) {
            // Calcul de la nouvelle orientation ???
            // ---- partie manquante ----
        }
     
        position += orientation * Vector3::UNIT_Z * speed * dt;
    }

    Voilà, j'espère avoir bien expliqué la situation... Merci de m'aider à résoudre ce problème

  2. #2
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Je ne vois pas ce que les quaternions viennent faire ici.
    Tout est déterminé par la position et la vitesse. Pour le rebond, décomposer le vecteur vitesse en un somme d'un vecteur dans le plan de la paroi avec un autre normal à ce plan.
    La nouvelle vitesse après rebond, est obtenue en remplaçant la composante normale par son opposée, l'autre composante restant inchangée.

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Je pense me souvenir que la reflection c'est :

    Qreflect = N . Q . N (a confirmer)

    ou Q le quaternion de départ et N est le quaternion de la normale au plan (N = i*x + j*y + k*z avec (x,y,z) le vecteur normal).

    Mais je suis d'accord avec Zavonen. Autant passer par la géométrie classique que par les quaternions.

  4. #4
    Membre habitué Avatar de Polyfructol
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Avril 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Avril 2007
    Messages : 131
    Points : 157
    Points
    157
    Par défaut
    Merci Zavonen et pseudocode d'avoir répondu !

    Citation Envoyé par Zavonen
    Je ne vois pas ce que les quaternions viennent faire ici.
    Peut-être que je me trompe, mais comme je gère l'orientation avec un Quaternion, et que la position est calculée grâce à celui-ci, je me disais que ça serait plus propre de modifier directement le quaternion. Parce que je n'ai pas de vecteur vitesse à proprement parlé, ma vitesse est un scalaire.
    Mais il serait peut-être judicieux pour moi de passer par un vecteur vitesse car ça me parait plus simple.

    Citation Envoyé par pseudocode
    Je pense me souvenir que la réflection c'est :

    Qreflect = N . Q . N (a confirmer)

    ou Q le quaternion de départ et N est le quaternion de la normale au plan (N = i*x + j*y + k*z avec (x,y,z) le vecteur normal).
    J'ai trouvé cette formule, c'est presque ça, c'est :
    Pout = q * Pin * q
    où Pout est le point reflété de Pin sur le plan dont q est le quaternion normal. (si j'ai bien compris voir là)

    Mais je n'arrive pas à m'en servir, parce que ce que je souhaite avant tout c'est le quaternion final, et non le point. (mais je vais essayer d'approfondir cette piste)

    Par contre, en triturant un peu mon quaternion je me suis aperçu de quelque chose que je n'explique pas vraiment :

    Avec qAvant et qApres 2 quaternions.

    Si mon entité rentre en collision avec le bord DROIT ou le bord GAUCHE :
    qApres = qAvant.w + qAvant.x i - qAvant.y j - qAvant.z k
    (inversion de y et z)
    FONCTIONNE : le rebond est bien géré

    Si mon entité rentre en collision avec le bord HAUT ou le bord BAS:
    qApres = qAvant.w - qAvant .x i + qAvant.y j - qAvant.z k
    (inversion de x et z)
    FONCTIONNE

    Juste que là, je suis rempli d'espoir, croyant avoir trouvé la solution, mais

    Si mon entité rentre en collision avec le bord AVANT ou le bord ARRIERE :
    qApres = qAvant.w - qAvant .x i - qAvant.y j + qAvant.z k
    (inversion de x et y)
    NE FONCTIONNE PAS Comme si sur le plan x y, il y avait un problème.

    A noté que je me déplace selon
    -> position = orientation * Vector3(0, 0, 1) * speed * dt;
    si je modifie
    -> position = orientation * Vector3(1, 0, 0) * speed * dt;
    Le problème se déplace sur le plan y z


    Est-ce explicable ? Où peut-être le problème vient d'autre part.

Discussions similaires

  1. Pb de Text. transp. sur un plan directx 9 c#
    Par EPSFranck dans le forum DirectX
    Réponses: 3
    Dernier message: 02/09/2006, 12h56
  2. Ombre sur un plan fixe
    Par damienlann dans le forum OpenGL
    Réponses: 4
    Dernier message: 30/05/2006, 16h14
  3. [Physique] Balle rebondissant sur un plan,problème de frames
    Par oxyde356 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 16/02/2006, 19h11
  4. [SQL2K] Pb sur un plan de maintenance
    Par yinyang dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/02/2006, 11h44
  5. Réponses: 3
    Dernier message: 29/06/2005, 15h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo