Closed. This question needs to be more focused。它当前不接受答案。












想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。

在10个月前关闭。



Improve this question




我有一个obj文件网格,我想通过OpenMesh从中提取连接的组件。我可以找到边界顶点和边,但是有没有办法在Openmesh中将网格直接拆分为连接的组件?

最佳答案

OpenMesh不提供此功能(库的目的只是提供网格数据结构)。 OpenFlipper是建立在OpenMesh之上的网格处理库,是更合适的候选者,但也不提供此功能。但是,您可以在MeshTools/MeshInfoT.cc的代码库中找到一个componentCount函数,该函数计算已连接组件的数量(它只是在顶点图上进行深度优先搜索)。

基于此功能,您应该能够编写代码将网格划分为其连接的组件:

  • 为每个顶点添加一个连接的组件编号属性(例如,初始化为-1,这意味着尚未访问该顶点)。
  • 使用深度优先搜索(或宽度优先搜索..)遍历网格顶点,并为每个顶点设置此组件编号:
  • 找到未访问的顶点时,增加当前连接的组件编号并创建一个新的连接组件。找到的顶点用作该组件的种子顶点。
  • 设置从连接的组件的种子顶点遍历的所有顶点的组件编号。
  • 遍历完成后,已知连接的组件总数,并且对于每个顶点,其组件编号也已知。根据该信息,可以建立连接的零部件网格(属于零部件的所有顶点都是已知的,并且可以使用顶点的半边引用来识别面)。对于每个连接的组件:
  • 为此连接的组件创建一个新的网格。
  • 添加来自相同连接组件的所有顶点。创建一个从初始网格中的顶点控点到新网格中与所连接组件相对应的顶点控点的映射。
  • 查找组件的所有面:要实现此目的,一种简单的方法可以是遍历组件的所有顶点,并为每个顶点遍历其所属的所有面。对于每个新遍历的面,在新的组件网格中创建一个面,以引用新的顶点控制柄(使用从旧到新的顶点控制柄的映射)创建一个面。
  • 08-28 17:45
    查看更多