Je sais très bien comment détecter si deux ou plusieurs objets 2D entrent en collision, mais je suis intéressé à savoir comment vérifier s'il y a collision. Dans les projets précédents, je venais de faire vérifier chaque objet par rapport à tout autre objet (je sais, niveau de stupidité O (n ^ 2)) et cela a créé un gameplay moins que fluide.
Divers forums saluent la grandeur des Quadtrees, des B-Trees et de tout autre type d'arbre ou de structure auquel vous pouvez penser.
Quelle est la structure la plus efficace pour déterminer si une collision doit être vérifiée?
2d
collision-detection
data-structure
Mike Cluck
la source
la source
Réponses:
Pour un jeu en 2D, à moins que les objets 2D ne soient très fortement répartis sur un côté de votre carte, une grille uniforme est presque toujours la voie à suivre. La complexité de la mémoire est simple, (proportionnelle aux dimensions de votre carte), et avec une distribution raisonnable, a O (1) le temps de recherche et une moyenne de journal (numberOfObjects / (lignes * colonnes)) ^ 2 tests d'intersection fait par cellule. Vous pouvez décider de ne vérifier que les cellules sur lesquelles un objet a été déplacé, ce qui rend la géométrie statique beaucoup plus efficace. Il est facile de modifier une grille uniforme à la volée (beaucoup moins pénible que dans les solutions arborescentes) et il est plus simple à mettre en œuvre. La seule fois où je dirais de ne pas l'utiliser dans un jeu 2D, c'est lorsque les besoins en mémoire d'une grille uniforme deviennent trop importants (disons une simulation d'espace où les niveaux sont rares mais énormes).
la source
Les moteurs de physique 2D tels que Box2D et Chipmunk, font un usage intensif d'une carte de hachage spatiale
voir http://chipmunk-physics.net/release/ChipmunkLatest-Docs/#CollisionDetection pour référence. Les démos de tamia incluent un très bon visualiseur de hachage spatial qui rend très clair le fonctionnement de leur technique.
la source
Si votre monde a une dimension très "longue" (appelez-la X), par rapport aux autres, vous pouvez conserver les objets dans une liste ordonnée que vous pouvez trier à nouveau au fur et à mesure qu'ils se déplacent, puis la détection de collision signifie uniquement vérifier les objets qui se chevauchent dans l'axe X.
Une autre possibilité est de garder des listes d'objets actifs / passifs, et de ne pas se soucier des objets passifs (qui ne bougent pas du tout).
Si ce sont tous des objets de taille moyenne qui sont visibles par le joueur sur l'écran, tout contre tout n'est probablement pas trop mal.
A part ça, je suis avec Darcy, une grille uniforme est bonne.
la source