Марширующие кубики — отсутствующие треугольники в сетке

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

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

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

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

Вместо использования массива 12-битных граничных флагов у меня есть 12 операторов if (2 из которых показаны). Я использую индекс в трехмерном массиве, чтобы определить значения x, y, z на основе значений ребер (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;
}

Сетка треугольника, показывающая пропущенные треугольники

Весь предоставленный набор данных с проблемой пропущенных треугольников

ОБНОВИТЬ:

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

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

Исправлена ​​проблема с отсутствующими треугольниками, но существует проблема инверсии на оси z

5

Решение

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]