利用opengl進行模型表現
**
這篇文章介紹一下用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的資料型別,於是可以定義這樣的結構體,可以包含頂點的座標和法線資訊。
[cpp]view plain
copy
struct
vertex
;
這裡的頂點結構包含了頂點座標p和法線n。
然後就是面的資料型別
[cpp]view plain
copy
struct
face
;
乙個面由3個頂點構成,只要有了頂點的索引就可以了。
最後就是模型的資料型別了
[cpp]view plain
copy
struct
model
;
這個資料型別包含了模型頂點數vnum,面數fnum,指向頂點列表的指標vertlist和指向面列表的指標facelist。
然後這樣只要用model來定義乙個模型就可以了
model mymodel;
下面來看看如果從檔案中讀取資訊。可以把讀取檔案的部分寫成乙個函式,比如叫loadmodel,函式的引數只需要提供檔名就可以了。
[cpp]view plain
copy
void
loadmodel(
char
*fname)
for(int
i = 0; i
for(int
i = 0; i
} 上面的**比較長,但是內容很簡單。首先開啟檔案,然後分別以整型的方式讀取頂點個數和面個數,儲存在結構體變數中。然後為頂點列表和面列表動態申請記憶體空間,在迴圈中分別讀取每個資料。由於頂點包括法線資訊,所以這裡還進行了法線的計算。這裡採用平均法線,即把乙個頂點的多個法線加在一起,然後再進行單位化。由於乙個頂點可能被用於多個面,所以該頂點的法線就是所有面的面法線的和。然後在程式初始化的時候,我們就可以呼叫這個函式來進行對模型的初始化。
最後就是裡利用opengl來渲染模型了。有了上面的所有資訊,要渲染模型就很簡單了。我們只用利用畫三角形的方法就可以了。
[cpp]view plain
copy
glbegin(gl_********s);
for(
inti = 0; i
glend();
可以看到,渲染部分很簡單,就是在迴圈中依次訪問面列表中每個面。並且給出每個面每個頂點的法線。
Springboot讀取自定義配置檔案的幾種方法
server.port 9090 test.msg hello world springboot 1 使用 value方式 常用 restcontroller public class webcontroller private string msg index method requestmeth...
springboot讀取自定義配置檔案節點
今天和大家分享的是自定義配置資訊的讀取 近期有寫部落格這樣的計畫,分別交叉來寫springboot方面和springcloud方面的文章,因為springboot預計的篇章很多,這樣cloud的文章就需要等到很後面才能寫了 分享這兩種文章的原因主要是為了方便自己查詢資料使用和對將要使用的朋友起到便捷...
Springboot讀取自定義配置檔案節點
為了方便自己查詢資料使用和對將要使用的朋友起到便捷作用 實體對映自定義配置檔案的節點 實體對映多層級節點的值 1 shenniu 2 name 神牛003 然後通過 value標記來直接獲取屬性值,為了更好的展示資料到介面上定義了乙個 conf name介面 1 value 2 private st...