Bonjour,
Je développe actuellement un (petit) moteur physique 2d (ou devrais-je dire un moteur de collision). J'emploi une méthode particulière pour détecter les collisions qui me permet d'utiliser tous types de polygones même non convexes mais qui présente dans sa forme actuelle un léger problème.
La méthode en question ne détecte pas deux objets en collision mais intervient lors du déplacement de l'un d'entre eux pour préciser jusqu'où peut se déplacer l'objet en mouvement avant d'en rencontrer un autre.
Le soucis est que l'objet en mouvement est alors placé en contact direct avec l'autre (et éventuellement déplacé tangentiellement à la surface de contact). Ce faisant lors du prochain mouvement il est déjà détecté comme touchant l'autre objet et ne peut alors bouger, même pour s'en écarter.
J'ai trouvé une solution assez sale : décaler légèrement l'objet dès qu'il y a contact, ou ne l'avancer que de 99% de ce qu'il pourrait avancer par exemple. C'est sale tout d'abord car théoriquement il peut y avoir un autre objet juste derrière et ça devient interminable, et ensuite car la valeur est arbitraire.
Une deuxième solution à laquelle j'ai pensé c'est décider que lorsqu'une extrémité d'un segment se situe sur un autre il n'y a pas contact (pour des raisons similaires j'ai quand même déjà considéré que deux segments parallèles n'étaient jamais en contact). Mais cette solution est parfaitement non accordable avec mon algorithme qui étudie le déplacement des sommets du polygone (et, dans le cas du cercle, celui des deux points issus des deux tangentes parallèles au segment à intersecter ... je peut préciser si ça intéresse) car dans ce cas une fois qu'un objet est collé à un autre, il peut s'en séparer mais aussi le traverser au moins momentanément.
Troisième et dernière solution envisagée (j'ai envie de l'éviter et c'est pour ça que je post un message ici), je pourrais retenir après chaque contact la liste des tangentes en contact pour déduire du déplacement suivant les parties de mouvement dirigées dans les sens opposés aux normales sortantes. C'est fastidieux et ça me semble rajouter pas mal de calculs (du moins si je cherche un modèle théorique parfait) car ça m'oblige à reconsidérer deux segments parallèles comme possiblement en contact et car (j'abrège mais je peut spécifier) ça me fait calculer et retenir d'avantage d'informations sur les possibles contacts des arrêtes des objets.
Voilà, donc si quelqu'un à une solution .. je l’accueillerai à bras ouverts !
Petite précision : je peut préciser la méthode de calcul des collisions qui me semble assez originale et pourtant drôlement efficace (pour ce que je l'ai testé).
voblivion
Partager