CGAL 3D曲面网格生成后,法线可能不一致



我使用CGAL的软件包,3D曲面网格生成。

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表面网格生成及其数据结构,给我一些指导吗?(我还尝试了下面代码的几个明显的替代方案,但都没有正确运行)。

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;
    }

提取facet的方法是正确的,并且将为您提供facet的一致方向,即您从曲面的同一侧考虑它们。例如,考虑一个嵌入c2t3中的球体。如果你只考虑在球体内使用四面体的小平面,那么你的函数会做你想要的。但是,由于在facet上的迭代不能保证球体外不会有四面体,因此函数将显示方向不正确的facet。一个简单的解决方案是使用函数CGAL::output_surface_facets_to_polyhedron首先从c2t3创建一个多面体,并将其用于显示。或者,您也可以查看不那么复杂的实现,并模仿所做的操作。

相关内容

  • 没有找到相关文章

最新更新