我有一个3D网格,它代表一个有一些粗糙边界的表面,我想要平滑:
我使用半边数据结构来存储几何体,因此我可以轻松地迭代边界边,顶点和面。我也可以很容易地确定一对给定的边缘是否是使用点和叉积的凸/凹。
什么是平滑边缘的最佳方法,因此它们形成连续的曲线,而不是图片中看到的清晰图案?
答案 0 :(得分:4)
计算两个相邻面之间的角度
我将其称为ada
作为abs delta角度。如果它大于阈值则表示该点是边缘。您可以将其计算为所有边线之间所有角度的max
。在 2D 中,它看起来像这样:
在 3D 网格物体中,每点有超过2行,因此您必须检查所有组合并选择最大的组合
ada=max(abs(acos(n(i).n(j)))
其中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)
这可以重复应用
蓝色和红色圆点是原始点,绿色圆点是平滑点