我有一个 3D 网格,它代表一个具有一些粗糙边界的表面,我想对其进行平滑处理:
我使用半边数据结构来存储几何图形,因此我可以轻松地迭代边界边、顶点和面。我还可以使用点积和叉积轻松确定给定的一对边是否是凸/凹的。
平滑边缘的最佳方法是什么,使它们形成连续的曲线,而不是图片中看到的尖锐图案?
-
计算两个相邻面之间的角度
我称之为ada
作为绝对增量角。如果它大于阈值,则意味着该点是边缘。您可以将其计算为max
所有边缘线之间的所有角度。在2D它看起来像这样:
in 3D网格每个点有超过 2 条线,因此您必须检查所有组合并选择最大的一条
ada=max(abs(acos(n(i).n(j)))
where n(i),n(j)
是相邻面的法向量,其中i != j
-
识别有问题的区域
所以找到点ada > threshold
并创建这些点的列表
-
过滤此列表
如果该点距离任何其他点太远(distance>threshold
)然后将其从列表中删除以保留几何形状
-
平滑点
您必须调整此步骤以满足您的需求,我会这样做:
在列表中找到一组靠近的点,并对它们应用一些平均几何或数字,例如:
pnt(i)=0.5*pnt(i)+0.25*pnt(i-1)+0.25*pnt(i+1)
这可以重复应用
蓝色和红色点是原始点,绿色点是平滑点
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)