2015-06-16 6 views
1

Я реализую алгоритм марширующих кубов обычно на основе реализации Paul Bourke с некоторыми основными корректировками:Маршевых Кубики Terrassing/Ридж Эффект

(значения с плавающей точкой)
  • предвычисления из scalarfield
  • избежать дублирующих вершин окончательный список с помощью зОго :: карты
  • вершины хранения визуализировать конечные сетки в Ogre3D

в принципе я изменил почти 80% его кода. У моей получившейся сетки есть некоторые уродливые страхи, и я не уверен, как их избежать. Я предположил, что использование плавающих точек для скалярного поля будет выполнять эту работу. Это общий эффект? Как вы можете избежать этого?

Terassing Marching Cubes

вычисления позиции вершин по краям. (Cell.val [p1] содержит скалярное значение для данной вершины):

//if there is an intersection on this edge 
     if (cell.iEdgeFlags & (1 << iEdge)) 
     { 
      const int* edge = a2iEdgeConnection[iEdge]; 

      int p1 = edge[0]; 
      int p2 = edge[1]; 

      //find the approx intersection point by linear interpolation between the two edges and the density value 
      float length = cell.val[p1]/(cell.val[p2] + cell.val[p1]); 
      asEdgeVertex[iEdge] = cell.p[p1] + length * (cell.p[p2] - cell.p[p1]); 
     } 

Вы можете найти полный исходный код здесь: https://github.com/DieOptimistin/MarchingCubes я использую Ogre3D в качестве библиотеки для этого примера.

+0

Это, безусловно, может быть сделано, чтобы быть гладкими, но вы можете сузить это до нескольких строк коды, которые дают вам расположение пикселей, вы не согласны, а скриншот? Это очень сложно помочь вам отладить скриншот ... –

+0

Я отредактировал этот вопрос. Поскольку можно сделать его гладким без какого-либо дополнительного алгоритма сглаживания, я предполагаю, что у меня есть ошибка при вычислении положения вершины. – Anthea

+0

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

ответ

0

Как сказал Энди Ньюманн, дьявол находился в линейной интерполяции. Правильно это:

float offset; 
float delta = cell.val[p2] - cell.val[p1]; 

if (delta == 0) offset = 0.5; 
else offset = (mTargetValue - cell.val[p1])/delta; 

asEdgeVertex[iEdge] = cell.p[p1] + offset* (cell.p[p2] - cell.p[p1]); 
Смежные вопросы