2

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

4

2 回答 2

4

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

OBJ 导出脚本忽略顶点法线并使用面法线代替。

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

在此处输入图像描述

并导出到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)。如果您查看中间法线的 Front Ortho(左上角)的图片,您会看到 -x 和 +y 相等的分量,而向量的长度为 1。您可以看到我们的结果有长度1 通过再次计算它的长度:

于 2012-03-18T21:02:18.937 回答
2

@SinistraD Thank you for your comments. they are realy very useful. After trying to figure out how to export from blender per vertex normals , i found that there is an option at object tools>shading>smooth , or flat. if you choose smooth , and then export the object as obj file , the normals are per vertex , i dint try it yet to my project (i m building the shaders right now) but i will soon. see an example of an exported cube with this method.

Blender v2.61 (sub 0) OBJ File: ''

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

于 2012-03-23T09:25:01.543 回答