我正在使用Kinect人脸api,它提供了三角形的顶点和索引数组,这些顶点和索引将被渲染以生成人脸图像。

顶点的数目及其在数组中的顺序以及kinect给出的索引始终是常数。

但是api没有提供有关UV数据和顶点法线的信息。

应用程序要求我保持给出的顶点顺序通过kinect,它们在3d空间中的位置会随着面部运动而变化,因此在3d编辑软件中生成uv和法线是毫无疑问的。

我设法通过将顶点位置投影到2D上来生成UV平面,因为同一平面上的顶点很少。

但是,我不知道如何为网格生成顶点法线,如果没有顶点法线,则面网格的绘制就不会产生其特征的深度,虽然可以看到轮廓,因为顶点位置是正确的。

我知道,由于缺少顶点法线,因此亮度不高ting不能在其上正常工作,因此它现在看起来像是苍白的无特征网格。

所以当我只拥有顶点位置和顶点索引以使三角形变为三角形时,如何生成顶点法线它吗?

评论

n =(v1-v0)x(v2-v0),其中v0,v1和v2是所讨论的(三角形)面的顶点。订单是重要的。如果确实需要,将其标准化。 (并且x是叉积)

#1 楼

使用向量叉积从顶点位置计算法线非常简单。

两个向量$ u $和$ v $的叉积(记为$ u \ times v $,有时也称为$ u \楔形v $)是垂直于$ u $和$ v $的向量,长度为$ || u \ timesv || = || u || \ cdot || v || sin(\ theta)$,其中$ \ theta $是$ u $和$ v $之间的夹角。向量的方向取决于乘法的顺序:$ u \ times v $与$ v \ times $(与平面垂直的两个方向)相反。

如果我对Cross产品不熟悉,我邀请您阅读并熟悉它。这样,法线看起来就很简单。

平面着色法线

如果有三角形$ ABC $,则$ AB \ times AC $是一个垂直于三角形并带有a的向量长度与其面积成正比。由于法线是垂直于三角形平面的单位矢量,因此可以使用以下方法获得法线:

$ N = \ dfrac {AB \ times AC} {|| AB \ times AC ||} $

在代码中,例如,看起来像n = normalize(cross(b-a, c-a))。只需将其应用在您所有的脸部上,您将获得每个脸部的法线。

For each triangle ABC
    n := normalize(cross(B-A, C-A))
    A.n := n
    B.n := n
    C.n := n


请注意,这是假定三角形之间不共享顶点。我不熟悉Kinect API;它们很可能是共享的,在这种情况下,您将必须复制它们,或继续使用下一个解决方案:

平滑的阴影法线

计算法线后如上所述,您会注意到三角形的边缘很明显。如果不希望这样做,则可以考虑所有共享相同顶点的面来计算平滑法线。

想法是,如果三个三角形共享同一个顶点$ T1 $ ,$ T2 $和$ T3 $,则正常的$ N $将是$ N1 $,$ N2 $和$ N3 $的平均值。此外,如果$ T1 $是一个大三角形,而$ T2 $是一个很小的三角形,则您可能希望$ N $受$ N1 $的影响要大于受$ N2 $的影响。

还记得叉积与面积的比例吗?如果您将叉积相加,然后对总和进行归一化,它将完全满足我们想要的加权总和。因此该算法变为:

Q4312078q

IñigoQuilez在本文中对此技术进行了更详细的解释:网格的智能归一化。


有关法线的更多信息,请参见:


如何计算生成的土工法的表面法线


评论


$ \ begingroup $
我会尽快解决并返回结果
$ \ endgroup $
–阿拉真
16-09-24在11:36

$ \ begingroup $
有效,谢谢一个吨的人,它确实有效,我想要它
$ \ endgroup $
–阿拉真
16-09-25在12:20

$ \ begingroup $
在i.gyazo.com/a314d1f7a0509788c272f83279c5077b.png和i.gyazo.com/b879db7294d82a72b86cc4eaf0132a13.png之后查看结果
$ \ endgroup $
–阿拉真
16-09-25在12:23



$ \ begingroup $
@Allahjane:很高兴听到它运行良好。 :)
$ \ endgroup $
–朱利安·盖尔特(Julien Guertault)
16 Sep 25 '16:07