Марширующий кубик Вопрос - PullRequest
6 голосов
/ 22 апреля 2009

В настоящее время я пишу программу для реализации Marching Cube с использованием C ++ и Opengl.

Тем не менее, мой лучший справочник только с http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/

в Интернете, предоставленные коды написаны на C.
моя проблема здесь в том, что я не понимаю triTable и edgeTable
и как они связаны.

Может ли кто-нибудь помочь мне с объяснением или руководством по преобразованию алгоритма в коды?

1 Ответ

12 голосов
/ 22 апреля 2009

Эти таблицы используются для выяснения, как тесселяции поверхности:

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

Небольшой пример:

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

Весь перекресток должен выглядеть клин.

Если вы думаете об этом, вы должны интерполировать значения по краям: 0 и 9, а также 2 и 10. Если вы введете это в битовое поле, каждый бит, соответствующий «пересекается ли край?» вы бы получили что-то вроде этого:

10 9 8 7 6 5 4 3 2 1  edge
 1 1 0 0 0 0 1 0 1 0  intersected?

не так ли?

Каково именно значение из edgeTable [3] в двоичном виде;) 0x30A = 1100001010

Теперь вы можете написать функцию, которая линейно интерполирует точки на этих ребрах. чтобы соответствовать вашему уровню. Эти точки станут вашей поверхностью внутри этой клетки.

Но как провести тесселяцию этой ячейки / поверхности?

если вы посмотрите на triTable [3], улыбка должна появиться на вашем лице:)

Addit после формулировки остаточного недоумения в комментарии:; -)

Что делают Marching Cubes: Представьте, что у вас есть темная комната с одним точечным источником света. Это центр объемного поля интенсивности света скалярных значений интенсивности. Вы можете перейти к точке (x, y, z) и измерить там интенсивность, например, 3 канделы.

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

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

Итак: Первые марширующие кубики разбивают весь объем на кубы одинакового размера. Если базовые данные имеют некоторую базовую дискретность, используются их кратные. Я не буду вдаваться в другой случай, так как это редко. Например, мы помещаем сетку с плотностью 1 мм в комнату 2xx5mx5m

Мы используем кубики 5ммх5ммх5мм. Пробежка по ним должна быть намного дешевле.

Теперь вы можете представить, что края некоторых кубов пересекают изоповерхность. Это интересные. Этот код идентифицирует их:

cubeindex = 0;
   if (grid.val[0] 

если cubeindex остается нулевым, этот конкретный куб не пересекается изоповерхностью. Если cubeindex> 0, теперь вы знаете, что изоповерхность проходит через этот куб и вы хотите отобразить часть изоповерхности, которая находится внутри него.

Пожалуйста, представьте себе это в уме. Увидеть http://en.wikipedia.org/wiki/Marching_cubes для примеров пересекающихся кубов.

Вершины, которые вы можете легко получить, - это те, что находятся на краях куба. Просто линейно интерполируйте между двумя угловыми точками, чтобы найти положение из isoveue и положить там вершину. Но какие края пересекаются ??? Это информация в edgeTable [cubeindex]. Это большой кусок кода со всеми if, который хранит интерполированное точки как вершины в массиве точек xyz: vertlist []. Эта часть гласит:

get the bitfield = edgeTable[cubeindex]
 if edge 1 is marked in bitfield (bit 1 set to 1 in bitfield)
    vertlist[0] = interpolated point, somewhere on edge 1
... and so on.

Теперь у вас есть массив, полный вершин, но как соединить их с треугольниками? Это информация, которую можно получить в tritable.

Остальное - в значительной степени то, что я объяснил выше.

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

...