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

标签 c++ algorithm 3d mesh smoothing

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

Mesh Boundary 1 Mesh boundary 2

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

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

最佳答案

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

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

    ada 2D

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

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

    其中 n(i),n(j) 是相邻面的法 vector ,其中 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

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

关于c++ - 平滑开放 3D 网格边缘的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23923153/

相关文章:

object - 在哪里可以找到 .od 格式的模型?

javascript - 相互连接的曲线

c++ - 使用索引几何处理法线

c++ - 将一个函数向上转换为另一个基类参数

c++ - 使用模板实现多态

C++:从容器中提取N个最高元素

c - 反转输入字符串

math - 回旋曲线的参数化函数

c++ - 使用 AWE 分配内存

c++ - 根据优化级别调试 hello world 崩溃的构建