1

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

例如

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

polygon1 = [ point1, point2, point3 ]

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

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

我知道我可以从给定的点计算平面上的向量,并通过叉积得到平面法线,但是 OpenGL 要求法线指向正确的方向(即向外)。

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

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

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

如果有帮助,事实证明所有多边形都是三角形(虽然看不出它有什么帮助,应该能够为任何多边形抽象)

4

2 回答 2

3

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

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

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

于 2012-02-15T21:44:21.280 回答
0

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

于 2012-02-17T11:25:34.853 回答