【问题标题】:OpenGL: finding the normal, unitary vector of a vertexOpenGL:找到顶点的法线、酉向量
【发布时间】:2010-11-23 01:12:38
【问题描述】:

我有一个想要应用照明的对象。它在带有顶点坐标的文本文件中进行描述。

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

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

要使用这个函数,给它一个向量 存储法线和三个向量 (每个只是三个浮点数的数组) 从你的多边形或三角形 (指定逆时针缠绕 命令)。请注意,这返回正常 向量不一定是单位长度 (标准化)。

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

【问题讨论】:

    标签: opengl


    【解决方案1】:

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

    我的建议不是。 0 是:

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

    我的建议不是。 1 是:

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

    如果您出于任何原因不想(或不能)这样做,请参阅第 2 条建议。关于如何自己生成法线:

    • 对于每个面,计算其临时面法线(对于面A,B,C,它是(B-A)x(C-B))。不要将其重新缩放为 length=1 - 面部区域越大,生成的法线向量就越长,这就是我们想要的(目前)。
    • 对于每个顶点,将接触该向量的面的所有面法线相加(这是每个面法线的非规范化派上用场的地方 - 你会得到某种面区域的“加权和”是权重)并然后对结果向量进行归一化。这是您可以使用的逐顶点法线的一个很好的近似值。

    【讨论】:

    • 我不能使用其他格式,这是学校作业。使用这种“加权和”有什么好处?
    • 很抱歉听到这个消息。加权和确保如果一个顶点紧挨着一张大脸和一张小脸,那么法线将更倾向于更大的那个。但这仍然是一个很大的近似值(但可以快速运行和实施)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      相关资源
      最近更新 更多