c++ - OpenMesh 面分割

标签 c++ split mesh face openmesh

我最近开始在一个需要细化网格的项目中使用 OpenMesh。我需要使用面 split(FaceHandle _fh, Point _p) 操作在三角形的质心处插入一个顶点。 但是,当我使用此方法并尝试使用 VertexFaceIterator 获取新创建的顶点的面时,我总是会得到顶点索引为 (87, 87, -1) 或 (12, 12, -1) 的无效面。似乎 OpenMesh 在 split 后没有更新网格拓扑。

我的代码看起来像这样。 faceStartIt 为我提供了这些奇怪的索引。

    typedef OpenMesh::TriMesh_ArrayKernelT<> TriMesh;

    TriMesh::FaceIter triangleIt = mesh.faces_begin();

    for( ; triangleIt != mesh.faces_end(); )
    {            
        TriMesh::Point centroid = mesh.calc_face_centroid( *triangleIt );

        if( hasToSplit( centroid ) )
        {               
            TriMesh::VertexHandle centroidHandle = mesh.split( *triangleIt, centroid ); 
            TriMesh::VertexFaceIter faceStartIt = mesh.vf_begin( centroidHandle );
            TriMesh::VertexFaceIter faceEndIt = mesh.vf_end( centroidHandle );
            TriMesh::VertexFaceIter faceIt = faceStartIt; //faceIt++;

            for( ; faceIt != faceEndIt; ++faceIt )
            {                   
                // Do something for each face
            } 
        }
        else
        {
            ++triangleIt;
        }
    }

最佳答案

我发现了我遇到的问题。 split 方法工作正常,我做错的是在 //Do something for each face 注释中。对于每张脸,我都在进行边缘翻转操作,但引用丢失了,因为翻转会导致后来评估的脸发生变化。解决方案是在一次迭代中,在分割一个面之后,将我想要翻转的每条边插入 std::set 以保证它们是唯一的。然后在另一次迭代中在标记的边缘上进行实际翻转。

关于c++ - OpenMesh 面分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41008298/

相关文章:

c++ - 使用 MongoDB C++ 驱动程序在 BSON 文档中查找

python - 将 3D 场景渲染到图像文件的最简单方法

python - opencv python具有坐标的三角形网格

java - 当一侧没有文本时,字符串分割不起作用

string - VBA 中的子字符串

algorithm - 3 维的 Delaunay 网格三角剖分算法的输出应该是什么?

c++ - 迭代器两个**的含义

c++ - 设置授予成员常量访问权限的成员函数

c++ - boost::序列化前后 Hook

java - 拆分命令不适用于扫描仪