Реализация алгоритма марширующего куба? - PullRequest
6 голосов
/ 23 апреля 2009

Из моего последнего вопроса: Вопрос к марширующему кубу

Тем не менее, мне все еще неясно, как в:

  1. как создать воображаемый куб / воксель, чтобы проверить, находится ли вершина ниже изоповерхности?
  2. как узнать, какая вершина находится ниже изоповерхности?
  3. как каждый куб / воксель определяет, какой куб / поверхность использовать?
  4. как нарисовать поверхность, используя данные в triTable?

Допустим, у меня есть данные об облаке точек яблока.
как мне поступить?

Может ли кто-нибудь, кто знаком с Marching Cube, помочь мне?
Я знаю только C ++ и OpenGL. (C немного не в моей руке)

Ответы [ 3 ]

2 голосов
/ 23 апреля 2009

Прежде всего, изоповерхность может быть представлена ​​двумя способами. Один из способов состоит в том, чтобы иметь скалярные значения isoveue и per-point в качестве набора данных из внешнего источника. Так работает МРТ. Второй подход заключается в создании неявной функции F (), которая принимает точку / вершину в качестве параметра и возвращает новый скаляр. Рассмотрим эту функцию:

float computeScalar(const Vector3<float>& v)
{
    return std::sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
}

Что вычислит расстояние от точки до начала координат для каждой точки в вашем скалярном поле. Если isoveue - это радиус, вы просто нашли способ представить сферу. Это потому что | v | <= R верно для всех точек внутри сферы или тех, которые живут внутри нее. Просто выясните, какие вершины находятся внутри сферы, а какие - снаружи. Вы хотите использовать операторы «меньше» или «больше», потому что том делит пространство на две части. Когда вы знаете, какие точки в вашем кубе классифицируются как внутри и снаружи, вы также знаете, по каким краям пересекается изоповерхность. Вы можете в конечном итоге все, от треугольников до пяти треугольников. Положение вершин сетки можно вычислить путем интерполяции по пересеченным ребрам, чтобы найти фактическую точку пересечения. </p>


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

1 голос
/ 28 августа 2012

В соответствии с запросом приведен пример кода, реализующего алгоритм Marching Cubes (с использованием JavaScript / Three.js для графики):

http://stemkoski.github.com/Three.js/Marching-Cubes.html

Для более подробной информации о теории, вы должны проверить статью в

http://paulbourke.net/geometry/polygonise/

1 голос
/ 23 апреля 2009

1) Это зависит от вашей реализации. Вам понадобится структура данных, в которой вы можете искать значения в каждом углу (вершине) вокселя или куба. Это может быть трехмерное изображение (т.е. трехмерная текстура в OpenGL), или это может быть настроенная структура данных массива, или любой другой формат, который вы пожелаете.

2) Вам нужно проверить вершины куба. Для этого есть разные оптимизации, но в общем случае начните с первого угла и просто проверьте значения всех 8 углов куба.

3) Большинство (быстрых) алгоритмов создают битовую маску для использования в качестве таблицы поиска в статическом массиве опций. Есть только так много возможных вариантов для этого.

4) Как только вы сделали треугольники из triTable, вы можете использовать OpenGL для их рендеринга.

Допустим, у меня есть данные об облаке точек яблока. как мне поступить?

Это не сработает с марширующими кубиками. Для марширующих кубов требуются данные вокселей, поэтому вам нужно использовать некоторый алгоритм, чтобы поместить облако точек данных в кубический объем. Gaussian Splatting является одним из вариантов здесь.

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

Если вы хотите узнать больше, я настоятельно рекомендую прочитать некоторые книги по технике визуализации. Хороший пример от ребят из Kitware - Набор инструментов визуализации .

Возможно, вы захотите взглянуть на VTK . Он имеет реализацию C ++ Marching Cubes и является полностью открытым исходным кодом.

...