首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenMesh面分割

OpenMesh面分割
EN

Stack Overflow用户
提问于 2016-12-07 10:12:35
回答 2查看 1.2K关注 0票数 1

我最近开始在一个项目中使用OpenMesh,在这个项目中,我必须优化网格。我需要使用face split(FaceHandle _fh, Point _p)操作在三角形的质心处插入一个顶点。但是,当我使用这种方法并尝试使用VertexFaceIterator获取新创建的顶点的面时,我总是得到带有顶点索引的无效面,例如(87,87,-1)或(12,12,-1)。似乎OpenMesh在分割后没有更新网格拓扑。

我的代码看起来像这样。faceStartIt为我提供了这些奇怪的索引。

代码语言:javascript
复制
    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;
        }
    }
EN

回答 2

Stack Overflow用户

发布于 2016-12-07 20:46:22

我找出了我遇到的问题。split方法运行得很好,我做错的地方在// Do something for each face注释中。对于每个面,我都在做边翻转操作,但引用正在丢失,因为翻转会导致后面要评估的面发生变化。解决方案是在一次迭代中,在分割面之后,在std::set中插入我想要翻转的每条边,以确保它们是唯一的。然后在另一次迭代中,在标记的边缘上进行实际翻转。

票数 1
EN

Stack Overflow用户

发布于 2021-01-14 11:38:41

也许你可以

代码语言:javascript
复制
TriMesh::FaceIter triangleIt = mesh.faces_begin();

使用

代码语言:javascript
复制
TriMesh::FaceIter triangleIt = mesh.faces_sbegin();

garbage_collection()也可以,但是它的coefficient.If很低你使用face_sbegin(),迭代器将跳过无效的faces。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41008298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档