Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 如何计算三维线段的法线_Math_Opengl_Normalization_Opengl 3_Normals - Fatal编程技术网

Math 如何计算三维线段的法线

Math 如何计算三维线段的法线,math,opengl,normalization,opengl-3,normals,Math,Opengl,Normalization,Opengl 3,Normals,我已经从搅拌器(一种发型)中导出了一些头发微粒。这些由多条线(GL_线)组成。我的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空间线段定义的规则

我已经从搅拌器(一种发型)中导出了一些头发微粒。这些由多条线(GL_线)组成。我的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空间线段定义的规则


有人能帮我吗?

因为Aki忘记了评论不是答案:

三维空间中的线没有法线。从技术上讲,二维空间中的线也没有法线;它们有两条法线


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

因为Aki忘记了注释不是答案:

三维空间中的线没有法线。从技术上讲,二维空间中的线也没有法线;它们有两条法线


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

如果你假设可以从两个向量开始,看起来就像你说的那样,把它们称为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个分量,依此类推。相邻的数字表示乘法。当然,这个向量有正负两种可能

如果你假设你可以从两个向量开始,看起来你就是这么说的,把它们叫做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个分量,依此类推。相邻的数字表示乘法。当然,这个向量有正负两种可能

在3D中,直线没有单一法线。相反,这条线本身是飞机的法线。或者,换一种说法:在垂直于直线的平面上有无限多条法线。要计算单个法线,您需要一些“平面”对象,如三角形。另一方面,一条线可以以各种可能的方式围绕自身旋转,而你看不到任何区别。在3D中,一条线没有单一的法线。相反,这条线本身是飞机的法线。或者,换一种说法:在垂直于直线的平面上有无限多条法线。要计算单个法线,您需要一些“平面”对象,如三角形。另一方面,一条线可以以各种可能的方式自转,而你却看不出有什么不同。谢谢你的回答。但是openGL中的一行,正如你所知道的,并不是真正的行。它的表面很小。证明是glLineWith()方法。如果你缩放到一条宽度为10像素的线,你会看到这条线是一个很小的多边形。因此,宽度为1(默认值)的线也是一个小多边形。因此,解决方案是保留每条直线(A(x,y,z)和B(x,y,z))的点坐标,并创建(仅用于法线计算)与直线合并的多边形。因此,我可以计算这条线的法线?@user1364743:OpenGL线没有曲面。glLineWidth只是设置屏幕上线条的宽度。OpenGL线条不是微小的圆柱体或多边形,可以“放大”。我认为您对OpenGL有一些非常强烈的误解。OpenGL不知道场景是什么。它甚至不知道几何学是什么。它所看到的只是作为二维平面形状绘制到二维平面帧缓冲区上的点、线和三角形。3D的所有相似之处都是通过巧妙的数学应用来实现的,它创建了一个看起来像3D的图像,但实际上并非如此。@user1364743:关于线宽:OpenGL使用的线光栅化器非常类似于Bresenham线光栅化器。谷歌的“思考布雷森汉姆线”,这就是OpenGL所做的。好吧,但你认为光度计算可以通过这种算法实现吗?很抱歉坚持,但我实现了一个3d图形引擎,可以管理包括特定系统在内的所有类型的网格。我使用GLSL着色器为所有类型的网格(系统除外)管理亮度计算。目前对于一个特定的项目,我需要计算发型。我有网格,但还没有灯光实现。我知道它已经有了一些相关的技术,但我想对它的工作原理有一个完整的了解。例如,当你创建一个带有头发微粒的球体时,如果你移动物体,你会看到头发微粒因为聚光灯而改变颜色。所以我认为有一种法线计算方法或者其他算法可以模拟同样的效果。你有这方面的信息吗?提前谢谢。这类信息很难找到,谢谢你的回答。但是openGL中的一行,正如你所知道的,并不是真正的行。它的表面很小。证明是glLineWith()方法。如果你缩放到一条宽度为10像素的线,你会看到这条线是一个很小的多边形。因此,一条宽度为1(默认值)的线