如何计算3D中线段的法线

时间:2013-04-09 10:24:58

标签: math opengl normalization opengl-3 normals

我从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空间线段定义的规则)。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

由于Aki忘记了评论不是答案:

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

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

答案 1 :(得分:1)

如果你认为你可以开始使用两个向量,看起来就像你说的那样,把它们称为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个分量,依此类推。彼此相邻的数字代表乘法。当然,你有这个向量的加或减两种可能性。