Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > Physique
Physique Forum d'entraide sur les algorithmes et moteurs physiques (ODE, Newton...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/10/2010, 04h08   #1
saturn1
Membre confirmé
 
Inscription : janvier 2008
Messages : 576
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 576
Points : 258
Points : 258
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 :-)
saturn1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2010, 15h49   #2
stardeath
Expert Confirmé
 
Inscription : février 2006
Messages : 1 652
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 1 652
Points : 2 760
Points : 2 760
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.
stardeath est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2010, 21h49   #3
saturn1
Membre confirmé
 
Inscription : janvier 2008
Messages : 576
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 576
Points : 258
Points : 258
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
saturn1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2010, 14h01   #4
ponce
Membre éclairé
 
Avatar de ponce
 
Inscription : juillet 2008
Messages : 339
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : juillet 2008
Messages : 339
Points : 358
Points : 358
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
ponce est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2010, 19h13   #5
saturn1
Membre confirmé
 
Inscription : janvier 2008
Messages : 576
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 576
Points : 258
Points : 258
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
saturn1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 21h51   #6
saturn1
Membre confirmé
 
Inscription : janvier 2008
Messages : 576
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 576
Points : 258
Points : 258
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?
saturn1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h49.


 
 
 
 
Partenaires

Hébergement Web