给定点列表,OpenGL计算正确的法线

时间:2012-02-15 21:27:45

标签: opengl glut normals

对于我遇到的问题:a)有序的点列表b)构成每个多边形的点列表

例如

point1 = (1, 2, 2)
point2 = (1, 2, 3)
point3 = (1, 3, 3)

polygon1 = [ point1, point2, point3 ]

=> polygon1是一个三角形,可以是模型外部的一部分。

我需要在OpenGL中计算正确的法线法线。

我知道我可以从给定的点计算平面上的向量,并且交叉乘积以使 A 垂直于平面,但OpenGL要求法线指向正确的方向(即向外)。

这个过程需要自动化,因为我有很多多边形。

如果我在平面上选择两个矢量,我无法确定我是如何确定正常的我已经在正确的照明方向上计算了点(即在模型的外部。)

我想我可以将计算出的法线加到平面上的一个点上,看看它是否离原点更远,看它是否正确,但是模型非常复杂,一些法线可能需要指向原点(ish)

如果有帮助的话,事实证明所有的多边形都是三角形(虽然不知道它有多大帮助,但是应该能够为任何多边形进行抽象)

2 个答案:

答案 0 :(得分:3)

您的问题通常称为“歧管表面方向”。在闭合歧管的情况下,它可以毫不含糊地解决,在开放但可定向的歧管的情况下,您必须手动确定补丁的哪一侧是“外部”。

然而,有一些歧管,如Klein瓶或Moebius条带,问题无法解决(请注意,如果你在Moebius条带上循环两次,你实际上可以定位表面,如果你认为你只能看到一个侧)。

好的,关于你的三角汤问题:这通常使用所谓的半边来解决。即为每个三角形构建构成它们的顶点列表。这为每个三角形提供了3个有向半边。现在为每对顶点v1,v2创建一个连接它们的边列表(你应该使用顶点ID对作为哈希映射的键,其中key((v1,v2))== key((v2,v1) ),最简单的方法就是对它们进行排序)。对于每对这样的顶点,您应该找到仅一个半边或两个反平行半边。如果有超过2个半边,则表面不可定向。如果半边是平行的,则必须翻转属于其中一个半边的三角形的方向。选择一个起始三角形,然后构建一个连接三角形的树,然后将这些三角形构建到下一个,依此类推。在每个三角形的树存储中有一个翻转计数器。如果计数器是奇数,那么树下面的所有三角形也被认为是翻转的。没有三角形必须使它的显式翻转计数器增加到超过1.合并分支的累积翻转计数必须在合并点处均匀。

答案 1 :(得分:0)

通常,以顺时针方向定义的点对应于对象的外表面。所以正常的计算会很有用。