Спочатку. Давайте запишемо, що ми знаємо про кожен воксель:
voxel = (x, y, z, color) // or some other information
Загальне зберігання
Загальний спосіб просто такий:
set of voxels = set of (x,y,z, color)
Зауважте, що триплет (x, y, z) ідентифікує кожен воксель однозначно, оскільки воксель є точковою у просторі, і немає ніякого способу, щоб дві точки займали одне місце (я вважаю, що ми говоримо про статичні дані про вокселі).
Це повинно бути добре для простих даних. Але це аж ніяк не швидка структура даних.
Візуалізація AFAIK здійснюється алгоритмом сканування. Стаття Tom's Hardware про вокселів має зображення алгоритму сканування .
Швидкий пошук
Якщо потрібен швидкий пошук, то найшвидшою структурою даних для пошуку є хеш (він же масив, карта ...). Тож вам доведеться з неї робити хеш. Отже, наївно ми хочемо просто найшвидший спосіб отримати довільний елемент:
array [x][y][z] of (color)
Це має O (1) для пошуку вокселя за координатами x, y, z.
Проблема полягає в тому, що вимоги до простору - це O (D ^ 3), де D - діапазон кожного числа x, y і z (забудьте реальне число, оскільки якби вони були Chars, які мають діапазон 256 значень, було б 256 ^ 3 = 2 ^ 24 == 16 777 216 елементів у масиві).
Але це залежить від того, що ви хочете зробити з вокселями. Якщо візуалізація - це те, що ви хочете, то, ймовірно, це масив, який ви хочете. Але проблема зберігання все ще залишається ...
Якщо зберігання - проблема
Одним із методів є використання стиснення RLE в масиві. Уявіть фрагмент вокселів (набір вокселів, де вокселі мають одне постійне значення координат .... як площина, де, наприклад, z = 13). Такий фрагмент вокселів виглядав би як простий малюнок у MSPaint . Модель Voxel, я б сказав, зазвичай займає частку всіх можливих місць (D ^ 3 простір усіх можливих вокселів). Я вважаю, що "взяти пару з триплета координат і стиснути осі, що залишилися" зробив би трюк (наприклад, взяти [x] [y] і для кожного елемента стиснути всі вокселі на осі z в заданому x, y .. . повинно бути від 0 до декількох елементів, RLE тут буде чудово):
array [x][y] of RLE compressed z "lines" of voxel; each uncompressed voxel has color
Іншим методом вирішення проблеми зберігання буде замість масиву, використовуючи структуру даних дерева:
tree data structure = recursively classified voxels
for octrees: recursively classified by which octant does voxel at (x,y,z) belong to
- Октре, як згадував Нік. Він повинен стискати вокселі. Octree має навіть гідну швидкість пошуку, я думаю, це якийсь O (log N), де N - кількість вокселів.
- Octree повинен мати можливість пристойно зберігати дані про вокселі.
Якщо вокселі - це якась спрощена карта висоти, ви можете зберігати саме це. Або ви можете зберігати параметри для функції, яка генерує мапу висоти, а також процедурно генерувати її ...
І звичайно, ви можете поєднувати всі можливі підходи. Але не перестарайтеся, якщо ви не перевірите, чи працює ваш код, і не виміряєте, що він дійсно швидший (тому варто оптимізувати).
TL; DR
Окрім Octrees, це стиснення RLE з вокселями, google "voxlap", "ken silverman" ...
Ресурси
Існує перелік ресурсів та обговорення того, як зробити швидкий воксель-рендерір, включені документи та вихідний код .