Я написал полную реализацию октодерева без особой оптимизации для трехмерной реконструкции, однако древовидная структура содержит слишком много указателей и не может поддерживать более 256 ^ 3 вокселей.
Теоретически для недревесной структуры, если бы я использовал vector<bool>
который использует ~ 1 бит на воксел, это было бы более приемлемым, потому что не древовидная структура могла поддерживать 2k ^ 3 с 8 ГБ памяти.
Однако оптимизированная структура октодерева должна быть в состоянии сделать равным или лучше, чем это, так как:
Он не должен хранить каждый воксель, так как конденсация может разрешить сжатие соседних вокселей одинакового значения.
Он не должен использовать слишком много указателей, так как сами указатели уже используют изрядное количество байтов.
Октри должно быть довольно низким отношение узел / воксель.
Для полного октри номер узла может быть рассчитан как (s^3 -1) / 7
, s
разрешение громкости, которое является степенью 2. Например, если s = 4
Мне нужно 1 + 8 = 9
узлы в октрее, чтобы представить сетку вокселей 4x4x4.
Кто-нибудь знает о реализации октри в C ++, которая отвечает этим спецификациям?
Я думаю, что октре — это путь, но дочерние узлы должны быть построены только при необходимости (установлен хотя бы один воксель). Кроме того, сжатие должно быть использовано. Часто соседние вокселы имеют одинаковые значения, и, таким образом, сжатие RLE, кажется, работает хорошо. Это объясняется в этом тезисе http://www.terathon.com/voxels/
Других решений пока нет …