2015-11-16 97 views
4

我有一個小問題,爲我的高度圖計算法線。它有一個奇怪的行爲。在較高和較低的點法線是好的,但在中間他們似乎錯了。他們點着一盞燈。 Problem計算法線高度圖

不固定源REMOVED

編輯: 嘗試過2種新的方法:

這是每面正常。它看起來很好,但你看到單面。

Position normal = crossP(vectorize(pOL, pUR), vectorize(pOR, pUL)); 

我也試過這樣做每個頂點,但也有一個奇怪的輸出。

enter image description here

這是尼科提出的建議:

看起來也相當奇怪。如何計算幫助點可能存在錯誤。

不固定源REMOVED

enter image description here

編輯2:我的觀點的 定義: OL,OR,UL,UR是要繪製平面的角落頂點。

   postVertPosZ1 postVertPosZ2 
preVertPosX1   pOL   pOR   postVertPosX1 
preVertPosX2   pUL   pUR   postVertPosX2 
       preVertPosZ1 preVertPosZ2 

EDIT3:

我現在解決它。這是一個愚蠢的錯誤: 我忘了將幫助頂點的y值乘以高度乘數,並且必須改變一些值。

現在很美。 enter image description here

+1

[在三角形網格中計算法線]的可能副本(http://stackoverflow.com/questions/6656358/calculating-normals-in-a-triangle-mesh) – legends2k

+0

相關:https://en.wikipedia。 org/wiki/Sobel_operator – sbabbi

回答

6

有很多方法可以解決這個問題。我沒有遇到你的。我建議使用中心差異來估計高度場的偏導數。然後使用叉積來得到正常值:

每個頂點法線可以從它的四個鄰居計算出來。你不需要飛機加上其鄰國:

T 
L O R 
    B 

O是要計算出正常的頂點。其他頂點(頂部,右側,底部,左側)是其鄰居。然後我們要計算在水平和垂直方向上的中央差異:

  /   2   \ 
horizontal = | height(R) - height(L) | 
      \   0   /

      /   0   \ 
vertical = | height(B) - height(T) | 
      \   2   /

正常的是,這些切線的叉積:

normal = normalize(cross(vertical, horizontal)) 
       // height(L) - height(R) \ \ 
     = normalize | |   2   | | 
        \ \ height(T) - height(B)// 

注意,這些計算假設你的X軸是對齊到右側和z軸向下。

+0

我編輯了我的帖子。也許我的錯誤在於確定幫助點(prevVertPosX1,...) – Eskalior

+0

你可以添加他們應該是哪個鄰居?我可以想象postVertPosX2可能是什麼,但你的編號可能是任何東西。所以最好把它放在某個地方。 –

+0

我編輯它。但感謝你,我注意到我已經切換了Z點的前後位置。我改變了,但結果是一樣的。 – Eskalior