OpenMesh Face Split

时间:2016-12-07 02:12:35

标签: c++ split mesh face openmesh

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

也许你可以代替

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

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

garbage_collection() 也可以,但系数较低。如果使用face_sbegin(),迭代器会跳过无效人脸。