我有一个 3D 网格,它表示具有一些我想要平滑的粗糙边界的表面:
我正在使用半边数据结构来存储几何图形,因此我可以轻松地遍历边界边、顶点和面。我还可以使用点积和叉积很容易地确定给定的一对边是否为凸/凹。
平滑边缘的最佳方法是什么,以便它们形成连续的曲线,而不是图片中看到的尖锐图案?
最佳答案
计算两个相邻面之间的角度
我将其称为
ada
作为 abs delta angle。如果它大于阈值,则表示该点是边缘。您可以将其计算为所有边缘线之间的所有角度的max
。在 2D 中它看起来像这样:在 3D 网格中,每个点有超过 2 条线,因此您必须检查所有组合并选择最大的一个
ada=max(abs(acos(n(i).n(j)))
其中
n(i),n(j)
是相邻面的法 vector ,其中i != j
识别有问题的区域
所以找到
ada > threshold
的点并创建这些点的列表过滤此列表
如果这个点与任何其他点(
distance>threshold
)相距太远,则将其从列表中移除以保留几何形状平滑点
您必须调整此步骤以满足您的需求,我会这样做:
在列表中找到一组靠得很近的点,然后对它们应用一些平均几何或数字,例如:
pnt(i)=0.5*pnt(i)+0.25*pnt(i-1)+0.25*pnt(i+1)
这可以重复应用
蓝点和红点是原始点,绿点是平滑点
关于c++ - 平滑开放 3D 网格边缘的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23923153/