私は最近、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;
}
}
実際の入出力を表示します。また、 'TriMesh'オブジェクトは' mesh'への変更が 'triangleIt'を無効にしないことを保証しますか? – paddy
はい。 'garbage_collection()'メソッドを使用しない場合は、すべてのイテレータがどの操作の後でも有効である必要があります。 入出力に関して、 'split'メソッドは新しく作成されたインデックスを持つ有効なVertexHandleを返します。一方、' vf_begin'はこれらの奇妙なインデックスを持つ顔を指すイテレータを返します。 (87、87、-1)と(12,12、-1)は、実際に返される例です。 これが入力と出力のどちらを意味するのか分かりません。 – murf
あなたのコードを(ほとんどの場合)コピーし、サンプルメッシュを供給しましたが、あなたのバグを再現できませんでした(つまり、すべてのハンドルが無効になっていました)。新しい顔の頂点ハンドルIDを出力するために使用されたコードを表示できますか? – jsb