Answers:
当我需要估计皮肤着色器的网格曲率时,最终确定的算法是:
首先,我为网格中的每个边计算了标量曲率。如果边缘的位置为且法线为,则我估计其曲率为:
这将计算沿边缘投影的法线差异,作为边缘长度的一部分。(有关我如何提出此公式的信息,请参见下文。)
然后,对于每个顶点,我查看了所有与其接触的边的曲率。在我的情况下,我只想对“平均曲率”进行标量估计,因此我最终采用了每个顶点处所有边缘曲率的绝对值的几何平均值。对于您的情况,您可能会找到最小和最大曲率,然后将这些边作为主曲率方向(也许使用顶点法线对其进行正交化)。有点粗糙,但是对于您想做的事情可能会给您足够好的结果。
该公式的动机是研究将2D应用于圆后会发生什么:
假设您有一个半径为的圆(因此其曲率是),并且在圆上有两个点,其法线为。这些点相对于圆心的位置将为和,这是因为圆或球体的法线始终始终直接指向圆心。n 1,n 2 p 1 = r n 1 p 2 = r n 2
因此,可以将半径恢复为或。但是通常,顶点位置不会相对于圆心。我们可以通过减去两个来解决此问题: | p 2 | / | n 2 | p 2 − p 1
结果仅适用于圆和球。但是,我们可以对其进行扩展以使其更加“宽容”,并在任意3D网格上使用它,并且看起来效果还不错。通过首先将向量投影到边缘的方向上,可以使公式更加“宽容” 。这允许这两个向量不完全平行(就像在圆形情况下一样)。我们将投影掉所有不并行的组件。我们可以使用标准化的边缘向量进行点缀: p 2 − p 1 曲率
等等,这个答案的顶部出现了公式。顺便说一句,使用带符号的投影(点积)的一个不错的好处是该公式可以给出带符号的曲率:凸面为正,凹面为负。
我可以想象使用但尚未尝试的另一种方法是估计每个顶点处表面的第二种基本形式。可以通过在顶点处设置切线基础,然后将所有相邻顶点转换为该切线空间,并使用最小二乘法找到最合适的2FF矩阵来完成此操作。然后,主曲率方向将是该矩阵的特征向量。这似乎很有趣,因为它可以让您找到相邻顶点“隐含”的曲率方向,而没有任何边沿明确指向这些方向,但是另一方面,它需要更多的代码,更多的计算,并且可能在数值上更不可靠。
采用这种方法的论文是Rusinkiewicz,“估计三角形网格上的曲率及其导数”。它通过估算每个三角形的最佳拟合2FF矩阵,然后对每个顶点的矩阵求平均来工作(类似于计算平滑法线的方式)。
只是为出色的@NathanReed答案添加了另一种方法,您可以使用均值和高斯曲率,这可以通过离散的Laplace-Beltrami获得。
高斯曲率是:
经过所有这些痛苦之后,主要的离散曲率由下式给出:
如果您对此主题感兴趣(并添加一些对这篇文章的参考),那么最好的阅读方法是: 三角2-歧管的离散微分几何算子 [Meyer等。2003]。
对于图像,我感谢我的前教授尼洛伊·米特拉(Niloy Mitra)。