Primo. Scriviamo cosa sappiamo di ogni voxel:
voxel = (x, y, z, color) // or some other information
Archiviazione generale
Il modo generale è semplicemente questo:
set of voxels = set of (x,y,z, color)
Nota che quella tripletta (x, y, z) identifica ogni voxel in modo univoco, poiché voxel è punto nello spazio e non c'è modo che due punti occupino un posto (credo che stiamo parlando di dati voxel statici).
Dovrebbe andare bene per dati semplici. Ma non è affatto una struttura di dati veloce.
Il rendering è AFAIK fatto dall'algoritmo scanline. L'articolo di Tom sull'hardware su voxels ha un'immagine dell'algoritmo scanline .
Ricerca veloce
Se è necessaria una ricerca rapida, la struttura dati più veloce per la ricerca è l'hash (aka array, map ...). Quindi devi fare hash da esso. Quindi, ingenuamente vogliamo il modo più veloce per ottenere elementi arbitrari:
array [x][y][z] of (color)
Questo ha O (1) per cercare voxel con le coordinate x, y, z.
Il problema è che i suoi requisiti di spazio sono O (D ^ 3), dove D è un intervallo di ogni numero x, y e z (dimentica il numero reale, poiché se fossero Char, che hanno un intervallo di 256 valori, ci sarebbero 256 ^ 3 = 2 ^ 24 == 16 777 216 elementi nella matrice).
Ma dipende da cosa vuoi fare con i voxel. Se il rendering è quello che vuoi, allora è probabilmente questo array quello che vuoi. Ma il problema di archiviazione rimane ancora ...
Se l'archiviazione è il problema
Un metodo consiste nell'utilizzare la compressione RLE nell'array. Immagina una fetta di voxel (insieme di voxel, in cui i voxel hanno un valore costante di coordinate .... come il piano dove z = 13 per esempio). Una tale fetta di voxel sembrerebbe un semplice disegno in MSPaint . Il modello di Voxel, direi, di solito occupa una frazione di tutti i posti possibili (D ^ 3 spazio di tutti i possibili voxel). Credo che "prendere una coppia da una tripletta di coordinate e comprimere l'asse rimanente" farebbe il trucco (ad esempio prendere [x] [y] e per ogni elemento comprimere tutti i voxel sull'asse z in corrispondenza di x, y .. ci dovrebbero essere da 0 a pochi elementi, RLE farebbe bene qui):
array [x][y] of RLE compressed z "lines" of voxel; each uncompressed voxel has color
Un altro metodo per risolvere il problema di archiviazione sarebbe invece dell'array usando la struttura dei dati dell'albero:
tree data structure = recursively classified voxels
for octrees: recursively classified by which octant does voxel at (x,y,z) belong to
- Octree, come menzionato da Nick. Dovrebbe comprimere i voxel. Octree ha anche una velocità decente per la ricerca, immagino che sia un po '(log N), dove N è il numero di voxel.
- Octree dovrebbe essere in grado di memorizzare dati voxel decentemente arbitrari.
Se i voxel sono un'altezza semplicistica, potresti archiviare proprio quello. Oppure è possibile memorizzare parametri per la funzione che genera la heightmap, ovvero generarla proceduralmente ...
E ovviamente puoi combinare tutti i possibili approcci. Ma non esagerare, a meno che tu non provi che il tuo codice funziona e misuri che è DAVVERO più veloce (quindi vale l'ottimizzazione).
TL; DR
Altro che Octrees è la compressione RLE con voxels, google "voxlap", "ken silverman" ...
risorse
C'è un elenco di risorse e discussioni su come rendere veloce il renderer voxel, include documenti e codice sorgente .