【问题标题】:OpenMesh Face SplitOpenMesh 面分割
【发布时间】:2016-12-07 02:12:35
【问题描述】:

我最近开始在一个需要细化网格的项目中使用 OpenMesh。我需要使用面split(FaceHandle _fh, Point _p) 操作在三角形的质心处插入一个顶点。 但是当我使用这种方法并尝试使用 VertexFaceIterator 抓取新创建的顶点的面时,我总是会得到带有顶点索引的无效面,例如 (87, 87, -1) 或 (12, 12, -1)。似乎 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 无效?
  • 是的。如果您不使用garbage_collection() 方法,则所有迭代器在任何操作后都应该是有效的。至于输入和输出,split 方法返回一个带有新创建索引的有效 VertexHandle,而vf_begin 返回一个迭代器,指向具有这些奇怪索引的面。 (87, 87, -1) 和 (12, 12, -1) 是它返回的实际示例。不知道你说的输入输出是不是这个意思。
  • 我复制了你的代码(大部分)并给它一个示例网格,但我无法重现你的错误(即所有句柄都是有效的)。您能否展示用于输出新面的顶点句柄 ID 的代码?

标签: c++ split mesh face openmesh


【解决方案1】:

我发现了我遇到的问题。 split 方法工作正常,我做错的是在 // Do something for each face 评论中。对于每个面,我都在进行边缘翻转操作,但是由于翻转会导致后来评估的面发生变化,所以参考丢失了。解决方案是在一次迭代中,在分割一个面之后,将我想要翻转的每条边插入到 std::set 中,以确保它们是唯一的。然后在另一次迭代中对标记的边缘进行实际翻转。

【讨论】:

    【解决方案2】:

    也许你可以代替

    TriMesh::FaceIter triangleIt = mesh.faces_begin();
    

    TriMesh::FaceIter triangleIt = mesh.faces_sbegin();
    

    garbage_collection()也可以,但是系数低。如果使用face_sbegin(),迭代器会跳过无效的人脸。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多