/*在opengl程式設計中,三維模型頂點法向量的計算很重要,它直接影響著顯示的效果;
本人接觸opengl時間不長,很長一段時間一直困惑於法向量計算的問題,
後經仔細研究並找了些資料才基本實現了法向量的計算演算法,現總結如下,希望對初學者能有些幫助。
大家知道,在opengl中頂點-三角形模型對光照的反射取決於頂點法向量的設定,如果法向量計算正確,
顯示出來的模型表面很光滑,有光澤,否則不是稜角分明就是模糊、看不清。下面假設模型資料**於autocad 的dxf格式的檔案,
由於dxf檔案儲存的資料是頂點座標和三角形頂點順序,沒有頂點法向量資訊,所以要自己計算;由立體幾何知識可知,
乙個點的法向量應該等於以這個點為頂點的所有三角形的法向量之和,所以只要計算出每個三角形的法向量,
再把這個法向量加到此三角形三個頂點的法向量裡即可。
下面是程式實現的部分關鍵**及注釋:*/
void centity::computenormalvector()
//取出每乙個三角形頂點順序的結構
sequencelist * psl = new sequencelist[m_nsequencenum];
sequencelist * psltemp = (sequencelist *)m_sl.pnext;
for(i=0;i
//計算每個三角形的法向量
vertex v1,v2,v3;
vertex temp_v1,temp_v2,v;
for(i=0;i
vertex vnormal = vertex(0,0,0);
//遍歷每個三角形,把當前三角形法向量分別加到三個頂點法向量裡去
for(j=0;j
//遍歷每乙個頂點,將計算完的法向量存到vertexlist鍊錶內。
pvltemp = (vertexlist *)m_vl.pnext;
for(i=1;i
delete pvl;
delete psl;
//釋放緩衝區
}//兩個結構如下:
typedef struct
vertexlist;
//頂點 鍊錶
typedef struct
sequencelist;
//三角形順序 鍊錶
//至此,頂點法向量計算完畢,然後就是建立顯示列表:
id=glgenlists(1);
glnewlist(id,gl_compile);
glbegin(gl_********s);
for(i=0;i
//遍歷每乙個三角形
glend();
//另外,正確設定光照和材質是影響opengl顯示效果的決定性因素,這裡就不再贅述,只列出我設定的材質、光照模型:
glshademodel(gl_smooth);
//設定材質和光照
glfloat mat_ambient= ;
//環境光分量強度
glfloat mat_diffuse= ;
//漫反射光分量強度
glfloat mat_specular = ;
//鏡面反射
glfloat mat_shininess = ;
glfloat light1_ambient= ;
glfloat light1_diffuse= ;
glfloat light1_specular = ;
glfloat light1_position = ;
頂點法向量的矩陣變換
本文參考 introduction to 3d game programming with directx 11在計算機圖形學中法向量的變化跟一般頂點的變化有一定的區別,假設我們有乙個切向量u v 1 v0 u v 1 v 0 u v1 v0 u uu與法向量n nn垂直。如果我們使用乙個矩陣a a...
計算三角網格的頂點法向量
原文 前段時間基本上完成了場景編輯器的大部分工作,現在已經可以用它生成自己需要的網格模型了。目前,在編輯器中對生成的網格是指定面的法向量,這對於用場景生成bsp等相關操作已經足夠了。不過為了測試bsp的健壯性,準備實現一下基於bsp的光線跟蹤演算法來看看效果,於是只是指定面的法向量就顯得不太夠用,因...
頂點法線計算的幾種方式
首先,頂點法線都是從面法線加權平均計算得到。所以有兩個維度,一是哪些面參與計算,二是權重如何計算。一 哪些面參與計算 如果建模工具匯出了光滑組,那麼方案一是直接使用光滑組資訊,屬於同乙個光滑組的面參與計算。方案二是同時使用光滑組資訊以及面的夾角的閾值。方案三是只使用面的夾角閾值。此時需要注意的是,由...