我有一个网格,在每个三角形周围的区域中,我想计算主曲率方向的估计值。我以前从未做过这种事情,而Wikipedia并没有太大帮助。您能否描述或指出一个可以帮助我计算该估计值的简单算法?

假设我知道所有顶点的位置和法线。

#1 楼

当我需要估计皮肤着色器的网格曲率时,最终确定的算法是:

首先,我为网格中的每个边计算了标量曲率。如果边缘的位置为$ p_1,p_2 $,法线为$ n_1,n_2 $,则我将其曲率估算为: cdot(p_2-p_1)} {| p_2-p_1 | ^ 2} $$

计算沿边缘投影的法线的差,即边缘长度的一部分。 (请参阅下文,了解如何得出此公式。)然后,对于每个顶点,我查看接触该顶点的所有边缘的曲率。在我的情况下,我只想对“平均曲率”进行标量估计,因此我最终采用了每个顶点处所有边缘曲率的绝对值的几何平均值。对于您的情况,您可能会找到最小和最大曲率,然后将这些边作为主曲率方向(也许使用顶点法线对其进行正交)。有点粗略,但可能会为您要做的事情提供足够好的结果。 :



假设您有一个半径为$ r $的圆(因此其曲率为$ 1 / r $),并且在该圆上有两个点,它们的半径分别为法线$ n_1,n_2 $。点的位置相对于圆心的位置将为$ p_1 = rn_1 $和$ p_2 = rn_2 $,这是由于圆或球体的法线始终总是直接指向圆心的特性。

因此,您可以将半径恢复为$ r = | p_1 |。 / | n_1 | $或$ | p_2 | / | n_2 | $。但是通常,顶点位置不会相对于圆心。我们可以通过减去两个来解决此问题:
$$ \ begin {aligned}
p_2-p_1&= rn_2-rn_1 \\
&= r(n_2-n_1)\\
r&= \ frac {| p_2-p_1 |} {| n_2-n_1 |} \\
\ text {曲线} = \ frac {1} {r}&= \ frac {| n_2- n_1 |} {| p_2-p_1 |}
\ end {aligned} $$

结果仅适用于圆和球。但是,我们可以对其进行扩展以使其更加“宽容”,并在任意3D网格上使用它,并且看起来效果还不错。我们可以通过将向量$ n_2-n_1 $投影到边沿的方向$ p_2-p_1 $上,使公式更加“宽容”。这允许这两个向量不完全平行(就像在圆形情况下一样)。我们将投影掉所有不平行的组件。我们可以通过使用标准化的边缘向量进行点缀来做到这一点: p_2-p_1)} {| p_2-p_1 |} \\
&= \ frac {(n_2-n_1)\ cdot(p_2-p_1)/ | p_2-p_1 |} {| p_2-p_1 |} \ \
&= \ frac {(n_2-n_1)\ cdot(p_2-p_1)} {| p_2-p_1 | ^ 2}
\ end {aligned} $$

等等,这个答案的顶部出现了公式。顺便说一句,使用带符号的投影(点积)的一个不错的好处是该公式可以给出带符号的曲率:凸表面为正,凹表面为负。我可以想象使用但尚未尝试的另一种方法是估计每个顶点处表面的第二种基本形式。这可以通过在顶点处设置切线基础,然后将所有相邻顶点转换为该切线空间,并使用最小二乘法来找到最合适的2FF矩阵来完成。然后,主曲率方向将是该矩阵的特征向量。这似乎很有趣,因为它可以让您找到相邻顶点“隐含”的曲率方向,而没有任何边沿明确指向这些方向,但是另一方面,它需要更多的代码,更多的计算,并且可能在数值上更不可靠。 >
采取这种方法的论文是Rusinkiewicz,“估计三角形网格上的曲率及其导数”。它的工作原理是估算每个三角形的最佳拟合2FF矩阵,然后平均每个顶点的矩阵(类似于计算平滑法线的方式)。

评论


$ \ begingroup $
仅供参考,如果这很重要,我在这里使用了您的答案blender.stackexchange.com/questions/146819/…,但使用围绕p1的角度添加了权重。不知道您是否觉得有价值?无论如何,请随时发表评论。谢谢。
$ \ endgroup $
–柠檬
19年8月5日在17:26

#2 楼

只是为出色的@NathanReed答案添加了另一种方法,您可以使用均值和高斯曲率,这可以通过离散的Laplace-Beltrami获得。

因此,假设您网格中$ v_i $的1环邻域看起来像这样

只是形成该环的三角形区域中的\\ frac {1} {3} $,而指示的$ v_j $是相邻顶点之一。

现在让我们在特定点调用$ f(v_i)$由网格定义的函数(必须是可微流形)。我知道的Laplace-Beltrami运算符最流行的离散化是切线离散化,它由下式给出:
\ sum_ {v_j \ in N_1(v_i)}(cot \ alpha_ {ij} + cot \ beta_ {ij})(f(v_j)-f(v_i))$$

其中$ v_j \ in N_1(v_i)$表示$ v_i $的一个环形邻域中的每个顶点。

这样就很容易计算平均曲率(为简单起见,现在让我们在感兴趣的顶点上简单地将网格的功能称为$ v $)就是H = \ frac {1} {2} || \ Delta_S v || $$

现在让我们将角度$ \ theta_j $引入为

高斯曲率是: $$ K =(2 \ pi-\ sum_j \ theta_j)/ A $$

经过所有这些痛苦之后,主要的离散曲率由下式给出:

$$ k_1 = H + \ sqrt {H ^ 2-K} \ \ \ text {and} \ \ k_2 = H-\ sqrt {H ^ 2-K} $$


如果您对该主题感兴趣(并对此文章添加了一些参考),非常好的阅读是:三角2歧管的离散微分几何算子[Meyer等。 2003]。

对于图片,我感谢我的前教授尼洛伊·米特拉(Niloy Mitra),因为我在他的演讲笔记中找到了这些图片。

评论


$ \ begingroup $
这两个答案都非常好,我很难选择。由于我已经问过最简单的方法,所以我认为内森很轻松。
$ \ endgroup $
–ap_
15年11月17日在17:28

$ \ begingroup $
Meyer等人。 2003年(可能没有明确)没有提到如何计算边界顶点的曲率。由于他们采用了角度赤字方法,边界顶点的高斯曲率应为$ K =(\ pi-\ sum_j {\ theta_j})/ A_ {mixed} $。
$ \ endgroup $
– Teodron
16年5月28日在9:33

$ \ begingroup $
@teodron您可能对边界顶点的平均曲率有任何见解吗?可以定义这样的事情吗?
$ \ endgroup $
–没用
16年11月18日在12:00

$ \ begingroup $
@Museful无论表面类型如何,我都对平均曲率不为负感到担心。如果在边界顶点上定义了类似Laplacian的算子,则需要评估相同的表达式,仅包括构成入射到$ v_i $的表面的三角形的表达式。但是,有更多有关离散曲率的论文。
$ \ endgroup $
– Teodron
16年11月18日在12:50