2013-04-09 96 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