【发布时间】:2019-03-14 12:26:44
【问题描述】:
我正在尝试通过合并 3D OBJ 文件中的相邻面和共面面来简化 3D 网格,OBJ 文件包含网格的三角剖分,我想减少边的数量而不损失网格的质量。有什么算法可以帮助我解决这个问题吗?
【问题讨论】:
-
您遇到了哪些问题?只需检查一个面的邻居是否具有相等的法线并合并。
-
您可以使用CGAL::Euler::join_face() 合并您的共面。
我正在尝试通过合并 3D OBJ 文件中的相邻面和共面面来简化 3D 网格,OBJ 文件包含网格的三角剖分,我想减少边的数量而不损失网格的质量。有什么算法可以帮助我解决这个问题吗?
【问题讨论】:
如果您想让某些东西开箱即用并且您的点完全共面,那么您可以构建一个 Nef_polyhedron 并将其转储回表面网格中。 This example 中间没有布尔运算将起作用。
如果您想要更高效的东西,或者如果您的点不一定完全共面,则必须遍历网格的边缘以识别冗余边缘。然后,您可以定义由这些边连接的面的连接组件。对于同一个连接组件中的所有面,您必须首先确定该组件是否是简单连接的(即拓扑上的磁盘)。如果不是,那么您需要添加一些额外的边来将孔连接到该面的外边界(这就是为什么迭代调用join_face() 通常不会起作用)。如果组件是简单连接的,那么您知道您可以删除所有边缘。您可以通过从组件的边界边缘开始并围绕目标循环来在该面的边界上行走,以定义
边界边缘的循环。
【讨论】:
每条边由 2 个点定义,并且因为所有面都是三角形,所以每条边对 2 个相邻的三角形是公共的。如果考虑这 2 个三角形,则总共有 4 个点:边缘的两个末端(两个三角形共有)和 2 个三角形的两个末端。
您可以做的是遍历所有边缘并检查 4 个点是否共面。如果是,则边缘无用,您可以将其移除。
检查 4 个点是否共面:
在 4 个点中取 3 个点,计算由这 3 个点定义的平面方程(平面方程的形式为 ax + by + cz + d = 0)。
检查第4点是否满足平面方程。
【讨论】: