Каков наилучший способ рендеринга огромного воксельного объекта?

Я пытаюсь отобразить 3D-модель человека в opengl. Объект человека представлен трехмерным массивом [n][n][n] (высота, ширина и глубина), где n = 300. Каждый элемент массива имеет значение либо 1, либо 0. Если элемент равен 0, то он должен быть проигнорировано, еще нарисовано.

Проблема: из-за того, что мне приходится перебирать 3D-массив, используя 3 вложенных цикла for, а затем создавать вершины для каждого отдельного вокселя, это занимает много времени.

Моя идея, как решить проблему: написать еще одну программу, которая будет перебирать массив, создавать вершины и записывать их в файл. И затем всякий раз, когда мне нужно выполнить рендеринг, я буду читать вершины из файла.

Вопрос: Как лучше всего визуализировать такой объект? Было бы здорово, если бы вы могли предложить какой-либо алгоритм или технику.


person Elnur    schedule 12.06.2020    source источник
comment
Попробуйте найти "opengl volume rendering". Также "isosurface generation" и "marching cubes".   -  person G.M.    schedule 12.06.2020


Ответы (1)


Много лет назад я сделал школьный проект, где сделал что-то подобное.

У меня было трехмерное представление объема с 0 и 1, которое представляет комнату. 0 означает, что куб пуст, 1 означает, что куб полон. Это та же проблема, с которой вы столкнулись, но переворачивание нормалей квадроциклов.

введите здесь описание изображения

Поэтому я сделал алгоритм, который превращает куб битов в минимальное количество квадов.

Я копался в своем старом репозитории кода и нашел функция, которая это делает. Мне немного стыдно за код, который я написал тогда, но, надеюсь, вы сможете черпать из него вдохновение.

Я попытаюсь дать краткое объяснение того, что делает алгоритм.

  • Мы разрезаем объем плоскостями в каждом направлении X, Y и Z.
  • Для каждой плоскости мы проверяем все клетки, которых она касается с каждой стороны.
  • Если обе стороны имеют одинаковое число (обе 0 или обе 1), мы ничего не делаем.
  • В противном случае (у нас разные числа на каждой стороне) мы генерируем четырехугольник в этой позиции, и нормаль этого четырехугольника будет зависеть от порядка чисел (01 или 10).
  • Не обращайте внимания на переменную colorCount, я думаю, что это просто идентификатор цвета, который я использовал для отладки.

Моя программа вызывала этот алгоритм при первой загрузке и всякий раз, когда вы вносили изменения в сцену (это был live-редактор). Я не заметил каких-либо замедлений при редактировании сцены, да и компьютер, который я тогда использовал, был не очень быстрым.

person tuket    schedule 12.06.2020