【问题标题】:OpenGL calculating correct normals given list of pointsOpenGL在给定点列表的情况下计算正确的法线
【发布时间】: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 的回答对我来说似乎是正确的。

标签: opengl glut normals


【解决方案1】:

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

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

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

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2017-12-18
    相关资源
    最近更新 更多