【问题标题】:How to compute normals for a segment line in 3D如何计算 3D 线段的法线
【发布时间】:2013-04-09 10:24:58
【问题描述】:

我从 Blender(一种发型)中导出了一些头发颗粒。这些由几行(GL_LINES)组成。我的 openGL 程序可以毫无问题地显示这些粒子。现在我只想在这些粒子上应用光属性。 Blender 不会导出法线向量,所以我需要自己计算它们。我知道以下规则:

如果我们将一条线段定义为二维的 [AB], 我们有 dx = xB - xA 和 dy = yB - yA,那么法线是 N1(-dy, dx) 和 N2(dy, -dx)。

希望我没有犯任何错误。

但是如果我在我的线段坐标中添加 z 维度(例如 A(5, 2, 3) 和 B(0, 0, -5),我不知道 3D 空间线段定义的规则)。

有人可以帮助我吗?

【问题讨论】:

  • 3D 中的线没有单一的法线。相反,线本身是平面的法线。
  • Aki Suihkonen 说了什么。或者,反过来说:在垂直于直线的平面上有无数条法线。要计算单个法线,您需要像三角形这样的“平面”。另一方面,一条线可以以各种可能的方式围绕自身旋转,而您却看不到差异。

标签: math opengl normalization opengl-3 normals


【解决方案1】:

因为 Aki 忘记了 cmets 不是答案:

3D 空间中的线没有法线。从技术上讲,2D 空间中的线条也没有法线;他们有两个法线。

在 3D 空间中有无数个垂直于一条线的方向。所有这些法线都在同一平面上,但方向不同。如果没有一些更高级的算法(可能基于相邻线),就无法选择这些法线中的一个而不是另一个。

【讨论】:

  • 感谢您的回答。但是如您所知,openGL 中的一条线并不是真正的线。它有一个很小的表面。证明是 glLineWith() 方法。如果你放大到一条宽度为 10 像素的线,你会看到这条线是一个很小的多边形。所以宽度为 1(默认值)的线也是一个小多边形。所以解决方案是保留每条线的点坐标(A(x,y,z)和B(x,y,z))并创建(仅用于法线计算)与线合并的多边形。因此,我可以计算这条线的法线?
  • @user1364743:OpenGL 线条没有表面。而 glLineWidth 只是设置屏幕上线条的宽度。 OpenGL 线不是您可以“炸毁”的微小圆柱体或多边形。我认为您对 OpenGL 有一些非常强烈的误解。 OpenGL 不知道场景是什么。它甚至不知道几何是什么。它所看到的只是点、线和三角形,它们作为 2D 平面形状绘制到 2D 平面帧缓冲区上。 3D 的所有相似之处都是通过巧妙地应用数学来创建看起来像 3D 但实际上并非如此的图像。
  • @user1364743:关于线宽:OpenGL 使用线光栅器非常像 Bresenham 线光栅器。 Google 搜索“想想 Bresenham 线”,这就是 OpenGL 所做的。
  • 好的,但是您认为光度计算可以通过这种算法实现吗?很抱歉坚持,但我实现了一个 3d 图形引擎,可以管理所有类型的网格,包括特定的系统。我使用 GLSL 着色器为除特定系统之外的所有类型的网格管理光度计算。目前对于一个特定的项目,我需要计算发型。我有网格,但还没有轻量级的实现。我知道它已经存在一些相关技术,但我想全面了解它的工作原理。
  • 例如,当您创建一个上面有头发粒子的球体时,如果您移动对象,您会看到头发粒子由于聚光灯而改变颜色。所以我认为对它们进行法线计算或其他可以模拟相同效果的算法。你有这方面的一些信息吗?提前致谢。这种信息很难找到。
【解决方案2】:

如果您假设您可以从两个向量开始,并且看起来就像您所说的那样,请将它们称为 v、w,以获得一个法向量,然后取叉积。根据具体情况,首先对 v、w 进行归一化并不是一个坏主意。叉积可由下式给出:

v x w =(v_2w_3 - v_3w_2, v_3x_1 - v_1w_3, v_1w_2 - v_3w_1), 

这里 v_i 是 v 的第 i 个分量,依此类推。相邻的数字代表乘法。当然,您可以加上或减去这个向量,给出两种可能性。

【讨论】:

  • 顺便说一句,要获得您开始的两个向量,只需使用您描述的多边形中的任意两个非平行线段。
  • 好的,谢谢您的回答。我会试试这个。我还有一个提议。告诉我这是否可能。假设我有一条线段 [AB]。我在垂直于线的两个末端(仅用于法线计算)计算两个多边形。因此,我可以按 72 度分隔的多边形计算五个法线(例如)。因此,为了计算线段上的亮度,我将 10 条法线与多边形合并。我认为这会增加 3D 中的亮度效果。你觉得有可能吗?
  • 我不知道您的发光效果,但是如果您拥有的多边形在您所在的 3-D 空间中不平行,您只会得到不同的(非平行)法线. 我建议画一幅画。
  • 我编辑了你的答案公式,因为有两个错别字。来源:en.wikipedia.org/wiki/Cross_product
猜你喜欢
  • 2013-12-25
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多