2016-03-01 70 views
0

大學任務需要我使用頂點座標我必須從正常值計算法線和切線,以便我可以創建一個物體空間到紋理空間矩陣。獲取物體空間的切線到紋理空間

我有製作矩陣所需的代碼,和binormal,但我沒有用於計算正切值的代碼。我試圖在網上看,但答案通常讓我感到困惑。你能清楚地向我解釋它是如何工作的嗎?

編輯:我糾正了我以前寫的很清楚我誤解了這項任務。謝謝大家幫助我看到這一點。

+0

你所說的「切線」是什麼意思?一條線,還是一架飛機?你想如何表示切線? –

+2

切線空間的切線不是你可以從法線貼圖單獨計算出來的。這是一個取決於頂點位置和UV佈局的幾何屬性。 – BDL

+0

我發現自己非常關心你的大學任務,因爲正如你所說的那樣,這兩者都是不可能的,並且背叛了對正切空間法線映射如何工作的明顯錯誤理解。也許你誤解了它的要求? –

回答

2

數學意義上的切線是幾何對象的屬性,而不是法線貼圖的屬性。在normalmapping的情況下,我們另外尋找一個非常具體的切線(每個點有無限多的,基本上每個法向平面上的矢量都是一個切線)。

但讓我們回過頭來看:我們需要一個紋理的u方向在切線方向上映射的空間,在雙曲線/副法線上的v方向和法線貼圖的向上矢量到正常的對象。因此,切線的三角形(V0,V1,V2)與UV座標(UV1,UV2,UV3)可以計算爲:

dv1 = v1-v0 
dv2 = v2-v0 

duv1 = uv1-uv0 
duv2 = uv2-uv0 

r = 1.0f/(duv1.x * duv2.y - duv1.y * duv2.x); 
tangent = (dv1 * duv2.y - dv2 * duv1.y) * r; 
bitangent = (dv2 * duv1.x - dv1 * duv2.x) * r; 

當已經這樣做了所有的三角形,我們必須平滑切線在共享頂點(與正常情況非常相似)。有幾種算法可以做到這一點,這取決於你需要什麼。例如,可以通過相鄰三角形的表面積或它們的入射角來對切線進行加權。

這整個計算的實現可以[點擊這裏]研究發現沿着更詳細的解釋:(http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-13-normal-mapping/

+1

我認爲這裏要指出的關鍵是切線/雙切線是* mesh *的屬性,而不是紋理的屬性。這是什麼讓大學的任務變得古怪。 –