Я использую пакет из CGAL, 3D Surface Mesh Generation.Нормали, вероятно, не последовательны после создания CGAL 3D Surface Mesh
http://doc.cgal.org/latest/Surface_mesher/index.html#Chapter_3D_Surface_Mesh_Generation
Я начал из примера кода:
и теперь пытались извлечь соответствующие грани (= треугольники), чтобы отобразить с переменной 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;
}
Большое спасибо за ваше объяснение. В качестве временного решения я выполнил следующее: я проверяю, что для заданной вершины v и «пред-нормального» n (вычисленной по перекрестному произведению в фасете f, которой принадлежит вершина v) точка v + eps * n находится в отрицательный диапазон триангулированной неявной функции «sphere_function», и если да, то n заменяется на -n. В особых случаях, которые я использовал для тестирования, это сработало, но предлагаемое вами решение, безусловно, безопаснее и лучше. Я просто немного неохотно меняю код с пути C2t3 на путь Polyhedron_3. –