Math 如何基于共享一个顶点的多个三角形计算法向量?

Math 如何基于共享一个顶点的多个三角形计算法向量?,math,opengl,3d,mesh,Math,Opengl,3d,Mesh,如果我有一个三角形网格,如何计算每个给定顶点的法线 我知道如何找到一个三角形的法线。如果我有共享顶点的三角形,我可以通过找到每个三角形各自的法线,对其进行规格化,将其添加到总数中,然后对最终结果进行规格化,部分地找到答案。但是,这显然没有考虑每个法线的适当权重(例如,当与大三角形链接时,许多小三角形可能会偏离答案)。通过将法线乘以三角形的面积,可以赋予大三角形更多权重。加权平均似乎是最好的方法 但请注意,根据您的应用程序,尖角仍然可能给您带来问题。在这种情况下,可以通过平均其叉积小于某个阈值(即

如果我有一个三角形网格,如何计算每个给定顶点的法线


我知道如何找到一个三角形的法线。如果我有共享顶点的三角形,我可以通过找到每个三角形各自的法线,对其进行规格化,将其添加到总数中,然后对最终结果进行规格化,部分地找到答案。但是,这显然没有考虑每个法线的适当权重(例如,当与大三角形链接时,许多小三角形可能会偏离答案)。

通过将法线乘以三角形的面积,可以赋予大三角形更多权重。

加权平均似乎是最好的方法

但请注意,根据您的应用程序,尖角仍然可能给您带来问题。在这种情况下,可以通过平均其叉积小于某个阈值(即更接近平行)的曲面法线来计算多个顶点法线


SJ Kim等人使用顶点的多个法向量搜索偏移三角形网格,了解有关此方法的更多详细信息。

我认为一个好方法应该使用加权平均,但使用角度而不是面积作为权重。在我看来,这是一个更好的答案,因为您正在计算的正常值是一个“本地”特性,所以您并不真正关心三角形有多大。。。您需要一种“局部”贡献度量,指定顶点上三角形两侧之间的角度就是这样一种局部度量

使用这种方法,许多小(薄)三角形不会给出不平衡的答案


如果使用三角形与以顶点为中心的小球的交点来定位计算,则使用角度与使用面积加权平均值相同。

显然,您需要使用加权平均值来获得正确的法线,但使用三角形区域并不能满足您的需要,因为每个三角形的面积与三角形法线表示的给定顶点的权重百分比无关

如果以进入顶点的两条边之间的角度为基础,则应获得进入顶点的每个三角形的正确权重。如果你能以某种方式将其转换为2d,这样你的体重就可以从360度的基础上恢复,但很可能只是使用角度本身作为权重乘数在3d空间中进行计算,然后将以这种方式生成的所有法线相加,并对最终结果进行规格化,就应该得到正确的答案。

概述了三种不同的方法,并给出了一个直观的示例,说明为什么使用标准和简单的方法(在顶点连接的所有面法线的面积加权平均值)有时可能会给出很差的结果。

查看本文:


特别是“离散平均曲率法向算子”(第3.5节,方程7)提供了一个独立于细分的稳健法线,这与另一篇文章中引用的方法不同。

你不必规范化中间结果;如果你只规范化最终结果,你就很好。Jasper-但请记住,许多典型的矩阵计算都要求你在e继续。如果“直到结束”都没有正常化,请小心继续。实际上,这种加权是叉积的一部分。叉积向量的长度与三角形面积成比例。因此,只需添加未规范化的法线,并仅规范化结果的和。请注意,上面的运算符存在一个问题,即它不适用于零(或接近零)平均曲率区域(例如,平面或局部鞍座)。