每个顶点超过1个法线

时间:2012-03-18 20:23:41

标签: android opengl-es blender vertex normals

我对从blender导出到.obj文件的法线有点困惑 我正在制作一个win应用程序,将obj文件拆分为2个带顶点的文件1,另一个带有索引,因此opengl的工作量较少。 正如我在脸上看到的那样,我可以找到相同的脸,但有不同的正常 例如面对24/24/20,再次24/24/19或更多 这是正确的吗? 在搅拌机项目中只有1个光源 感谢

2 个答案:

答案 0 :(得分:4)

我做了一些测试,这是我看到的:

OBJ导出脚本会忽略顶点法线并改为使用面法线。

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

enter image description here

并导出到OBJ。您应该期望4个向量法线(vn),因为您有4个向量,或者如果最小化则为3,因为中间的2个向量是相同的。但相反,它只输出2个vn-s:

vn -0.000000 1.000000 0.000000
vn -1.000000 -0.000000 -0.000000

更重要的是,如果你看一下面部定义,你会发现更有趣的东西:

f 1 // 1 4 // 1 3 // 1

f 4 // 2 2 // 2 3 // 2

查看//后面的数字。他们是一样的。这意味着对于一个面内的所有顶点使用相同的法线。这意味着,这些不是顶点的法线,而是面的法线。所以这就是为同一顶点指定不同法线的原因。当顶点没有。图4用于定义接收第一面的法线的第一面,并且当用于定义第二面时,使用第二面的法线。

修改 您可以像这样计算顶点法线:

  • 查找每个顶点的出现并将其全部正常变为集合A
  • 添加法线的相应坐标: 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)。将矢量除以它得到norm(vn)= vn / h =( - 1 / sqrt(2),1 / sqrt(2),0)。如果你看看中间法线的正面正交(左上角)上的图片,你会看到它有一个-x和一个+ y相等的组件,而矢量的长度为1.你可以看到我们的结果有长度1再次计算它的长度:1/2 + 1/2 + 0 = 1.这就是我们必须标准化,得到长度为1的原因。

答案 1 :(得分:2)

@SinistraD感谢您的评论。它们非常有用。在试图弄清楚如何从每个顶点法线从混合器导出之后,我发现对象工具>着色>平滑或平坦有一个选项。如果你选择平滑,然后将对象导出为obj文件,法线是每个顶点,我试试它到我的项目(我现在正在构建着色器)但我很快就会。请参阅使用此方法导出的多维数据集的示例。

Blender v2.61(sub 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
s 1
f 1/1/1 2/2/2 3/3/3 4/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/3 7/16/7 8/17/6 4/18/4
f 5/19/5 1/20/1 4/21/4 8/22/6