第三版本相較於前兩個版本,新增了對 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檔案格式是非常簡單的。這種檔案以純文字的形式儲存了模型的頂點 ...