2013-04-09 32 views
0

我已经从Blender(发型)中导出了一些头发粒子。这些由几行(GL_LINES)组成。我的openGL程序显示这些粒子没有任何问题。现在我只想对这些粒子应用光特性。 Blender不会输出法线向量,所以我需要自己计算它们。我知道以下规则:如何计算3D线段线的法线

如果我们在两维中定义一条线段为[AB],我们有dx = xB-xA和dy = yB-yA,则法线是N1(-dy,dx)和N2(dy,-dx)。

我希望我没有犯任何错误。

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

有人能帮助我吗?

+7

3D中没有单线法线。相反,线路本身是飞机的常态。 – 2013-04-09 10:27:35

+1

Aki Suihkonen说。或者反过来说:垂直于该线的平面上有无数法线。要计算单个法线,需要像“三角形”那样的“平面”。另一方面,一条线可以以各种可能的方式围绕自身旋转,而不会看到差异。 – Damon 2013-04-09 10:51:01

回答

1

由于亚希忘了意见不是答案:在三维空间

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

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

+0

感谢您的回答。但是,如您所知,openGL中的一行不是真正的行。它有一个微小的表面。证明是glLineWith()方法。我缩放到一个宽度为10像素的线条,你会看到这条线是一个小小的多边形。所以宽度为1的线(默认值)也是一个小小的多边形。所以解决方法是保存每条线的点坐标(A(x,y,z)和B(x,y,z))并创建(仅用于法线计算)与线合并的多边形。因此,我可以计算这条线的法线? – user1364743 2013-04-09 12:28:59

+3

@ user1364743:OpenGL行没有表面。而glLineWidth只是在屏幕上设置线条的宽度。 OpenGL线不是微小的圆柱体或多边形,你可以“炸毁”。我认为你受到OpenGL几个非常强烈的误解。 OpenGL不知道一个场景是什么。它甚至不知道几何是什么。它所看到的只是点,线和三角形,它们被绘制为2D平面帧缓冲区上的2D平面形状。 3D的所有相似只是通过数学的巧妙应用而发生的,其创建的图像看起来像3D,但实际上不是。 – datenwolf 2013-04-09 12:48:27

+0

@ user1364743:关于线条宽度:OpenGL使用非常像Bresenham线栅格化器的线条栅格化器。谷歌为“思考Bresenham线”,这就是OpenGL所做的。 – datenwolf 2013-04-09 12:49:43

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个分量,等等。相邻的数字表示乘法。当然,你有正负两种可能性。

+0

btw,为了得到你开始的两个向量,只需使用你所描述的多边形中的任意两个非平行段。 – 2013-04-09 12:49:53

+0

好的谢谢你的回答。我会试试这个。我有另一个提议。告诉我,如果这是可能的。假设我有一条线段[AB]。我计算两个垂直于线条的两个多边形(仅用于法线计算)。因此,我可以用多边形分别计算五个法线72度(例如)。因此,为了计算线段上的亮度,我将有10个法线与多边形合并。我认为这会增加3D中的光度效应。你认为这有可能吗? – user1364743 2013-04-09 13:37:47

+0

我不知道你的发光效果,但是如果你所拥有的多边形在你所在的三维空间中是不平行的,你将只会得到不同的(不平行的)法线。我会建议画一幅图片。 – 2013-04-09 13:50:06