關於點法線向量的計算

2021-07-03 06:27:33 字數 978 閱讀 6403

我在學習opengl的過程中,發現光照模型的渲染是需要指定法線向量的。無論是面法線還是點法線,不指定的話可能會造成不可預知的渲染效 果。

面法線的計算相對來說容易一些,說說點法線如何計算的。當然我在網上也找了好些資料。

計算點法線,必須先計算它所在的面的面法線向量,再對所有面法線向量做歸一化才可以。

那如何計算面法線向量哪:

設有兩個向量組成乙個面,向量分別表示為v1(x,y,z),v2(x,y,z),將兩向量叉乘便可得到面法線向量,如下:

v = v1xv2

=>vx = v1y*v2z-v1z*v2y

vy = v1z*v2x-v1x*v2z

vz = v1x*v2y - v1y*v2x

得到了面法線向量,接下來必須將向量歸一化,即v = normilised(vn),v表示歸一化向量,vn表示法線向量。

歸一化向量的方法:

1,計算向量長度:

l = sqrt(vx*vx+vy*vy+vz*vz),其中sqrt表示求平方根

2,向量的每個分量除以長度:

nvx = vx/l

nvy = vy/l

nvz = vz/l

這樣只計算了面法線的向量,因為頂點可能屬於多個面,所以要將所有頂點屬於的面進行處理:

計算所有經過該點的面法線向量的和的歸一化

v = normalised(sum(vij))

其中:vij表示所有經過該點的面法線向量

sum表示法線向量所有分量的和

normalised表示法線向量的歸一化

別急,還沒結束。在計算頂點法線向量的時候我們必須要排除共面的面法線向量。那如何判斷兩個面是否共面哪?

只要判斷兩條法線向量是否平行即可。

假設還是兩個向量,v1(x,y,z),v2(x,y,z)

若:(v1x/v2x) = (v1y/v2y) = (v1z/v2z) = 常量,則兩向量平行。

這樣,應該可以計算出頂點的法線向量了。

頂點法向量的計算

在opengl程式設計中,三維模型頂點法向量的計算很重要,它直接影響著顯示的效果 本人接觸opengl時間不長,很長一段時間一直困惑於法向量計算的問題,後經仔細研究並找了些資料才基本實現了法向量的計算演算法,現總結如下,希望對初學者能有些幫助。大家知道,在opengl中頂點 三角形模型對光照的反射取...

頂點法線計算的幾種方式

首先,頂點法線都是從面法線加權平均計算得到。所以有兩個維度,一是哪些面參與計算,二是權重如何計算。一 哪些面參與計算 如果建模工具匯出了光滑組,那麼方案一是直接使用光滑組資訊,屬於同乙個光滑組的面參與計算。方案二是同時使用光滑組資訊以及面的夾角的閾值。方案三是只使用面的夾角閾值。此時需要注意的是,由...

計算三角網格的頂點法向量

原文 前段時間基本上完成了場景編輯器的大部分工作,現在已經可以用它生成自己需要的網格模型了。目前,在編輯器中對生成的網格是指定面的法向量,這對於用場景生成bsp等相關操作已經足夠了。不過為了測試bsp的健壯性,準備實現一下基於bsp的光線跟蹤演算法來看看效果,於是只是指定面的法向量就顯得不太夠用,因...