Moteur physique : détecter les collisions

Messages postés
2
Date d'inscription
dimanche 28 janvier 2007
Statut
Membre
Dernière intervention
29 janvier 2007
- - Dernière réponse : Galmiza
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
- 1 févr. 2007 à 16:02
Bonjour !!

Je suis en train de tenter de réaliser un moteur physique et j'ai le problème suivant : je ne sais pas comment faire pour détecter une éventuelle collision entre une boule dont le centre a pour coordonnée x y z et est de rayon r, et un pavé dont on connait les coordonnées des 8 sommets, et comment la traiter

Merci !
Afficher la suite 

4 réponses

Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008
0
Merci
Salut, en quelle classe es-tu ?
En terminale S on voit un moyen simple de calculer la distance d'un point à un plan.
A partir de là tout est simple, si la distance entre le centre et le plan <=r, alors il y a collision.
Tout bête non ? si tu trouves pas la formule, je ferai peut etre l'éffort d'aller ouvrir un livre.
Bonne chance pour ton moteur physique.
@+

/* MuPuF®
Commenter la réponse de MuPuF
Messages postés
2
Date d'inscription
dimanche 28 janvier 2007
Statut
Membre
Dernière intervention
29 janvier 2007
0
Merci
Merci, je suis en SUP :)

Le problème est que, si l'on a un pavé, prenons sa face supérieure. Cette face est un parallélogramme. Calculer la distance de la sphère au plan contenant cette face n'est pas correcte car la boule peut très bien ne pas rentrer dans le parallélogramme mais couper le plan

J'avais déjà pensé a faire la chose suivante : projeter le centre de la boule sur le plan contenant le parallélogramme, puis à l'aide de barycentres, déterminer si ce centre était dans le parallélogramme. Si tel était le cas, alors on vérifiait que la distance entre le centre de la boule est le plan était inférieure à r : dans ce cas là on avait collision. Le problème à cela est le cas suivant : imaginons un pavé droit dont les sommets ont pour coordonnées (0,0,0)(0,0,1)(0,1,0)(0,1,1)(1,0,0)(1,0,1)(0,1,0)(1,1,1), prenons r=1 et la trajectoire selon une droite z=11/10 et x=1/2. (faites une figure pour bien visualier :))
Il y aura un moment où la boule touchera le pavé, mais ma méthode ne fonctionne pas

Auriez vous d'autres idées, ou connaitriez vous des tutoriaux clairs et bien faits

Merci :)
Commenter la réponse de noncommunique
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008
0
Merci
(d'où l'interêt de renseigner plus correctement ton profil cppfrancien), moi j'ai tjs feinté, donc je peux pas trop t'aider, je suis plutot une quiche en math car justement les profs aiment pas qu'on démontre pas (comme c'est étonnant, mais dur de démontrer les évidences).
Fait gaffe par contre pour la projection, car si la projection du centre de la sphere n'est pas dans le parrallélogramme, ça veut pas dire qu'elle ne touche pas, ( ex : on garde les mêmes coordonées pour le pavé droit, on place la boule à X=0,Y=0 et Z=-0.5, la boule va toucher et donc gros problème).
Essaye de trouver une méthode continue, sans gestion de cas, c'est le best du best et ce sera surrement bien plus rapide (et oui en prog, la gestion des cas c'est pas aussi bien qu'en math, ça coute ;-)
Bonne chance, et désolé, je me pencherai peut etre sur ton exemple demain en cours, car là j'ai vraiment plus la volonté (4h du mat, et cours demain, faut que j'y aille).

/* MuPuF®
Commenter la réponse de MuPuF
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
0
Merci
Les faces d'un pavé sont des rectangles.
Si ABCD est une de ses faces avec n=AB^BC/(|AB|.|BC|) orienté vers l'extérieur, ta boule de centre I et de rayon r penètre le plan de la face si AI.n<r.

Ensuite, c'est facile, si la boule penetre tous les plans des faces, alors tu as collision.
La normale au contact peut être assimilé à la normale à la face du pavé qui minimise |AI.n-r|
Commenter la réponse de Galmiza