2015-12-05 3 views
0

Я использую пакет из CGAL, 3D Surface Mesh Generation.Нормали, вероятно, не последовательны после создания CGAL 3D Surface Mesh

http://doc.cgal.org/latest/Surface_mesher/index.html#Chapter_3D_Surface_Mesh_Generation

Я начал из примера кода:

http://doc.cgal.org/latest/Surface_mesher/Surface_mesher_2mesh_an_implicit_function_8cpp-example.html

и теперь пытались извлечь соответствующие грани (= треугольники), чтобы отобразить с переменной c2t3 типа C2t3. Хорошее объяснение, как сделать это было в

http://wiki.schmid.dk/wiki/index.php/CGAL

Я последовал за это объяснение с небольшой модификацией, что я нашел в

http://cgal-discuss.949826.n4.nabble.com/normal-vector-of-a-facet-td1580004.html

Теперь, когда я даю треугольники OpenGL самым ниже, отображаемая поверхность - это мозаика желтого цвета (мой цвет подсветки) и черные треугольники. Я заключаю это потому, что нормали поверхности несовместимы. но как это может быть? Если следовать за аргументом в последней ссылке выше, он должен выйти правильно. Может ли кто-нибудь с лучшим знакомством с CGAL и 3D Surface Mesh Generation и его структурами данных дать мне некоторые рекомендации? (Я также попробовал несколько очевидных альтернатив коду ниже, но ничего не работало правильно).

for (C2t3::Facet_iterator fit = c2t3.facets_begin(); fit != c2t3.facets_end(); ++fit) { 

     const Point_3& p0 = fit->first->vertex((fit->second))->point(); 
     // points on the facet 
     const Point_3& p1 = fit->first->vertex((fit->second+1)&3)->point(); 
     const Point_3& p2 = fit->first->vertex((fit->second+2)&3)->point(); 
     const Point_3& p3 = fit->first->vertex((fit->second+3)&3)->point(); 

     Vector_3 n = (fit->second % 2 == 1) ? 
          CGAL::normal(p1, p2, p3) : 
          CGAL::normal(p1, p3, p2); 

     n = n /sqrt(n * n); 

     glNormal3d(n.x(), n.y(), n.z()); 
     glVertex3d(p1.x(), p1.y(), p1.z()); 
     glVertex3d(p2.x(), p2.y(), p2.z()); 
     glVertex3d(p3.x(), p3.y(), p3.z()); 

     ++cnt2; 
    } 

ответ

1

, как вы извлечь грани правильно и обеспечит Вам последовательную ориентацию фасетов вы считаете их из той же «стороны» поверхности. Например, рассмотрим сферу, встроенную в c2t3. Если вы рассматриваете только грани, использующие тетраэдр внутри сферы, то ваша функция будет делать то, что вы хотите. Но так как итерация по граням не гарантирует, что у вас не будет тетраэдра вне сферы, ваша функция будет отображать неправильно ориентированные грани. Простым решением является использование функции CGAL::output_surface_facets_to_polyhedron, чтобы сначала создать многогранник из c2t3 и использовать его для отображения. В качестве альтернативы вы также можете посмотреть на реализацию, которая не так сложна и имитирует то, что сделано.

+0

Большое спасибо за ваше объяснение. В качестве временного решения я выполнил следующее: я проверяю, что для заданной вершины v и «пред-нормального» n (вычисленной по перекрестному произведению в фасете f, которой принадлежит вершина v) точка v + eps * n находится в отрицательный диапазон триангулированной неявной функции «sphere_function», и если да, то n заменяется на -n. В особых случаях, которые я использовал для тестирования, это сработало, но предлагаемое вами решение, безусловно, безопаснее и лучше. Я просто немного неохотно меняю код с пути C2t3 на путь Polyhedron_3. –