如果我有一个三角形网格,如何计算每个给定顶点的法线?
我了解如何找到单个三角形的法线。如果我有共享顶点的三角形,我可以通过找到每个三角形各自的法线,对其进行归一化,将其添加到总数中,然后对最终结果进行归一化来部分找到答案。但是,这显然没有考虑到每个法线的适当权重(例如,许多小三角形在与大三角形链接时会偏离答案)。
我认为一个好的方法应该是使用加权平均值,但使用角度而不是面积作为权重。在我看来,这是一个更好的答案,因为您正在计算的法线是“局部”特征,因此您并不真正关心贡献的三角形有多大……您需要一种“局部”度量贡献和指定顶点上三角形两条边之间的角度就是这样的局部度量。
使用这种方法很多小(薄)三角形不会给你一个不平衡的答案。
如果您通过使用三角形与以顶点为中心的小球体的交点来定位计算,则使用角度与使用面积加权平均值相同。
加权平均似乎是最好的方法。
但请注意,根据您的应用程序,尖角仍然会给您带来问题。在这种情况下,您可以通过对叉积小于某个阈值(即更接近平行)的表面法线求平均来计算多个顶点法线。
使用SJ Kim 等人的顶点的多个法向量搜索偏移三角形网格。al.,有关此方法的更多详细信息。
这篇博客文章概述了三种不同的方法,并给出了一个直观的例子,说明为什么标准和简单的方法(在顶点处连接的所有面的法线的面积加权平均值)有时可能会产生糟糕的结果。
您可以通过将法线乘以三角形的面积来赋予大三角形更多的权重。
查看这篇论文:用于三角化 2 流形的离散微分几何算子。
特别是,“离散平均曲率法线算子”(第 3.5 节,等式 7)给出了一个独立于曲面细分的稳健法线,这与此处另一个答案引用的博客文章中的方法不同。
显然,您需要使用加权平均值来获得正确的法线,但是使用三角形区域不会给您所需的东西,因为每个三角形的面积与三角形法线代表给定顶点的权重百分比没有关系。
如果你基于进入顶点的两条边之间的角度,你应该得到每个进入顶点的三角形的正确权重。如果您可以以某种方式将其转换为 2d 可能会很方便,这样您就可以摆脱 360 度的权重基础,但很可能只是使用角度本身作为您的权重乘数,以便在 3d 空间中计算它,然后将所有以这种方式产生的法线和归一化最终结果应该会产生正确的答案。