2009-04-23 2 views
6

С моим последним вопросом: Marching Cube Question
Реализация алгоритма маршевого куба?

Однако, я до сих пор неясно, как в:

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

Предположим, у меня есть данные облака облаков яблока.
Как я могу продолжить?

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

ответ

1

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

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

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

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

Предположим, у меня есть данные облака облаков яблока. как я могу продолжить?

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

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

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

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

+0

может в 6 glQuads равного вокселя? если да, то как регенерируется воксельная сборка? моя точка является центром куба? – noob88

+0

@ noob88: Нет, не совсем. Ваш «куб» должен быть каким-то объектом, состоящим из 8 пионов. 6 glQuad могут быть гранями куба/воксела, а вершины, которые вы используете, могут быть вашими 8 очками. Тем не менее, я бы создал другую структуру данных. Работает так просто, как многомерный массив. –

+0

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

2

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

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

который вычислил бы расстояние от точки и до начала координат для каждой точки вашего скалярного поля. Если isovalue - радиус, вы просто указали способ представления сферы. Это потому, что | v | < = R истинно для всех точек внутри сферы или живет внутри. Просто выясните, какие вершины находятся внутри сферы и какие из них находятся снаружи. Вы хотите использовать операторов с меньшим или большим числом, потому что объем разделяет пространство на два. Когда вы знаете, какие точки в вашем кубе классифицируются как внутри, так и снаружи, вы также знаете, какие края пересекаются изоповерхностью. Вы можете получить все, от треугольников до пяти треугольников. Положение вершин сетки может быть вычислено путем интерполяции по пересекающимся ребрам, чтобы найти фактическую точку пересечения.


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

1

В соответствии с просьбой, вот некоторые примеры кода, реализующие алгоритм Маршевые Кубики (с помощью JavaScript/three.js для графики):

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

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

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

Смежные вопросы