利用OpenGL進行模型表現

2021-05-21 22:00:42 字數 2295 閱讀 2926

這篇文章介紹一下用opengl來表現模型物件。比如用3dmax等工具做好乙個模型後,我們希望能夠在自己的程式中使用它。一般使用這些工具的匯出功能匯出特定的檔案,然後讀取其中我們感興趣的部分,再把這些感興趣的資料在我們的程式中組織好就可以了。利用opengl來表現靜態模型是很簡單的。

這裡為了簡單起見,模型物件檔案為txt文字,只包含了模型的頂點個數,面個數,頂點座標,索引資訊。當然在一些複雜的模型檔案中,還包括法線,貼圖座標等等資訊。重要的問題是,如果組織這些資訊。

219483

435667

3.031209 1.875606 1.422974

3.030240 1.863352 1.404835

3.030240 1.863352 1.404835

3.021032 1.846390 1.404004

3.021032 1.846390 1.404004

3.050020 1.888645 1.389481

3.040140 1.883706 1.400404

2869 2977 2973

2973 2974 2869

2979 2978 2975

2980 2979 2976

2976 2979 2975

2982 3104 3101

3096 2983 2982

3094 2984 3096

2984 2983 3096

3094 2972 2984

2979 2873 2978

2979 2980 2988

如上面的資訊一樣,第一行資料為該模型的頂點個數,第二行資料為該模型的三角形面個數。後面的資料分別人頂點座標和每乙個面的頂點索引資訊。很自然的,首先可以想到要在程式中表現該模型,需要vertex的資料型別,於是可以定義這樣的結構體,可以包含頂點的座標和法線資訊。

view plaincopy to clipboardprint?

struct vertex  

;  struct vertex

; 這裡的頂點結構包含了頂點座標p和法線n。

然後就是面的資料型別

view plaincopy to clipboardprint?

struct face  

;  struct face

; 乙個面由3個頂點構成,只要有了頂點的索引就可以了。

最後就是模型的資料型別了

view plaincopy to clipboardprint?

struct model  

;  struct model

; 這個資料型別包含了模型頂點數vnum,面數fnum,指向頂點列表的指標vertlist和指向面列表的指標facelist。

然後這樣只要用model來定義乙個模型就可以了

model mymodel;

下面來看看如果從檔案中讀取資訊。可以把讀取檔案的部分寫成乙個函式,比如叫loadmodel,函式的引數只需要提供檔名就可以了。

view plaincopy to clipboardprint?

void loadmodel(char *fname)  

for (int i = 0; i < fnum; ++i)  

for (int i = 0; i < vnum; ++i)  

}  void loadmodel(char *fname)

for (int i = 0; i < vnum; ++i)

} 上面的**比較長,但是內容很簡單。首先開啟檔案,然後分別以整型的方式讀取頂點個數和面個數,儲存在結構體變數中。然後為頂點列表和面列表動態申請記憶體空間,在迴圈中分別讀取每個資料。由於頂點包括法線資訊,所以這裡還進行了法線的計算。這裡採用平均法線,即把乙個頂點的多個法線加在一起,然後再進行單位化。由於乙個頂點可能被用於多個面,所以該頂點的法線就是所有面的面法線的和。然後在程式初始化的時候,我們就可以呼叫這個函式來進行對模型的初始化。

最後就是裡利用opengl來渲染模型了。有了上面的所有資訊,要渲染模型就很簡單了。我們只用利用畫三角形的方法就可以了。

view plaincopy to clipboardprint?

glbegin(gl_********s);  

for (int i = 0; i < mymodel.fnum; ++i)  

glend(); 

glbegin(gl_********s);

for (int i = 0; i < mymodel.fnum; ++i)

glend();

可以看到,渲染部分很簡單,就是在迴圈中依次訪問面列表中每個面。並且給出每個面每個頂點的法線。

利用opengl進行模型表現

利用opengl進行模型表現 這篇文章介紹一下用opengl來表現模型物件。比如用3dmax等工具做好乙個模型後,我們希望能夠在自己的程式中使用它。一般使用這些工具的匯出功能匯出特定的檔案,然後讀取其中我們感興趣的部分,再把這些感興趣的資料在我們的程式中組織好就可以了。利用opengl來表現靜態模型...

OpenGL 光照模型

材質有三種,也就是對光有三種反射 材質被分為了三個屬性,也分別用三個引數來刻畫 對於乙個頂點,有四個向量來刻畫其光照 計算的時候也分為鏡面 漫和環境三類,之後再疊加起來即得到光照下的顏色 向量nlvr 求解顏色 鏡面反射 is rs max v r a,0 ls 環境反射 ia ra la於是 i ...

opengl 模型載入

乙個非常流行的模型導入庫是assimp,它是open asset import library 開放的資產導入庫 的縮寫 assimp資料結構的 簡化 模型如下 opengl中定義乙個頂點,每個頂點包含乙個位置向量 乙個法向量和乙個紋理座標向量 struct vertex 紋理資料,儲存了紋理的id...