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

我的代码看起来像这样。 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/

10-11 02:06