Первый. Давайте напишем, что мы знаем о каждом вокселе:
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 (забудьте реальное число, поскольку, если бы они были символами с диапазоном 256 значений, было бы 256 ^ 3 = 2 ^ 24 == 16 777 216 элементов в массиве).
Но это зависит от того, что вы хотите сделать с вокселями. Если рендеринг - это то, что вы хотите, то, вероятно, именно этот массив вам нужен. Но проблема хранения все еще остается ...
Если проблема в хранении
Одним из методов является использование сжатия RLE в массиве. Представьте себе фрагмент вокселей (набор вокселей, где вокселы имеют одно значение постоянной координаты ... например, плоскость, где z = 13). Такой кусок вокселей будет выглядеть как простой рисунок в MSPaint . Воксельная модель, я бы сказал, обычно занимает долю всех возможных мест (пространство 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" ...
Ресурсы
Существует список ресурсов и обсуждение того, как сделать быстрый рендеринг вокселей, включает в себя документы и исходный код .