使用边缘检测计算三角形几何中的顶点法线

时间:2014-06-03 23:14:56

标签: c++ algorithm geometry vertex normals

Most efficient algorithm to calculate vertex normals from set of triangles for Gouraud shading没有重复,因为未讨论边缘检测问题。

如何计算三角几何中每个顶点的法线,在Gouraud着色器中使用以获得漂亮的显示效果,但是要跟踪边缘?有没有一个免费的,快速的,高性能的标准解决方案?

我被分配了上述任务来修复产生可见人工制品的例程。法线应该是输入数据到一个简单的Gouraud着色器,以“平滑”在相干面上显示的几何体。例程还应该能够找到边缘,以便稍后可以被软件的其他部分使用,而不是“平滑”。

从不包含任何法线信息的.stl文件中读取数据,因此必须使用三角形坐标计算所有面法线。

这是几何体在没有插值的情况下的外观:

enter image description here

这就是插值算法到目前为止所做的:

enter image description here

圆形平原看起来相当不错,但是在平面旁边找到的边缘不足以触发边缘检测算法的地方,插值严重失败,但也不够弱到不可见。结果是错误的法线在整个三角形中传播。

我想知道是否有一个标准的解决方案,因为在处理这种类型的几何时,这个问题应该经常发生。即使没有,你们中是否有人知道这项任务的常见问题以及如何避免它们获得一些不错的结果?

非常感谢任何帮助!

编辑:关于算法: 边缘检测不仅仅是三角形法线。请考虑以下示例(问题在3D中基本相同):

Triangle normal angle edge detection

所有顶点共享相同的角度,即30°。 (角度不完全正确,但是你得到了想法......)但是,只有外部的两个应该被识别为边缘,因此必须有另一个与此问题相关的度量。到目前为止,我已经尝试了三角形的

  1. 外接圆半径
  2. 最长边
  3. GTS triangle quality measure
  4. 可以修改两个三角形被认为共享边缘的“最小角度”。最长的边缘方法看起来最有希望(虽然远非完美),但我认为还有一些我忽略的方法......

1 个答案:

答案 0 :(得分:0)

有一份关于此问题的公开出版物来自Cal-Tech,其形式为技术报告,名为“Discrete Differential-Geometry Operators for Triangulated 2-Manifolds”。

那里提出的算法提出

  

统一派生,确保准确性和严格的误差范围,从而产生简单易用的公式。

在报告中,算法用于曲率计算,但曲率计算涉及精确的平均曲率法线计算。此信息使您可以合并特征边缘检测 - 作者已将其用于此目的,以便在嘈杂网格上进行特征检测。此外,平均曲率法线可以用于着色。