opengl讀取obj模型3

2021-09-24 02:28:05 字數 2541 閱讀 7185

第三版本相較於前兩個版本,新增了對 f 1//1 型別的支援(面 由點座標和法向量組成),以及對mtl檔案的讀取。

準備工作,準備乙個結構體來儲存材質資訊,然後由vector儲存即可

struct mmaterial

;

ka,kd,ks即相應的環境光,漫反射及鏡面反射的引數,mtexturename儲存著該材質的名稱,由mtl檔案讀入,mtextureid即紋理貼圖。

objmodel類新加入乙個成員變數mtlname,用於儲存材質名稱,方便從vector中查詢材質資訊。

class objmodel :public list

void loadobjmodel(const char*);

void print();

void objdraw();

private:

vectornormal, texcoord, position; //vector容器儲存法線,紋理座標及點的位置資訊

vecto***ce;

int vertnum;

int coordnum;

int nornum;

std::string mtlname;

};

修改loadobjmodel函式,使其能夠對mtl檔案進行讀寫。定義乙個全域性變數來儲存mtl資訊,std::vectormmtl;。

createtexture函式自己實現就好了。

void objmodel::loadobjmodel(const char* objfilename)

objmodel* tempmodel = new objmodel;

stringstream ssfilecontent((char*)filecontent); //流讀取檔案內容

string temp; //接受無關資訊

char szoneline[256]; //讀取一行的資料

while (!ssfilecontent.eof())

if (szoneline[1] == 'n') //法線資訊

else //點的位置資訊

}else if (szoneline[0] == 'f') //面資訊

else

}tempmodel->face.push_back(tempface);

}else if (szoneline[0] == '#') //處理注釋內容

else if (temp == "vertices")

else if (temp == "texture")

else if (temp == "vertex")

numtemp = temp;}}

else if (szoneline[0] == 'u')

else if (szoneline[0] == 'm') //處理材質庫

else if (temp == "ns")

else if (temp == "ka")

else if (temp == "kd")

else if (temp == "ks")

else if (temp == "map_kd")}}

}//end 該行非空

}//end while

delete tempmodel;

delete filecontent;

}

對照obj檔案,及mtl檔案,**很容易理解了,不多贅述。

需要注意的就是 **中的 string filename = "res/" + temp;    。因為在我的專案中,所有的資源檔案都儲存在了res檔案下,所以我檔案字首為res/,大家在使用**的時候,根據需求自行修改即可,也可以將其作為變數傳入函式,隨時修改字首即可。

下面進行objdraw的修改,使其能夠處理材質資訊。

void objmodel::objdraw()}}

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

if (coordnum == 0)

}else

}glend();

} vnum += vertnum;

cnum += coordnum;

nnum += nornum;//cout << "end model" << std::endl;

if (next() != nullptr)

else

return;

}

相當簡單的修改,從vector中查詢該材質資訊,進行設定即可。

效果圖:

沒辦法,建模功底差的要死,所以效果圖很慘。但是**是沒問題的

OpenGL讀取Obj模型檔案

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

opengl讀取OBJ模型檔案

要順利讀取 obj模型檔案,先要了解obj檔案的格式。obj檔案格式是非常簡單的,它以純文字的形式儲存了模型的頂點 法線和紋理座標和材質使用資訊。obj檔案的每行的格式如下 字首引數1引數 2引數3 其中,字首標識了這一行所儲存的資訊型別。引數則是具體的資料。obj檔案常見的的字首有 v表示本行指定...

OpenGL讀取Obj模型檔案

2012 09 07 19 16 01 分類 計算機圖形學 舉報 字型大小訂閱 昨天,幫助別人寫了乙個程式,讀取obj檔案中的3d模型,就學習了下使用opengl如何讀取這種檔案。想要順利讀取obj模型檔案,先要了解這種檔案的格式,obj檔案格式是非常簡單的。這種檔案以純文字的形式儲存了模型的頂點 ...