Primero. Vamos a escribir qué sabemos sobre cada vóxel:
voxel = (x, y, z, color) // or some other information
Almacenamiento general
La forma general es simplemente esto:
set of voxels = set of (x,y,z, color)
Tenga en cuenta que ese triplete (x, y, z) identifica cada vóxel de manera única, ya que el vóxel es un punto en el espacio y no hay forma de que dos puntos ocupen un lugar (creo que estamos hablando de datos estáticos del vóxel).
Debería estar bien para datos simples. Pero de ninguna manera es una estructura de datos rápida.
El renderizado es AFAIK hecho por el algoritmo scanline. El artículo de Tom's Hardware sobre voxels tiene una imagen del algoritmo scanline .
Búsqueda rápida
Si se necesita una búsqueda rápida, la estructura de datos más rápida para la búsqueda es hash (también conocido como matriz, mapa ...). Entonces tienes que hacer hash con eso. Entonces, ingenuamente, queremos la forma más rápida de obtener elementos arbitrarios:
array [x][y][z] of (color)
Esto tiene O (1) para buscar voxel por coordenadas x, y, z.
El problema es que los requisitos de espacio son O (D ^ 3), donde D es el rango de cada número x, y y z (olvide el número real, ya que si fueran caracteres, que tienen un rango de 256 valores, habría 256 ^ 3 = 2 ^ 24 == 16 777 216 elementos en la matriz).
Pero depende de lo que quieras hacer con los vóxeles. Si la representación es lo que desea, entonces probablemente sea esta matriz la que desea. Pero el problema de almacenamiento sigue siendo ...
Si el problema es el almacenamiento
Un método es usar la compresión RLE en la matriz. Imagine una rebanada de vóxeles (conjunto de vóxeles, donde los vóxeles tienen un valor constante coordinado ... como el plano donde z = 13, por ejemplo). Tal porción de vóxeles se vería como un simple dibujo en MSPaint . El modelo de vóxel, diría, generalmente ocupa una fracción de todos los lugares posibles (espacio D ^ 3 de todos los vóxeles posibles). Creo que "tomar un par del triplete de coordenadas y comprimir el eje restante" haría el truco (por ejemplo, tomar [x] [y] y para cada elemento comprimir todos los vóxeles en el eje z en x, y .. Debería haber 0 a pocos elementos, RLE estaría bien aquí):
array [x][y] of RLE compressed z "lines" of voxel; each uncompressed voxel has color
Otro método para resolver el problema de almacenamiento sería en lugar de la matriz utilizando la estructura de datos de árbol:
tree data structure = recursively classified voxels
for octrees: recursively classified by which octant does voxel at (x,y,z) belong to
- Octree, como lo mencionó Nick. Debe comprimir vóxeles. Octree tiene incluso una velocidad decente para la búsqueda, supongo que es algo de O (log N), donde N es el número de vóxeles.
- Octree debería poder almacenar datos de vóxel decentemente arbitrarios.
Si los vóxeles son un mapa de altura simplista, puede almacenar eso. O bien, puede almacenar parámetros para la función que genera el mapa de altura, es decir, generarlo procesalmente ...
Y, por supuesto, puede combinar todos los enfoques posibles. Pero no exagere, a menos que pruebe que su código funciona y mida que es REALMENTE más rápido (por lo que vale la pena la optimización).
TL; DR
Además de Octrees es la compresión RLE con voxels, google "voxlap", "ken silverman" ...
Recursos
Hay una lista de recursos y discusión sobre cómo hacer un procesador rápido de vóxel, incluye documentos y código fuente .