-
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 :-)
-
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.
-
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
-
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.
-
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
-
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?