2016-12-07 92 views
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; 
     } 
    } 
+0

顯示實際的輸入和輸出。此外,'TriMesh'對象確保您對'mesh'所做的更改不會使'triangleIt'無效? – paddy

+0

是的。如果你不使用'garbage_collection()'方法,那麼所有迭代器在任何操作之後都應該是有效的。 至於輸入和輸出,'split'方法返回一個有效的VertexHandle和一個新創建的索引,而'vf_begin'返回一個指向具有這些奇怪索引的面的迭代器。 (87,87,-1)和(12,12,-1)是它返回的實際例子。 不知道這是你輸入輸出的意思。 – murf

+0

我複製了你的代碼(大部分),併爲它提供了一個網格示例,但我無法重現你的bug(即所有的手柄都是vaild)。你可以顯示你的代碼用於輸出新面的頂點句柄ID嗎? – jsb

回答

1

我想出了我遇到的問題。 split方法工作正常,我做錯了什麼是// Do something for each face評論。對於我正在進行邊緣翻轉操作的每張臉,但由於翻轉會導致正在評估的後面的臉部變化,因此參考文件丟失。解決方法是在一次迭代中,在分割一張臉後,插入我想要翻轉的每個邊,以確保它們是唯一的。然後在另一次迭代中做標記邊上的實際翻轉。