【问题标题】:Algorithm for smoothing edges of an open 3D mesh平滑开放 3D 网格边缘的算法
【发布时间】:2014-05-28 22:52:05
【问题描述】:

我有一个 3D 网格,它代表一个带有一些粗糙边界的表面,我想对其进行平滑处理:

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

平滑边缘的最佳方法是什么,使它们形成一条连续的曲线,而不是图片中看到的锐利图案?

【问题讨论】:

  • 应该只是多边形网格吗?
  • 是三角网,是的。

标签: c++ algorithm 3d mesh smoothing


【解决方案1】:
  1. 计算两个相邻面之间的角度

    我称它为ada 为绝对增量角。如果它大于阈值,则表示该点是边缘。您可以将其计算为所有边缘线之间所有角度的max。在 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)
    

    这可以重复应用

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

【讨论】:

  • 我实际上已经跳过了第一步。我只是遍历所有边界顶点的有序集合并应用您在步骤 4 中提供的公式(使用距离阈值)。结果足以满足我的需求。通过更改迭代次数,我可以使边缘或多或少平滑。以下是上述模型的结果:oi61.tinypic.com/k0vb5.jpg 谢谢。
  • @Marian 您可以使用公式中的权重,但总和必须为 1.0(您也可以添加更多点)...我将它用于复杂的形状,所以我需要区分形状边缘和采样错误,这就是我需要 ada 值的原因......如果你在整个形状上有这个错误,那么就没有必要计算它(但你必须记住,网格的总面积/体积可以改变几乎没有这种平均)...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多