2016-12-07 17 views
1

私は最近、OpenMeshをメッシュを改良する必要があるプロジェクトで使用し始めました。三角形の重心に頂点を挿入するには、面split(FaceHandle _fh, Point _p)の操作を使用する必要があります。 しかし、私がこのメソッドを使って、VertexFaceIteratorを使って新しく作成した頂点の面をつかむと、常に(87,87、-1)や(12,12、-1)などの頂点インデックスを持つ無効な面が得られます。 OpenMeshは分割後にメッシュのトポロジーを更新していないようです。OpenMesh Face 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; 
     } 
    } 
+0

実際の入出力を表示します。また、 'TriMesh'オブジェクトは' mesh'への変更が 'triangleIt'を無効にしないことを保証しますか? – paddy

+0

はい。 'garbage_collection()'メソッドを使用しない場合は、すべてのイテレータがどの操作の後でも有効である必要があります。 入出力に関して、 'split'メソッドは新しく作成されたインデックスを持つ有効なVertexHandleを返します。一方、' vf_begin'はこれらの奇妙なインデックスを持つ顔を指すイテレータを返します。 (87、87、-1)と(12,12、-1)は、実際に返される例です。 これが入力と出力のどちらを意味するのか分かりません。 – murf

+0

あなたのコードを(ほとんどの場合)コピーし、サンプルメッシュを供給しましたが、あなたのバグを再現できませんでした(つまり、すべてのハンドルが無効になっていました)。新しい顔の頂点ハンドルIDを出力するために使用されたコードを表示できますか? – jsb

答えて

1

私が持っていた問題を理解しました。 splitメソッドは正常に動作しますが、私が間違っていたのは// Do something for each face解説の中でした。それぞれの顔に対して、私はエッジフリップ操作を行っていましたが、フリップが後で顔が評価されるために参照が失われていました。解決策は、1つの反復で、顔を分割した後に、反転したい各エッジをstd::setに挿入して、それらが一意であることを保証します。次に、別の反復で、実際のフリップをマークされたエッジで行います。