合并相邻和共面的面

问题描述 投票:0回答:2

我试图通过合并3D OBJ文件中的相邻和共面面来简化3D网格,OBJ文件包含网格的三角剖分,我想减少边缘的数量而不会丢失网格的质量。有没有算法可以帮我解决这个问题?

输入:Input预期产出:Expected output

3d geometry cgal
2个回答
2
投票

如果你想要开箱即用并且你的点完全共面,那么你可以建立一个Nef_polyhedron并将其转回到表面网格中。没有中间布尔运算的This example会起作用。

如果您想要更高效的东西,或者您的点不一定是完全共面的,则必须迭代网格的边缘以识别冗余边缘。然后,您可以定义由这些边连接的面的连通分量。对于同一个连接组件中的所有面,您必须首先确定组件是否只是简单连接(即拓扑上是一个磁盘)。如果没有,那么你需要添加一些额外的边来将孔连接到那个面的外边界(这就是为什么迭代调用join_face()一般不起作用的原因)。如果组件只是简单连接,那么您就知道可以删除所有边缘。您可以通过从组件的边界边缘开始并在目标周围循环来在该面的边界上行走,以便定义 边界边界。


0
投票

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

你可以做的是遍历所有边缘并检查4个点是否是平面的。如果它们是,边缘是无用的,你可以删除它。

要检查4点是否共面:

  • 在4个中取3个点并计算由这3个点定义的平面的方程(平面的方程式为ax + by + cz + d = 0)。
  • 检查第4点是否满足平面方程。
© www.soinside.com 2019 - 2024. All rights reserved.