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

Physique Discussion :

Quaternions : collision avec un plan (3D)


Sujet :

Physique

  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 : collision avec 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

    PS : J'ai déjà posté sur le forum Maths, mais j'ai l'impression qu'il y a plus de sujets qui traitent des quaternions dans cette section...

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 104
    Points : 95
    Points
    95
    Par défaut
    désolé si la question semble stupide mais tu cherche bien la nouvelle orientation ? pas le nouveau vecteur de déplacement ?

    au cas ou, pour le nouveau vecteur de déplacement :
    soit V le déplacement initial
    et N la normal (normalisé => 1.0 en longueur)
    et P le point d'impact
    V2 le résultat => nouveau vecteur de déplacement

    pour un rebond de 1 pour 1 ca doit etre qq chose comme ca :
    d=((P+V).N) => faux P est inutile //=> distance au plan du point d'impact P déplacé de V
    V2=V-2*d*N //=> symetrie de V par rapport au plan (d devrait etre négatif)

    EDIT : oups petite erreur...
    d=V.N (en fait P est inutile....)
    V2=V-2*d*N

  3. #3
    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
    Citation Envoyé par DzzDDzzD
    désolé si la question semble stupide mais tu cherche bien la nouvelle orientation ? pas le nouveau vecteur de déplacement ?
    Merci de t'y être intéressé ! Mais oui c'est bien la nouvelle orientation (enfin... sous forme de quaternion)

    Mais comme j'ai pas résolu le problème (et puis manque de temps), j'utilise temporairement un vecteur directeur.

    Le problème c'est qu'avec un vecteur vitesse ou directeur, c'est bien pour la 2D, mais en 3D il me manque l'orientation. Mon objet n'est pas orienté.
    Alors je pourrais utiliser les angles d'Euler, mais j'étais parti sur les quaternions, et puis j'utilise Ogre donc c'est bien adapté.

    Mais n'existe-t-il pas une manipulation simple pour faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Quaternion CalculRebond(Quaternion src, Vector3 normalePlan) {
        // :X
        return newOrientation;
    }
     
    ... // Et lors du calcul du mouvement
    if (collision) {
        Vector3 normalePlan = GetNormalePlanCollision();
        orientation = CalculRebond(orientation, normalePlan);
    }
     
    position += orientation * Vector(0, 0, 1) * vitesse * dt;
    ...
    Merci d'avance.

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 104
    Points : 95
    Points
    95
    Par défaut
    Le problème c'est qu'avec un vecteur vitesse ou directeur, c'est bien pour la 2D, mais en 3D il me manque l'orientation. Mon objet n'est pas orienté.
    en fait pour la direction je ne vois pas le problème qui se pose avec la 3d ? pourrais tu expliquer un peu plus ? (dans un sens ton orientation sans frottement elle est pas senser bouger je pense)

  5. #5
    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
    En fait si je considère que mon objet s'oriente selon la direction du vecteur directeur, et si je me déplace sur l'axe z : je peux en déduire la rotation qu'il effectue sur l'axe x et y, mais pas l'axe z.



    C'est comme quand on utilise gluLookAt avec openGL, on lui fournit la direction (center - eye) + le vecteur Up.

    Si en 2D on a besoin d'un vecteur pour s'avoir quelle orientation possède un sprite, en 3D il faut bien des données supplémentaires. (le quaternion répond à ce problème)

    Mais je dois t'avouer que je découvre tout ça et que je ne maîtrise pas du tout, d'où mon problème.

  6. #6
    Membre régulier
    Inscrit en
    Juillet 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 104
    Points : 95
    Points
    95
    Par défaut
    ha oki (je comprennais pas bien ton histoire d'orientation, a vrai dire elle n'est pas censer changer).

    ben en fait je pense que tu peu la trouver en utilisant le vecteur déplacemet initial V1 et le vecteur deplacement rebond V2 (calculé precedemment) en faisant leur produit vectoriel tu trouve un axe de rotation et tu fait tourner ton orientation initiale en utilisant cet axe de rotation et l'angle de V1 par rapport au plan (Math.asin(d) si le vecteur V1 est normalisé avec d=V1.N).



    A=V1^V2;
    angle=Math.PI-2.0*Mat.asin(V1.N);

    Q2=(en utilisant A==axis et angle)
    http://jeux.developpez.com/faq/matqu...uaternions#Q56

    Q3=Q1*Q2

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 104
    Points : 95
    Points
    95
    Par défaut
    hum... petite erreur en fait l'angle c'est plutot

    2.0*Mat.asin(V1.N);

    sinon l'objet se retrouvera à l'envers !

  8. #8
    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
    En effet ça à l'air d'être une bonne solution. Seulement ça fait pas mal de calcul.

    En tout cas merci, je teste ça dès que j'ai le temps !

Discussions similaires

  1. Collision avec ODE
    Par chasse dans le forum ODE
    Réponses: 10
    Dernier message: 06/04/2007, 19h54
  2. Réponses: 4
    Dernier message: 21/03/2006, 17h38
  3. Impression excel avec arriere plan
    Par napegadie dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 01/12/2005, 17h16
  4. Collision avec le sol...
    Par conrad dans le forum Physique
    Réponses: 15
    Dernier message: 09/08/2005, 02h18
  5. Collision avec 3ds ou ms3d
    Par goutbouyo dans le forum Physique
    Réponses: 3
    Dernier message: 29/03/2005, 12h34

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