Android 每个顶点超过1个法线

Android 每个顶点超过1个法线,android,opengl-es,blender,vertex,normals,Android,Opengl Es,Blender,Vertex,Normals,我对从blender导出到.obj文件的法线有点困惑 我正在制作一个win应用程序,将obj文件拆分为两个文件,一个带有顶点,另一个带有索引,因此opengl所要做的工作更少。 正如我在脸上看到的,我可以找到相同的脸,但有不同的法线 例如,面对20年24月24日和19年24月24日,甚至更多 是这样吗? 在blender项目中,只有一个光源 谢谢我做了一些测试,下面是我的看法: OBJ导出脚本忽略顶点法线,而使用面法线。 为了测试,我制作了一个简单的形状,由两个三角形组成,如图所示: 并出口到

我对从blender导出到.obj文件的法线有点困惑 我正在制作一个win应用程序,将obj文件拆分为两个文件,一个带有顶点,另一个带有索引,因此opengl所要做的工作更少。 正如我在脸上看到的,我可以找到相同的脸,但有不同的法线 例如,面对20年24月24日和19年24月24日,甚至更多 是这样吗? 在blender项目中,只有一个光源
谢谢

我做了一些测试,下面是我的看法:

OBJ导出脚本忽略顶点法线,而使用面法线。

为了测试,我制作了一个简单的形状,由两个三角形组成,如图所示:

并出口到OBJ。你应该期待4矢量法线(VN),因为你有4个矢量,或者3,如果opim化,因为中间的2个向量是相同的。但它只输出2个vn-s:

vn -0.000000 1.000000 0.000000
vn -1.000000 -0.000000 -0.000000
此外,如果您查看人脸定义,您会发现更有趣的内容:

f 1/14/13/1

f 4/22/23/2

看一行中//后面的数字。它们是一样的。这意味着一个面内的所有顶点使用相同的法线。这意味着,这些不是顶点的法线,而是面的法线。这就是为什么为相同的顶点指定不同的法线。当使用顶点编号4定义第一个面时,接收第一个面的法线;当使用顶点编号4定义第二个面时,使用第二个面的法线

编辑 可以按如下方式计算顶点法线:

  • 找到一个顶点的每一个引用,并将其所有法线放入一个集合中
  • 添加法线的相应坐标: vn=(x1+x2+…+xn,y1+y2+…+yn,z1+z2+…+zn)
  • 计算向量长度:h=sqrt(vnx^2+vny^2+vnz^2)
  • 规范化向量vn:vn=(vnx/h,vny/h,vnz/h)

使用我前面的示例(在图像上找到的示例),顶部和底部的向量只出现一次,因此无需执行任何操作(顶点的法线与面的法线相同)。在中间的顶点上:它们出现两次,一次是顶部三角形,法线为(0,1,0),另一次是底部三角形(-1,0,0),因此这些顶点的法线集是{(0,1,0),(-1,0,0)}。把这些加起来就会得到:(0-1,1+0,0+0)=(-1,1,0)。计算长度:h=sqrt((-1)^2+1^2)=sqrt(2)。用它除以向量得到范数(vn)=vn/h=(-1/sqrt(2),1/sqrt(2),0)。如果你看中间法线前正交(左上)的图片,你会看到它有一个-x和一个+y相等的分量,而向量的长度为1。你可以看到我们的结果是长度1,通过再次计算它的长度:1/2+1/2+0=1。这就是为什么我们必须正常化,以获得长度1。

@SinistraD感谢您的评论。它们确实非常有用。在尝试了解如何从blender逐顶点法线导出后,我发现在“对象工具>着色>平滑”或“平面”中有一个选项。如果选择“平滑”,然后将对象导出为obj文件,法线是逐顶点的,我还没有尝试到我的项目中(我现在正在构建着色器),但我很快就会尝试。请参见使用此方法导出的多维数据集的示例

Blender v2.61(子0)OBJ文件:“” www.blender.org v 11.209502-11.209502-11.209501
v 11.209502-11.209502 11.209502
v-11.209503-11.209502 11.209500
v-11.209498-11.209502-11.209506
v 11.209508 11.209502-11.209496
v 11.209495 11.209502 11.209509
v-11.209506 11.209502 11.209498
v-11.209501 11.209502-11.209502
vt 0.652335 0.642748
vt 0.653298 0.956858
vt 0.339188 0.957821
vt 0.338225 0.643711
vt 0.968372 0.643711
vt 0.967408 0.957821
vt 0.654262 0.642748
vt 0.967408 0.327674
vt 0.968372 0.641784
vt 0.653298 0.328638
vt 0.339188 0.642748
vt 0.338225 0.328638
vt 0.652335 0.327674
vt 0.653298 0.641784
vt 0.337261 0.642748
vt 0.338225 0.956858
vt 0.024115 0.957821
vt 0.023151 0.643711
vt 0.337261 0.327674
vt 0.338225 0.641784
vt 0.024115 0.642748
vt 0.023151 0.328638
vn 0.577349-0.577349-0.577349
vn 0.577349-0.577349 0.577349
vn-0.577349-0.577349 0.577349
vn-0.577349-0.577349-0.577349
vn 0.577349 0.577349-0.577349
vn-0.577349 0.577349-0.577349
vn-0.577349 0.577349 0.577349
vn 0.577349 0.577349 0.577349
s1
F1/1/12/2/23/3/34/4/4
f 5/5/5 8/6/6 7/2/7 6/7/8
f 1/8/1 5/9/5 6/7/8 2/10/2
f 2/11/2 6/12/8 7/13/7 3/14/3
f 3/15/37/16/7 8/17/6 4/18/4

f 5/19/5 1/20/1 4/21/4 8/22/6

谢谢我们的回复。这意味着从blender导出和使用法线是没有用的,我们必须自己做??你可以使用面的法线来计算顶点的法线。更新答案:添加了程序和示例。感谢您的评论。它们真的非常有用。很抱歉通知您,这在Blender v2.8中不起作用:当我选择我的形状/网格时,进入“对象>着色平滑”并导出到OBJ文件,它仍然有不同的法线与该OBJ文件的“面”部分中的相同顶点相关联(线以“f”开头)。我正在为我的JAVA应用程序处理同样的“问题”,仍然试图找到一些有用的解决方案,但什么都没有。