OpenGL在给定点列表的情况下计算正确的法线

Posted

技术标签:

【中文标题】OpenGL在给定点列表的情况下计算正确的法线【英文标题】:OpenGL calculating correct normals given list of points 【发布时间】:2012-02-15 21:27:44 【问题描述】:

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

例如

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

polygon1 = [ point1, point2, point3 ]

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

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

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

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

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

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

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

【问题讨论】:

如果有一个三角形自己漂浮在空间中,“正确”的一面是什么?在我看来,唯一正确的答案是双面照明。 你不能简单地使用正面排序(顺时针或逆时针)来定义你做叉积的顺序吗? @ananthonline - 它不是一个漂浮在太空中的三角形,我有很多多边形,它们都连接起来形成一个漂亮的封闭对象 @user1118 不太确定您的意思-您是否认为给出点的顺序对应于外面的哪张脸?它是 VTK 格式,所以我想我会查阅他们的文档 啊,我误会了。 @datenwolf 的回答对我来说似乎是正确的。 【参考方案1】:

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

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

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

【讨论】:

这意味着我必须知道第一个多边形的正确法线?然后它会计算出其余的? @Blue42:没错。还值得一提的是,从几何角度来说,没有办法确定“内部”是什么。有一个关于数学家如何抓住大象的老笑话:他把自己包围在铁丝网中并定义“我在外面”。【参考方案2】:

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

【讨论】:

以上是关于OpenGL在给定点列表的情况下计算正确的法线的主要内容,如果未能解决你的问题,请参考以下文章

计算顶点法线OpenGL

用于 SceneKit 内容的正确法线贴图格式 - DirectX 还是 OpenGL?

✠OpenGL-10-增强表面细节

opengl vbo 纹理

OpenGL 计算法线(四边形)

如何在 OpenGL 中为 Phong 着色插入法线?