1
我最近開始在一個項目中使用OpenMesh,我必須對網格進行細化。我需要使用臉部split(FaceHandle _fh, Point _p)
操作在三角形的質心處插入一個頂點。 但是,當我使用這種方法並嘗試使用VertexFaceIterator抓取新創建的頂點的面時,我總是會獲得具有諸如(87,87,-1)或(12,12,-1)等頂點索引的無效面。看起來好像OpenMesh在分割之後沒有更新網格拓撲。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;
}
}
顯示實際的輸入和輸出。此外,'TriMesh'對象確保您對'mesh'所做的更改不會使'triangleIt'無效? – paddy
是的。如果你不使用'garbage_collection()'方法,那麼所有迭代器在任何操作之後都應該是有效的。 至於輸入和輸出,'split'方法返回一個有效的VertexHandle和一個新創建的索引,而'vf_begin'返回一個指向具有這些奇怪索引的面的迭代器。 (87,87,-1)和(12,12,-1)是它返回的實際例子。 不知道這是你輸入輸出的意思。 – murf
我複製了你的代碼(大部分),併爲它提供了一個網格示例,但我無法重現你的bug(即所有的手柄都是vaild)。你可以顯示你的代碼用於輸出新面的頂點句柄ID嗎? – jsb