Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Discussion: Empiler des AABB

  1. #1
    Membre éclairé

    Inscrit en
    janvier 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : janvier 2008
    Messages : 686
    Points : 395
    Points
    395

    Par défaut Empiler des AABB

    Bonjour,
    je rencontre un petit soucis pour reussir a gerer un empilement de AABB.

    Ma simulation est simple (pour le moment^^) un sol de masse infinie, une box A, sur laquelle j'empile une Box B le tout sur le sol.

    Le probleme : la box B qui est sur la box A tremble legerement fonction de la masse de A.
    Si la masse de A >> B alors les tremblements sont proches de 0.
    Si la masse de A << B alors les tremblements s'accentuent.

    Mon probleme vient de ma fonction resolvePenetration qui ajuste les positions de A et B fonctions de leurs masses respectives, ce qui est correct dans le cas ou les deux solides sont mobiles. Mais dans le cas d'immobilite cela ne fonctionne pas.
    Exemple pour une penetration de 10 entre A et B:
    l'ajustement de la position correcte serait de +-10 sur le solide B car le solide A est sur le sol donc il ne peut pas s'enfoncer. Selon mon calcul je vais trouver un ajustement dependant de leur masse donc impossible de trouver +-10.


    Il faudrait pouvoir determiner lorsque un solide a atteint un etat de "stabilisation".

    Avez-vous une solution viable pour ce type de probleme??

    Merci :-)

  2. #2
    Expert Confirmé

    Inscrit en
    février 2006
    Messages
    1 988
    Détails du profil
    Informations forums :
    Inscription : février 2006
    Messages : 1 988
    Points : 3 026
    Points
    3 026

    Par défaut

    une solution simple serait de mettre une vitesse en dessous de laquelle un solide est considéré comme immobile, et donc de ne plus effectuer les calculs de pénétration.

  3. #3
    Membre éclairé

    Inscrit en
    janvier 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : janvier 2008
    Messages : 686
    Points : 395
    Points
    395

    Par défaut re

    Ok merci,
    je pense implementer un systeme de awake/sleep, fonction du mouvement effectuer les 3 dernieres secondes.
    Si ce mouvement est inferieure a une valeur E alors je passe l'objet en mode sleep.
    Et comme tu me l'as conseille si il est en mode sleep alors je n'effectuerai plus les calculs de penetrations.

    Si vous d'autre idee je suis preneur

    Merci

  4. #4
    Membre éclairé Avatar de ponce
    Inscrit en
    juillet 2008
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : juillet 2008
    Messages : 343
    Points : 394
    Points
    394

    Par défaut

    Dans Game Physics Engine Development de Ian Millington, il fait la séparation entre les forces qui vont s'accumuler sur l'accélération et les "impulses" qui vont agir directement sur la vitesse instantanée (visiblement tu fais des impulses pour résoudre les collisions). Seulement les algos qu'il propose sont itératifs car résoudre une collision peut en produire une autre.

    Il discute aussi de comment "endormir" certains éléments, je pense qu'on ne peut pas empiler beaucoup de boites de manière stable sans ça.

    Une autre idée si tu n'as que ce cas de AABB empilées à résoudre : tu propage la bonne hauteur depuis la base jusqu'en haut. Mais bon c'est pas très général.

    gfm

  5. #5
    Membre éclairé

    Inscrit en
    janvier 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : janvier 2008
    Messages : 686
    Points : 395
    Points
    395

    Par défaut re

    Merci de ta reponse.

    Desole de remonter le sujet apres pas mal de temps...^^

    Mais je rencontre toujours des problemes a ce sujet.
    J'ai regarde le code source de box2d et il me semble qu'il n'a pas besoin d'endormir des solides pour permettre un empilement.

    Si quelqu'un a un bon tutoriel a ce sujet je suis preneur.

    Merci

  6. #6
    Membre éclairé

    Inscrit en
    janvier 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : janvier 2008
    Messages : 686
    Points : 395
    Points
    395

    Par défaut re

    J'ai bien trouvé une réponse qui est de meler contraintes et iteration.

    En gros on se base sur la formule suivante qui doit etre vérifier a la fin de l'itération:
    VelContact = -e * Vel

    Puis on itére sur la liste des contacts tant que toutes les velocité de contact ne vérifie pas la formule précédente.
    Sachant que résoudre un contact en appliquant une impulsion peut annuler la condition précédente.

    En gros dans le cas d'un empilement on va résoudre les impulsions pour le premier contact puis lors de la résolution d'un autre contact on peut invérifier la condition pour le contact précédent. Du coup j'ai peur qu'on se retrouve avec beaucoup trop d'itération.

    (malhereusement je ne peux pas tester cette technique sur le moment).

    Des gens ont déjà utilisé cette technique ou une autre?

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •