1

私は最近、メッシュを改良する必要があるプロジェクトで OpenMesh を使い始めました。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;
        }
    }
4

2 に答える 2

0

代わりにできるかもしれません

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

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

garbage_collection()も問題ありませんが、係数が低いです。 を使用するface_sbegin()と、イテレータは無効な面をスキップします。

于 2021-01-14T03:38:40.990 に答える