2008-12-16 27 views
8

Je cherchais depuis longtemps une implémentation de noeud quadtree/quadtree sur le net. Il y a quelques trucs de base mais rien que je serais capable de vraiment utiliser un jeu.Quadtree vs Red-Black tree pour une partie en C++?

Mon but est de stocker des objets dans un jeu pour le traitement de choses telles que la détection de collision. Je ne suis pas sûr à 100% qu'un quadtree est la meilleure structure de données à utiliser, mais d'après ce que j'ai lu c'est. J'ai déjà codé un arbre rouge-noir, mais je ne sais pas vraiment si la performance serait assez bonne pour mon jeu (qui sera un jeu d'aventure à la 3ème personne comme Ankh).

Comment est-ce que j'écrirais une classe quadtree basique (ou octree) en C++? Comment utiliseriez-vous le quadrige pour les collisions?

+0

Ceci est un peu vague. Je pense que l'implémentation de l'arborescence doit savoir quel type de données vous voulez stocker, car cela affecte les détails sur le fonctionnement de l'insertion (fractionnement, etc.). – unwind

Répondre

17

Les quadriphes sont utilisés lorsque vous avez uniquement besoin de stocker des objets qui se trouvent effectivement dans un plan. Comme des unités dans un RTS classique où ils sont tous sur le terrain ou juste un peu au-dessus. Essentiellement, chaque nœud a des liens vers 4 enfants qui divisent l'espace du nœud en quartiers répartis uniformément.

Les arbres font la même chose mais dans les trois dimensions plutôt que seulement deux, et ils ont donc 8 nœuds enfants et divisent l'espace en huit. Ils devraient être utilisés lorsque les entités du jeu sont réparties plus également entre les trois dimensions. Si vous cherchez un arbre binaire - comme un arbre rouge-noir - alors vous voulez utiliser une structure de données appelée un arbre de partitionnement binaire (arbre BSP) ou une version appelée l'arbre KD. Ces espaces de partition en moitiés utilisant un plan, dans l'arbre KD les plans sont orthogonaux (sur les axes XZ, XY, ZY) donc parfois cela fonctionne mieux dans une scène 3D. Les arbres BSP divisent la scène en utilisant des plans dans n'importe quelle orientation, mais ils peuvent être très utiles, et ils ont été utilisés aussi loin que Doom. Maintenant que vous avez partitionné l'espace de jeu, vous n'avez plus besoin de tester chaque entité de jeu par rapport à toutes les autres entités du jeu pour voir si elles entrent en collision, ce qui est un algorithme O (n^2). Au lieu de cela, vous interrogez la structure de données pour renvoyer les entités de jeu dans une sous-région de l'espace de jeu, et effectuez seulement la détection de collision pour ces nœuds l'un contre l'autre. Cela signifie que la détection de collision pour toutes les entités de jeu doit être une opération n O (nlogn) (au pire).

Un certain nombre de choses supplémentaires à surveiller:

  • Assurez-vous de tester des entités de jeu de noeuds adjacents, non seulement ceux dans le nœud actuel, car ils pourraient encore entrer en collision.Rééquilibrer la structure de données après le déplacement des entités car vous pouvez avoir des nœuds vides dans la structure de données ou des entités contenant trop d'entités pour de bonnes performances (le cas dégénéré de toutes les entités étant également dans le même nœud).
5

La raison d'utiliser un quadtree est que vous pouvez ensuite diviser en coordonnées x et y, un octree sur x, y et z, ce qui rend la détection de collision triviale. Quadtree: si un élément ne se trouve pas dans le topleft, il ne risque pas d'entrer en collision avec l'un des éléments suivants: topright, bottomleft ou rightright.

C'est une classe très basique, donc je ne comprends pas ce qui vous manque dans les implémentations que vous avez trouvées.

Je n'écrirais pas une telle classe, je l'emprunterais simplement à un projet avec une licence appropriée.

+0

exactement. le point d'un quadtree n'est pas rapide traversal de l'arbre, mais en évitant la traversée en premier lieu. – Jimmy

+0

+1, aussi les arbres kd sont bons pour la détection de collision – user7116

10

Un arbre rouge-noir n'est pas un index spatial; il ne peut trier que sur une seule clé ordinale. Un quadtree est (pour deux dimensions) un index spatial qui permet une recherche rapide et l'élimination des points. Un Octree fait la même chose pour trois dimensions.

0

Les arbres en général sont problématiques en ce sens que tout élément inséré peut se trouver sur une frontière, et toutes les méthodes pour traiter cette situation sont assez insatisfaisantes.

Vous aurez très probablement envie de trier vos objets de manière mobile et statique, et de vérifier tout ce qui a bougé sur une image donnée par rapport aux objets statiques. BSP Les arbres sont la solution acceptée pour la géométrie statique (cas limites traités en divisant l'objet en deux parties), pour dynamique essayer quelque chose comme trier et balayer (également connu sous le nom de balayage et élagage).

2

Je vous suggère chaudement d'utiliser un moteur de rendu, Ogre3D par exemple. Autant que je sache, il supporte Octrees pour la gestion de scène. Mais vous pouvez étendre la classe basée sur Octree comme vous le souhaitez. J'avais l'habitude de coder les choses dont j'avais besoin, mais pour des projets complexes, ce n'est pas la bonne façon.