2016-12-07 63 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评论。对于我正在进行边缘翻转操作的每张脸,但由于翻转会导致正在评估的后面的脸部变化,因此参考文件丢失。解决方法是在一次迭代中,在分割一张脸后,插入我想要翻转的每个边,以确保它们是唯一的。然后在另一次迭代中做标记边上的实际翻转。