2012-02-15 46 views
1

对于问题我的列表正确法线:a)一个有序点b)中的点的列表组成每个多边形的列表OpenGL的计算给定的点

例如

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

polygon1 = [ point1, point2, point3 ] 

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

我需要计算OpenGL中照明的正确法线。我知道我可以根据给定的点计算平面上的矢量,并且可以通过交叉乘积得到垂直于平面的平面,但OpenGL要求法线指向正确的方向(即向外)。

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

如果我选择在飞机上两个向量我不能告诉我怎么能肯定我在照明正确的方向上计算点的正常(即是在模型的外面。)

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

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

+0

如果有一个三角形在空间中漂浮,那么“正确的”一面是什么?对我来说,唯一正确的答案是双面照明。 – Ani 2012-02-15 21:38:34

+0

您不能简单地使用正面顺序(顺时针或逆时针)来定义您制作交叉产品的顺序吗? – user1118321 2012-02-15 21:38:47

+0

@ananthonline - 它不是一个漂浮在空间中的三角形,我有很多多边形,所有连接形成一个很好的封闭对象 – Blue42 2012-02-15 21:50:52

回答

0

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

3

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

但是有一些歧管,如克莱因瓶或莫比乌斯带,无法解决问题(请注意,如果您在莫比乌斯带上循环两次,实际上可以定向表面,如果您认为只能看到一边)。

好的,关于你的三角汤问题:这通常用所谓的半边解决。即对于每个三角形,您可以建立构成它们的顶点列表。这给你3个指向每个三角形的半边。现在,对于每对顶点v1,v2,您可以创建连接它们的边的列表(您应该使用顶点ID对作为密钥进入哈希映射,其中key((v1,v2))== key((v2,v1) ),最简单的做法是对它们进行排序)。对于每对这样的顶点,您应该只能找到一个半边或两个反平行的半边。如果有超过2个半边,则表面不可定向。如果半边平行,则属于其中一个半边的三角形的方向必须翻转。选择一个开始的三角形,然后建立一个连接三角形的树,然后再将这些三角形连接到下一个三角形等等。在每个三角形的树木商店里有一个翻转计数器。如果计数器是奇数,那么在树下方的所有三角形也将被视为翻转。没有三角形必须有明确的翻转计数器增加到1以上。合并分支的累计翻转计数必须在合并点处。

+0

这意味着我必须知道第一个多边形的正确法线?那么它计算出其余的呢? – Blue42 2012-02-19 18:04:21

+0

@ Blue42:的确如此。还值得一提的是,从几何角度来说,没有办法决定什么是“内部”。有一个关于数学家如何捕捉大象的老玩笑:他用铁丝网吞没自己,并定义“我在外面”。 – datenwolf 2012-02-19 18:08:57