J'essaie d'implémenter le théorème de l'axe de séparation en C #. J'ai une fonction qui peut calculer le vecteur de translation minimum entre deux polygones. Cependant, je n'arrive pas à créer une fonction qui calcule le vecteur de translation minimum entre un polygone et plusieurs autres polygones. Honnêtement, j'y travaille depuis des mois et je ne suis pas plus proche d'une solution et je n'ai pas pu trouver de solution en ligne. Il y a toujours quelques cas marginaux qui ne renvoient pas le bon résultat, ce qui entraîne des bogues de haute priorité dans mon jeu.
Voici des cas courants qui ne fonctionnent pas correctement:
Existe-t-il une solution bien connue à ce problème? Tout ce que je peux trouver, ce sont des gens qui disent "il suffit d'exécuter le SAT sur chaque polygone" mais cela produit rarement le vecteur de translation minimum .
Toute aide serait très appréciée.
Réponses:
Idéalement, vous ne construisez pas votre environnement à partir de polygones. Vous le construisez à partir d' arêtes (que vous calculez peut-être à partir d'un ensemble de polygones). Dans votre premier exemple, par exemple, il n'y a qu'un seul bord diagonal; dans le dernier exemple, la boîte repose sur un seul bord horizontal.
Le fait que votre éditeur ou vos outils utilisent des formes individuelles plus petites pour créer un niveau ne devrait pas avoir d'incidence sur l'exécution.
Une approche légèrement plus simple supprimerait simplement les bords "intérieurs" des formes de base. Pour votre dernier exemple, il y a deux bords entre les cases "sol"; ignorez-les pendant la détection de collision.
Vous pouvez trouver de meilleures images et des idées d'implémentation en lisant la section 4.5 (bords et chaînes de bords) dans la documentation de Box2D .
la source