Bonjour à tous !
Dans le cadre de la création d'un moteur 2D pour un jeu semi-pro, je suis en train de créer un moteur de collision, et je galère pas mal.
Pour le moment, mon moteur est capable de déterminer le moment exact d'une collision entre deux géom (n'importe quel objet convexe) se déplaçant à une vitesse constante , c'est donc un algorithme continu. Pour gérer les collisions entre plus de deux objets, j'ai imaginé l'algorithme suivant :
Le principe est de trouver le couple de géom qui se collisionne en premier, de faire avancer tous les objets jusqu'à ce moment, et d'appeler la réponse à la collision pour les deux objets. On répète l'opération jusqu'à ce que le pas soit nul.
Code : 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
17
18
19
20
21
22
23
24
25
26 tant que pas > 0 faire temps = +infini data = null pout tout couple (g1,g2) de géom faire si CollisionRapide( g1, g2 ) si Collision(g1, g2, data2) si data2.moment_de_la_première_collision < temps temps = data2.moment_de_la_première_collision data = data2 finsi finsi finsi finfaire si temps < pas pout tout géom g faire déplacer( g, temps ) finfaire data.g1.collision_réponse( data ) data.g2.collision_réponse( data ) sinon pour tout géom g faire déplacer( g, pas ) finfaire fin pas = pas - temps finfaire.
Cet algorithme marche à peu près, mais très vite, on a des cas pour lesquels la boucle while ne termine jamais. Ce sont les cas où deux objets sont en collision aux conditions initiales, où lorsque la réponse à la collision d'un objet (la fonction collision_reponse) est mal faite. En clair, deux objets ne peuvent jamais entrer en collision sous peine de plantage. Et je n'arrive pas à résoudre ce problème !
Mon but est de pouvoir ignorer des objets une fois qu'ils sont rentrés en collision, mais quelle que soit la méthode que j'ai essayé ça ne marche pas. Par exemple, j'ai essayé de faire un tableauà deux dimensions de booléens qui indique quels objets doivent être ignorés. J'ai aussi essayé de faire une liste de couples de géom triée par temps de collision croissante (j'ai vu cette solution sur un forum mais je ne sais plus lequel), mais rien ne marche.
En cherchant sur le net, j'ai trouvé beaucoup d'algo pour tester la collision entre les objets (ça, pas de problème), mais aucun pour gérer le tout... Voilà, si vous avez des idées ou des algo, je suis preneur, ça m'enlèverai un poids
PS : 50e message, je suis membre du club !
Partager