在最開始先貼出源碼的下載路徑:數組
最第一版本:http://download.csdn.net/detail/mahabharata_/9614958 數據結構
! 最新版本: 主體代碼 http://download.csdn.net/detail/mahabharata_/9821347函數
漏掉的一段reference.h :http://download.csdn.net/detail/mahabharata_/9847993工具
(對於最新版本,這兩個連接都要下載,由於我在reference.h中實現了一些接口)優化
原本是免費資源,可是CSDN換新版後給我調了。
由於CSDN沒法調整積分,若是沒有積分的能夠郵箱聯繫我直接發(liuzh96@outlook.com)。
this
【下載前請讀】spa
1. 這兩份資源,是我在大一時作的代碼。若須要瞭解進一步優化,請郵箱聯繫我。.net
2. 爲何分紅了兩部分上傳?由於CSDN的緣由,我至今沒法刪除已上傳過的資源,因此乾脆單獨上傳了以前漏掉的頭文件。我上傳過的大多數文件積分最初設置是0-5分,可是CSDN換成新版以後,個人全部資源都設成了須要積分下載,且原有積分都被提升了(我估計是CSDN須要各位充錢)。若是沒有積分的朋友,能夠郵箱聯繫我,我有時間給您單獨發~~~設計
可是!居然有人舉報我????我滴個天鴨,分享資源還要被罵的,何況這分數還不是我本身設置的,搞不明白!!!!! 生氣!!但願各路大仙們,有問題好好交流。說實話,我本沒有分享代碼的義務的,可是由於我本身在初學計算機圖形學時遇到太多困難,因此分享出這些入門級代碼也寫了一些小教程來幫助初學者。我也知道噴子是少數,可是國內爲啥分享的氛圍很差,我以爲很大程度上拖了這幫自私者的福。3d
不少涉及科研的工做天然不能分享,可是我仍是很樂意幫助初學者去入門這個領域,和討論學術性問題。我也開發了不少建模輔助性工具,免費分享出來。但願各位能經過個人代碼,對Computer Graphics感興趣。
程序執行結果以下:
這個程序是博主大二暑假寫的,如今的這一段話是發表這邊博文後的一年才加上的,回看那個時候的程序,我滴媽,我居然不會使用頂點數組啊,也沒有速度優化啊,並且只能支持單紋理文件,讀取方法也很是侷限。所以,如今在原來的基礎上從新上傳了一個最新版本。
說明:
兩個版本的代碼是Qt下,使用C++/OpenGL編寫的。
- 最初的版本:
1. 僅僅支持單個紋理、對mtl文件的諸多材質不能很好的處理。
2. 採用最原始的方法glvertex..()顯示頂點,計算效率很是低。
3. 這個版本是完整的工程文件,使用qt加載以後,能夠直接運行。
- 最新的版本:
1. 可以支持多個紋理文件,可以解析包含多種材質的mtl文件。
2. 使用vertex array改進繪製方式,渲染速度有了很大的提升~。
3. 這裏上傳的是.h和.cpp文件,在.h文件中僅僅包含幾個函數。能夠採用下面的代碼來讀取和顯示模型。
// 加載模型 ObjLoader loader; loader.loadFromFile("D:/ali.obj","D:/ali.mtl"); // 渲染模型 loader.renderObj();
使用個人代碼的一個要注意的地方:
須要將objLoader.cpp的72行,修改成你的電腦中紋理所在的文件夾路徑。以下圖所示:
三維模型比較常見的是obj模型和3ds模型,處理方法大同小異,下面先介紹一下obj文件的簡單處理方法:
OBJ文件的基本結構
OBJ文件由一行行文本組成,能夠用記事本打開。註釋行以符號「#」爲開頭,空格和空行能夠隨意加到文件中以增長文件的可讀性。有字的行都由一兩個標記字母也就是關鍵字(Keyword)開頭,關鍵字能夠說明這一行是什麼樣的數據。多行能夠邏輯地鏈接在一塊兒表示一行,方法是在每一行最後添加一個鏈接符(\)。 注意鏈接符(\)後面不能出現空格或Tab格,不然將致使文件出錯。
下列經常使用的關鍵字能夠在OBJ文件使用。
頂點數據(Vertex data):
v 幾何體頂點(Geometric vertices)
vt 貼圖座標點(Texture vertices)
vn 頂點法線(Vertex normals)
vp 參數空格頂點 (Parameter space vertices)
元素(Elements):
p 點(Point)
l 線(Line)
f 面(Face)
成組(Grouping):
g 組名稱(Group name)
o 對象名稱(Object name)
顯示(Display)/渲染屬性(render attributes):
usemtl 材質名稱(Material name)
mtllib 材質庫(Material library)
obj文件的一個實例
# The units used in this file are centimeters. g default v -0.500000 -0.500000 0.500000 v 0.500000 -0.500000 0.500000 v -0.500000 0.500000 0.500000 v 0.500000 0.500000 0.500000 v -0.500000 0.500000 -0.500000 v 0.500000 0.500000 -0.500000 v -0.500000 -0.500000 -0.500000 v 0.500000 -0.500000 -0.500000 vt 0.000000 0.000000 vt 1.000000 0.000000 vt 0.000000 1.000000 vt 1.000000 1.000000 vt 0.000000 2.000000 vt 1.000000 2.000000 vt 0.000000 3.000000 vt 1.000000 3.000000 vt 0.000000 4.000000 vt 1.000000 4.000000 vt 2.000000 0.000000 vt 2.000000 1.000000 vt -1.000000 0.000000 vt -1.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 -1.000000 0.000000 vn 0.000000 -1.000000 0.000000 vn 0.000000 -1.000000 0.000000 vn 0.000000 -1.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 s off g pCube1 usemtl initialShadingGroup f 1/1/1 2/2/2 4/4/3 3/3/4 f 3/3/5 4/4/6 6/6/7 5/5/8 f 5/5/9 6/6/10 8/8/11 7/7/12 f 7/7/13 8/8/14 2/10/15 1/9/16 f 2/2/17 8/11/18 6/12/19 4/4/20 f 7/13/21 1/1/22 3/3/23 5/14/24
這個文件看起來稍複雜一些,能夠對照前面的列表查看一下每一個keyword的意思:
"vt 1.000000 0.000000"這句"vt"表明點的紋理貼圖座標。
"vn 0.000000 0.000000 -1.000000"這句"vn"表明點的法線向量。
"s off"表示關閉光滑組。
"usemtl initialShadingGroup"表示使用的材質。
"f 7/13/21"這時在面的數據中多了頂點點和紋理座標和法線的索引號。這裏f包含三組頂點,意味一個三角面,固然有時候會是n角面。
格式:"f 頂點索引v/紋理uv點索引vt/法線索引vn"。
"g pCube1"表示組。
瞭解了這一些以後,咱們便可以設計專門的數據結構來存儲obj文件中的數據,並採用索引數組的方式渲染出模型,這裏很少贅述,諸位能夠參考一下代碼。