2014-02-12 2 views
3

В настоящее время я работаю над пониманием и реализацией алгоритма маршевых кубов, используя C++, создавая образец данных в OpenGL.Выполнение маршевых кубов - пропущенные треугольники в сетке

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

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

В таблице край пересечения Я использовал это по следующей ссылке: http://paulbourke.net/geometry/polygonise/

Вместо того чтобы использовать массив флага края 12 битовых записей у меня 12, если утверждения (2 из которых показаны). Я использовать индекс в 3D-массив, чтобы определить значения х, у, г на основе значений краевого (0-11)

if ((edge.point1 == 0 && edge.point2 == 1) || 
     (edge.point1 == 1 && edge.point2 == 0)) 
    { 
     p1.x = x; p1.y = y; p1.z = z; 
     p2.x = x+1; p2.y = y; p2.z = z; 
    } 
    else if ((edge.point1 == 1 && edge.point2 == 2) || 
      (edge.point1 == 2 && edge.point2 == 1)) 
    { 
     p1.x = x+1; p1.y = y; p1.z = z; 
     p2.x = x+1; p2.y = y+1; p2.z = z; 
    } 

Кроме того, функция интерполяции ниже.

point interpolate(point p1, point p2, unsigned char isovalue) 
{ 
    point p; 

    unsigned char d1 = getDataValue(p1.x, p1.y, p1.z); 
    unsigned char d2 = getDataValue(p2.x, p2.y, p2.z); 

    if (abs(double(isovalue)-double(d1)) == 0) 
     return(p1); 
    if (abs(double(isovalue)-double(d2)) == 0) 
     return(p2); 
    if (abs(double(d1)-double(d2)) == 0) 
     return(p1); 

    double val = double(isovalue - d1)/double(d2 - d1); 

    p.x = p1.x + val * (p2.x - p1.x); 
    p.y = p1.y + val * (p2.y - p1.y); 
    p.z = p1.z + val * (p2.z - p1.z); 

    return p; 
} 

Triangle mesh showing missing triangles

Entire rendered data set with the missing triangles issue

UPDATE:

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

Почему объект должен инвертировать значения z во время вращения?

Missing triangles issue fixed but there is an inversion problem on z-axis

+1

Не хватает ли они или назад? Вы пытались отключить отбраковку? В качестве альтернативы, каков тип данных для вашего буфера Element/ElementArray? Если вы используете, скажем, GLushort, и добавляете более 64 тыс. Индексов, странные вещи начинают происходить. –

+0

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

+0

Дэвид, Спасибо за ответ. Я увижу, возможно, это может быть отбраковка или, может быть, ошибка вычисления. Используемым типом данных является unsigned char (0-255) - 1 Byte. Каждая ячейка 3D-массива достигает 255, а данные имеют ширину 255 и 255 на 240 глубину. И, Питер, я раньше не пробовал Code Review, но сделаю это. Спасибо за помощь. – Vahe

ответ

1

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

  • Вычислены ли ваши конфигурации ячеек?
  • Вы выполнили правильное сопоставление между конфигурацией ячейки и выходными треугольниками?
  • Все ваши треугольники заказываются по часовой стрелке/против часовой стрелки?
+0

Я исследовал причину исчезновения треугольников немного дальше и узнал, что случаи с двусмысленностью могут привести к отсутствию треугольников. Я наткнулся на технику под названием «Разрешение асимптотического решения», но все примеры представлены в 2D. Как мне реализовать резольвер в 3D для кубов с неопределенностями? Спасибо. – Vahe

+0

Для кубов с двусмысленностью вы берете еще один образец из центра. См. Мою публикацию здесь: http://webhome.cs.uvic.ca/~blob/publications/egpgv12.pdf – Pourya

+0

Спасибо за помощь и бумагу. Я хотел бы упомянуть еще одно замечание. Я попытался запустить свой код без какого-либо разрешения двусмысленности (со стандартной таблицы поиска) и заметил отсутствующие треугольники. Я также интегрировал код из http://afni.nimh.nih.gov/pub/dist/src/SUMA/MarchingCubes/ в свой код, используя как LookupTable.h с подслучами, так и MarchingCubes.c, но все же заметил отсутствующие треугольники. Я не знаю, можно ли просмотреть обновленный код. Если так, я был бы признателен. Я загрузил код на https://gist.github.com/anonymous/9056336 – Vahe

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