合并相邻和共面的面

时间:2019-03-14 12:26:44

标签: 3d geometry cgal

我正在尝试通过合并3D OBJ文件中的相邻和共面的面来简化3D网格,OBJ文件由网格的三角剖分组成,我想减少边的数量而不损失网格的质量。有什么算法可以帮助我解决这个问题吗?

输入:Input 预期产量: Expected output

2 个答案:

答案 0 :(得分:1)

如果您想开箱即用,并且点完全共面,则可以构建Nef_polyhedron并将其转回表面网格中。 This example在中间不执行布尔运算即可。

如果您想要更有效的方法,或者您的点不一定完全共面,则必须遍历网格的边缘以识别多余的边缘。然后,您可以定义通过这些边连接的面的连接组件。对于同一连接的组件中的所有面,您必须首先确定该组件是否简单连接(即拓扑上是磁盘)。如果不是,那么您将需要添加一些额外的边缘以将孔连接到该面的外部边界(这就是为什么迭代调用join_face()通常不会起作用的原因)。如果只连接了该组件,则说明可以去除所有边缘。您可以通过从组件的边界边缘开始并围绕目标循环来在该面的边界上行走,以定义
边界边缘的循环。

答案 1 :(得分:0)

每个边由2个点定义,并且由于所有面都是三角形,因此每个边对于2个相邻的三角形是公用的。如果考虑到这两个三角形,则总共有4个点:边缘的两个末端(这两个三角形共同)和两个三角形的两个末端。

您可以做的是遍历所有边缘,并检查4个点是否共面。如果是这样,则边缘无用,您可以将其删除。

要检查4个点是否共面:

  • 取4个点中的3个点并计算由这3个点定义的平面方程(平面方程的形式为ax + by + cz + d = 0)。

    < / li>
  • 检查第四个点是否满足平面方程。