Meshlab匯入obj檔案

2021-07-25 03:51:07 字數 2426 閱讀 8489

**位於vcglib\wrap\io_trimesh(注:為meshlab中vcg的源**)

static int open( openmeshtype &m, const char * filename, info &oi)

if (oi.mask == 0)

loadmask(filename, oi);

meshlab在open之前有單獨呼叫loadmask

大致流程如下:

1.獲取檔案長度,初始化各種標誌

2.遍歷每一行,統計頂點數量、法線數量、紋理座標數量、面數量,同時修改部分標記量的值

3.根據統計的資訊開啟部分表計量,比如如果頂點數量與紋理座標數量一致,開啟iom_verttexcoord標記等

接著將通過檔案分析得到的mask與mesh本身設定的mask統一

mask::clampmask(m,oi.mask);
1.根據點的數量分配記憶體

vertexiterator vi = vcg::tri

::allocator

::addvertices(m,oi.numvertices);

2.解析以v開頭的行,讀取點的座標資訊,如果有顏色就讀取顏色

解析以vt開頭的行,先將紋理座標資料存放在臨時的vector中std::vectortexcoords;

解析以vn開頭的行,先將法線資訊存放在臨時的vector中std::vectornormals

解析以f或者q開頭的行,此處以常規的f為例,也就是trimesh mesh

1.

std::vector

> polygonvect(1) 多邊形容器

2.std::vector

indexvvect(vertexespe***ce) 頂點序號

3.std::vector

indexnvect(vertexespe***ce); 法線序號

4.std::vector

indextvect(vertexespe***ce); 紋理座標序號

5.std::vector

indextriangulatedvect; 三角形序號

解析面資料的序號資訊
//分別解析頂點  法線  紋理的序號

splittoken(tokens[pi+1], indexvvect[pi],indexnvect[pi],indextvect[pi], inputmask);

//確保序號正確

goodobjindex(indexvvect[pi],numvertices);

goodobjindex(indextvect[pi],oi.numtexcoords);

//根據之前讀取的定點資料獲取頂點座標

polygonvect[0][pi].import(m.vert[indexvvect[pi]].cp());

三角化

根據面的定點數對面進行三角化,獲取三角形的頂點序號。一般mesh資料是三個點,那麼這種情況下只是簡單的獲取了序號

處理每個三角形

根據三角化之後的頂點序號處理每乙個三角形

//首先獲取面上每個點的頂點序號、紋理序號、法線序號

//三角化之後每個頂點的相對序號,也就是在當前面頂點中的序號

locind[iii]=indextriangulatedvect[pi+iii];

//根據相對序號獲取絕對序號,也就是在所有頂點中的序號

ff.v[iii]=indexvvect[ locind[iii] ];

ff.n[iii]=indexnvect[ locind[iii] ];

ff.t[iii]=indextvect[ locind[iii] ];

獲取面使用的紋理的序號

ff.tind=materials[currentmaterialidx].index

;

判斷頂點是否重複

if ((ff.v[0] == ff.v[1]) || (ff.v[0] == ff.v[2]) || (ff.v[1] == ff.v[2]))
將麵資訊新增到cmesho

之前解析的面資訊都在std::vectorindexedfaces中,所有的面解析完成之後,通過該容器建立面。

//分配記憶體

vcg::tri::allocator::addfaces(m,num********s);

//填寫面資訊

for(unsigned

int j=0;j.v

.size();++j)

*******

什麼是obj檔案

程式編譯時生成的中間 檔案。目標檔案,一般是程式編譯後的二進位制檔案,再通過鏈結器 link.exe 和資源檔案鏈結就成可執行檔案了。obj只給出了程式的相對位址,而可執行檔案是絕對位址。1 這個問題不是很簡單,你只看到了檔案從源 到exe檔案這個流程中的一小部分。要詳細的深究這個問題,需要很多時間...

OpenGL匯入的obj模型透明問題

在利用opengl匯入obj模型後,發現模型是透明的,在旋轉過程中特別難看,於是需要設定成非透明的實體模型。下面的圖是模型為透明的時候,看起來就讓人感覺很亂 由於一開始我們利用 glclear gl color buffer bit gl depth buffer bit 清除了緩衝區,所以只要設定...

OpenGL讀取Obj模型檔案

想要順利讀取obj模型檔案,先要了解這種檔案的格式,obj檔案格式是非常簡單的。這種檔案以純文字的形式儲存了模型的頂點 法線和紋理座標和材質使用資訊。obj檔案的每一行,都有極其相似的格式。在obj檔案中,每行的格式如下 字首 引數1 引數2 引數3 其中,字首標識了這一行所儲存的資訊型別。引數則是...