2

我已经为我的 OpenGL 应用程序实现了一个波前 (OBJ) 文件加载器,它为我提供了面部、纹理和顶点信息。但是,要使用照明,我显然需要正常信息。我知道这样做的正确方法是取构成三角形的 3 个顶点的叉积并归一化。这会导致您应用于所有 3 个顶点的法线对吗?

但是,对于不在多边形边缘的面/三角形,每个顶点使用 3 次。所以我猜你只是用之前计算的法线平均每个新计算的法线?

按照我的想法,这似乎是一项非常昂贵的任务;遍历所有顶点并计算使用该顶点的每个面的法线并进行平均。有没有更好/更快的方法来做到这一点?

干杯

克里斯

4

2 回答 2

2

是的,对与顶点相邻的面的每个面法线进行平均可以得到很好的结果。为了使非常硬的边缘保持“硬”,您通常会在计算中引入角度限制,以防止 >90(或什至更低角度)度的边缘接收平均法线。

我参与的一个 OSS 项目有这个算法的免费实现。它是O(nlogn)并且对完全唯一的顶点进行操作(每个面引用 3 个顶点,但每个顶点仅由一个面引用 - 将相等的顶点连接在一起是在稍后阶段完成的)。

如果您有完全不同的顶点(即每个顶点位置仅存在一次),则可以及时完成O(n),但限制边缘角度以进行平滑则更难实现。

于 2011-04-19T10:46:08.450 回答
1

正如你在这里看到的, OBJ支持法线的定义。为什么不让 3D 程序做艰苦的工作呢?:)

于 2011-04-19T10:43:20.913 回答