Как ускорить марширующие кубики? - PullRequest
7 голосов
/ 15 мая 2009

Я использую этот алгоритм марширующего куба для рисования трехмерных изоповерхностей (портированных в C #, с выводом MeshGeomtry3D s, но в остальном то же самое). Получающиеся поверхности выглядят великолепно, но на их вычисление уходит много времени.

Есть ли способы ускорить марширующие кубики? Наиболее очевидным является простое уменьшение частоты пространственной выборки, но это снижает качество получаемой сетки. Я бы хотел этого избежать.

Я рассматриваю двухпроходную систему, где при первом прохождении выборки занимают гораздо более грубое пространство, исключая объемы, где напряженность поля значительно ниже моего уровня изоляции. Это мудро? Какие подводные камни?

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

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

Ответы [ 4 ]

5 голосов
/ 06 июня 2012

Я знаю, что это немного устарело, но недавно я внедрил Marching Cubes, основанный на том же источнике. Здесь очень много неэффективности. Как минимум, если бы вы делали что-то вроде

for (int x=0; x<densityArrayWidth; x++)
  for (int z=0; z<densityArrayLength; z++)
    for (int y=0; y<densityArrayHeight; y++)
      Polygonize(Gridcell, isolevel, Triangles)

Посмотрите, сколько раз вы перераспределяете edgeTable и Tritable! Те, кто должен немедленно перейти в общий класс. Я также отбросил объект gridCell, перейдя непосредственно от точек / значений к треугольникам.

Короче говоря, это не просто алгоритмическая сложность, распределение памяти (а в основе это делает их огромное количество) также требует времени.

2 голосов
/ 19 июня 2009

На всякий случай, если кто-то еще окажется здесь, устранение мертвого пространства благодаря более высокой частоте дискретизации практически не делает разницы . Любая дистанционно безопасная (т. Е. Разрешающая граница для выборки артефактов) более грубая выборка в конечном итоге захватывает большую часть сетки в любом удаленно нетривиальном поле.

Ускорение основной оценки поля (с большим количеством запоминаний), казалось, в основном решает проблемы производительности.

0 голосов
/ 17 апреля 2013

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

Кроме того, тестирование для областей в космосе, которые нуждаются в многоугольниках, путем оценки уровня ISO с использованием Octree и пропуска областей, далеких от уровня ISO.

Я посмотрел на распространение, но это не так надежно и эффективно.

0 голосов
/ 25 апреля 2010

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

...