Premier. Permet d'écrire ce que nous savons sur chaque voxel:
voxel = (x, y, z, color) // or some other information
Stockage général
La manière générale est simplement la suivante:
set of voxels = set of (x,y,z, color)
Notez que ce triplet (x, y, z) identifie chaque voxel de manière unique, car le voxel est un point dans l'espace et il n'y a aucun moyen que deux points occupent une place (je pense que nous parlons de données statiques de voxel).
Cela devrait convenir aux données simples. Mais ce n'est en aucun cas une structure de données rapide.
Le rendu est AFAIK effectué par l'algorithme scanline. L'article de Tom's Hardware sur les voxels contient une image de l'algorithme scanline .
Recherche rapide
Si une recherche rapide est nécessaire, la structure de données la plus rapide pour la recherche est le hachage (aka tableau, carte ...). Vous devez donc en faire du hachage. Donc, naïvement, nous voulons juste le moyen le plus rapide d'obtenir un élément arbitraire:
array [x][y][z] of (color)
Cela a O (1) pour rechercher le voxel par les coordonnées x, y, z.
Le problème est que l'espace requis est O (D ^ 3), où D est la plage de chaque nombre x, y et z (oubliez le nombre réel, car s'il s'agissait de caractères, qui ont une plage de 256 valeurs, il y aurait 256 ^ 3 = 2 ^ 24 == 16 777 216 éléments dans le tableau).
Mais cela dépend de ce que vous voulez faire avec les voxels. Si le rendu est ce que vous voulez, c'est probablement ce tableau que vous voulez. Mais le problème de stockage reste toujours ...
Si le stockage est le problème
Une méthode consiste à utiliser la compression RLE dans le tableau. Imaginez une tranche de voxels (ensemble de voxels, où les voxels ont une valeur constante de coordonnées ... comme un plan où z = 13 par exemple). Une telle tranche de voxels ressemblerait à un simple dessin dans MSPaint . Le modèle de voxel, je dirais, occupe généralement une fraction de tous les endroits possibles (espace D ^ 3 de tous les voxels possibles). Je crois que "prendre une paire dans un triplet de coordonnées et compresser l'axe restant" ferait l'affaire (par exemple prendre [x] [y] et pour chaque élément compresser tous les voxels sur l'axe z à x, y .. . il devrait y avoir 0 à peu d'éléments, RLE ferait bien ici):
array [x][y] of RLE compressed z "lines" of voxel; each uncompressed voxel has color
Une autre méthode pour résoudre le problème de stockage serait au lieu d'un tableau utilisant une structure de données arborescente:
tree data structure = recursively classified voxels
for octrees: recursively classified by which octant does voxel at (x,y,z) belong to
- Octree, comme mentionné par Nick. Il devrait comprimer les voxels. Octree a même une vitesse décente pour la recherche, je suppose que c'est un certain O (log N), où N est le nombre de voxels.
- Octree devrait pouvoir stocker des données de voxels arbitrairement décentes.
Si les voxels sont une carte de hauteur simpliste, vous pouvez stocker exactement cela. Ou vous pouvez stocker les paramètres de la fonction qui génère la carte de hauteur, alias la générer de manière procédurale ...
Et bien sûr, vous pouvez combiner toutes les approches possibles. Mais n'en faites pas trop, sauf si vous testez que votre code fonctionne et mesurez qu'il est VRAIMENT plus rapide (il vaut donc la peine d'être optimisé).
TL; DR
Autre qu'Octrees, la compression RLE avec voxels, google "voxlap", "ken silverman" ...
Ressources
Il y a une liste de ressources et une discussion sur la façon de faire un rendu rapide de voxel, comprend des articles et du code source .