On dirait que vous cherchez à en apprendre davantage sur les arbres!
Et je suis sérieux, si vous parcourez actuellement un tableau de tous vos cubes, alors vous devriez vraiment examiner différentes structures de données spatiales. Dans ce cas, la meilleure façon de réimaginer votre monde de cube est comme un arbre.
Avant d'entrer dans les raisons pour lesquelles, réfléchissons à notre problème. Nous recherchons une solution où, pour le moins de frais possible, nous pouvons récupérer une liste des cubes à proximité avec lesquels le joueur peut entrer en collision. Cette liste doit être aussi petite, mais précise que possible.
Maintenant, pour déterminer cette zone, nous devons mapper l'espace de coordonnées de notre joueur à l'espace de coordonnées de la carte du cube; c'est-à-dire que nous devons mapper la position en virgule flottante du lecteur sur un index discret du tableau multidimensionnel de cubes (par exemple, la notation pourrait être world[31][31][31]
, c'est-à-dire le milieu exact pour un tableau multidimensionnel 64 * 64 * 64).
Nous pourrions simplement calculer les blocs environnants en utilisant cette même indexation discrète, en échantillonnant peut-être uniquement les cubes voisins, mais cela nécessite toujours un recalcul constant et ne permet aucun objet dont l'emplacement n'est pas discret (c.-à-d. Qui peut ne pas correspondre au cube carte).
La situation idéale est un ensemble de seaux qui contiennent nos ensembles de cubes pour des sections particulières de notre carte de cubes, divisés également afin qu'au lieu de recalculer la zone environnante, nous entrons et sortons simplement de ces zones . Pour tout calcul non trivial, conserver nos données de cette manière pourrait éliminer l'itération de tous les cubes, et uniquement de ces ensembles individuels qui se trouvent à proximité.
La question est: comment mettre en œuvre cela?
Pour le monde 64 * 64 * 64, imaginez qu'il se décompose en 8 * 8 * 8 zones . Cela signifie que dans votre monde, vous aurez 8 zones par axe (X, Y, Z). Chacune de ces zones contiendra 8 cubes, facilement récupérables grâce à ce nouvel index simplifié.
Si vous deviez effectuer une opération sur un ensemble de cubes voisins, au lieu d'itérer chaque cube de votre monde, vous pouvez simplement parcourir ces zones , décomposant le nombre maximal d'itérations des 64 * 64 * 64 d'origine (262144) à seulement 520 (8 * 8 * 8 + 8).
Maintenant, effectuez un zoom arrière sur ce monde de zones et placez les zones dans des super-zones plus grandes ; où chaque super-zone contient 2 * 2 * 2 zones régulières . En tant que votre monde contient actuellement 512 (8 * 8 * 8) zones , nous pouvons briser les 8 * 8 * 8 zones en 64 (4 * 4 * 4) super-zones en divisant 8 zones par 2 zones par super-zone . En appliquant la même logique que ci-dessus, cela briserait les itérations maximales de 512 à 8 pour trouver la super-zone ; puis un maximum de 64 pour trouver la zone de progression(total max 72)! Vous pouvez voir comment cela vous fait déjà économiser beaucoup d'itérations (262144: 72).
Je suis sûr que vous pouvez voir maintenant à quel point les arbres sont utiles. Chaque zone est une branche sur l'arbre, avec chaque super-zone comme branche précédente. Vous parcourez simplement l'arbre pour trouver ce dont vous avez besoin; en utilisant des ensembles de données plus petits pour minimiser le coût global.
Le diagramme ci-dessous devrait vous aider à visualiser le concept. (image de Wikipedia: Octrees ):
Avertissement:
Dans une configuration idéale comme ci-dessus, où votre monde de voxels est déjà disposé dans un tableau multidimensionnel de taille fixe, vous pouvez simplement interroger la position du joueur, puis indexer les blocs environnants avec un coût O (1)! (Voir l'explication d'Olhovskys) Mais cela devient plus difficile lorsque vous commencez à considérer que votre monde est rarement de taille fixe dans un jeu de voxels; et vous pourriez avoir besoin de votre structure de données pour pouvoir charger des super-zones entières du disque dur dans la mémoire. Contrairement à un tableau multidimensionnel de taille fixe, les arbres le permettent facilement sans trop de temps consacré aux algorithmes combinatoires.