我为我的OpenGL应用程序实现了一个wavefront(OBJ)文件加载器,它为我提供了面部,纹理和顶点信息。但是,使用照明我显然需要正常的信息。我知道这样做的正确方法是采用包含三角形并标准化的3个顶点的叉积。这会导致您应用于所有3个顶点的法线是否正确?
但是,对于不在多边形边缘的面/三角形,每个顶点使用3次。所以我猜你只是用先前计算的法线平均每个新计算的法线?
这似乎是我想要这样做的一项非常昂贵的任务;迭代所有顶点并计算使用该顶点和平均的每个面的法线。有更好/更快的方法吗?
干杯
克里斯
答案 0 :(得分:2)
是的,平均与顶点相邻的面的每面法线可以得到很好的结果。为了保持非常坚硬的边缘“硬”,您通常会在计算中引入角度限制,以保持> 90(或甚至更低的角度)度边缘接收平均法线。
我参与的OSS项目有freely available implementation这个算法。它是O(nlogn)
并且在完全唯一的顶点上操作(每个面引用3个顶点,但每个顶点仅由一个面引用 - 将相同的顶点连接在一起在稍后阶段完成)。
如果你有完全不同的顶点(即每个顶点位置只存在一次),它可以在O(n)
时间内完成,但是限制平滑边缘角度则更难以实现。
答案 1 :(得分:1)
正如您在此处所见,OBJ支持法线的定义。为什么不让3D程序努力工作呢? :)