OpenGL:找到顶点的正常单一向量

时间:2010-11-22 16:59:58

标签: opengl

我有一个我想要应用光照的物体。它在具有顶点坐标的文本文件中描述。

我在OpenGL Superbible中阅读了以下内容:

void m3dFindNormal(M3DVector3f vNormal, const M3DVector3f vP1, const M3DVector3f vP2, const M3DVector3f vP3);
  

要使用此功能,请将其传递给矢量   存储正常和三个向量   (每个只是一个三个花车的阵列)   从你的多边形或三角形   (以逆时针方向指定   订购)。请注意,这返回正常   向量不一定是单位长度   (标准化)。

据我所知,我传递顶点的顺序(顺时针或逆时针)决定了法线向量的方向,所以我想知道如何使用this format文件来使用该函数。

2 个答案:

答案 0 :(得分:2)

嗯,这种格式看起来有点OBJ-ish,但有颜色,没有法线和纹理坐标。好像它不是一个好选择!但如果你真的想坚持下去......

我的建议没有。 0是:

严肃地使用其他格式。 :)顶点的原始二进制转储(位置+法线+纹理坐标+颜色+其他)然后索引通常是最简单的解决方案。如果你真的 *真的*想要使用.off ...

我的建议没有。 1是:

  • 将其导入Blender(在Python中编写导入程序脚本或使用其他工具更改格式)
  • 让Blender为你计算法线(它会做得很好!),
  • 将其导出为具有法线的任何格式。

如果您因任何原因不想(或不能)这样做,那么就如何自己生成法线提出一些建议:

  • 对于每张脸,计算其临时脸部法线(对于脸部A,B,C,它是(B-A)x(C-B))。不要将它重新缩放到长度= 1 - 面部区域越大,得到的法向量就越长,这就是我们想要的(现在)。
  • 对于每个顶点,对触摸该向量的面的所有面法线求和(这是每面法线的非标准化方便的地方 - 你会得到某种面部区域的“加权和”作为权重)和然后标准化得到的矢量。这是您可以使用的每顶点法线的近似值。

答案 1 :(得分:0)

尝试一下,顺序取决于创建.off文件的程序,格式的描述似乎没有定义正常的方向。我只是将它们出现在索引列表中的顺序传递给函数。如果这不起作用,请以相反的顺序传递它们。