平滑开放3D网格边缘的算法

时间:2014-05-28 22:52:06

标签: c++ algorithm 3d mesh smoothing

我有一个3D网格,它代表一个有一些粗糙边界的表面,我想要平滑:

Mesh Boundary 1 Mesh boundary 2

我使用半边数据结构来存储几何体,因此我可以轻松地迭代边界边,顶点和面。我也可以很容易地确定一对给定的边缘是否是使用点和叉积的凸/凹。

什么是平滑边缘的最佳方法,因此它们形成连续的曲线,而不是图片中看到的清晰图案?

1 个答案:

答案 0 :(得分:4)

  1. 计算两个相邻面之间的角度

    我将其称为ada作为abs delta角度。如果它大于阈值则表示该点是边缘。您可以将其计算为所有边线之间所有角度的max。在 2D 中,它看起来像这样:

    ada 2D

    3D 网格物体中,每点有超过2行,因此您必须检查所有组合并选择最大的组合

    ada=max(abs(acos(n(i).n(j)))
    

    其中n(i),n(j)是相邻面的法线向量i != j

  2. 识别有问题的区域

    所以找到ada > threshold的点并创建这些点的列表

  3. 过滤此列表

    如果此点距离任何其他点(distance>threshold)太远,则将其从列表中删除以保留几何形状

  4. 平滑点

    你必须调整这一步以符合你的需要我会这样做:

    在列表中找到一组靠近的点并在它们上应用一些平均几何或数字,例如:

    pnt(i)=0.5*pnt(i)+0.25*pnt(i-1)+0.25*pnt(i+1)
    

    这可以重复应用

    smoothing

    蓝色和红色圆点是原始点,绿色圆点是平滑点