3D 幾何物體 三角網格的表示與顯示(obj)

2021-08-28 14:26:44 字數 2189 閱讀 9578

obj檔案格式

obj是一種標準的3d模型檔案格式;軟體:3dsmax,lightware,maya都支援obj檔案的讀寫;

obj是以純文字的形式儲存了模型的頂點、法線和紋理座標和材質使用資訊;

格式:字首引數1 引數2 引數3.......

字首說明

v表示本行指定乙個頂點 

此字首後跟著3個單精度浮點數,分別表示頂點的x,y,z座標值

vt表示本行指定乙個紋理座標 

此字首後跟著兩個單精度浮點數,分別表示此紋理座標的u,v值

vn表示本行指定乙個法線向量 

此字首後跟著3個單精度浮點數,分別表示頂點法向量x,y,z座標值

f表示本行指定乙個表面(face) 

此字首後面的資料見「面的格式說明」

usemtl

此字首後只跟著乙個引數。該引數指定了從此行之後到下乙個以usemtl開頭的行

之間的所有表面所使用的材質名稱。該材質可以在此obj檔案所附屬的mtl檔案

中找到具體資訊。

mtllib

此字首後只跟著乙個引數,該引數指定了此obj檔案所使用的材質庫檔案(*.mtl)

的檔案路徑

參考:面的格式說明:

f  頂點座標索引 / 紋理座標索引 / 頂點法向索引

f vertex / texture / normal

其中,紋理座標索引/頂點法向索引可以為空;

f 1 2 3 等同於 f 1// 2// 3//

f 1/3 2/5 3/4 (頂點法向索引為空)

f 1/3/4 2/5/6 3/4/2

f 1//4 2//6 3//2

obj格式對紋理的支援是通過關鍵字mtllib指定的;

newmtl blinn1sg 

illum 4 

ka 0.2 0.2 0.2 

kd 1 1 1 

ks 0.2 0.2 0.2 

tf 1.00 1.00 1.00 

map_kd carp.bmp

ka——物體材質中環境光的顏色

kd——物體材質中漫反射光的顏色

ks——物體材質中鏡面光顏色

map_kd——紋理影象的路徑

三角網格的資料結構

三角網格的資料由幾何和連線關係組成;

幾何包括頂點的x,y,z座標及頂點的法向量等;

連線關係即三角網格是如何連在一塊的;

常用的三角網格資料結構包括:

頂點-邊(vertex-edge)

頂點-面(vertex-face)

鄰接矩陣 和 鄰接表

頂點-邊-面

半邊結構(half edge)

紋理資料

obj檔案中不但包含頂點幾何座標,還可以指定紋理資料,mtllib命令指定了材質屬性的檔案,材質屬性檔案中可以指定紋理影象所在的檔案。紋理的顯示包含三個步驟:

1、生成紋理資料

2、將紋理資料載入紋理記憶體

3、將紋理資料對映到物體表面

mtl 格式檔案

newmtl name #name為材質名稱

ns exponent #exponent指定材質的反射指數,定義了反射高光度

ka r g b #環境光反射,g和b兩引數是可選的,如果只指定了r的值,則g和b的值都等於r的值

kd r g b #漫反射

ks r g b #鏡面光反射

# ka kd ks 都還有其他兩種格式,可查閱其他資料:

#kd spectral file.rfl factor

#kd xyz x y z

map_kd picture.png #固有紋理貼圖

map_ka picture1.png #陰影紋理貼圖

map_ks picture2.png #高光紋理貼圖 illum 2

#光照模型

#光照模型屬性如下:

#0. 色彩開,陰影色關

#1. 色彩開,陰影色開

#2. 高光開

#3. 反射開,光線追蹤開

#4. 透明: 玻璃開 反射:光線追蹤開

#5. 反射:菲涅爾衍射開,光線追蹤開

#6. 透明:折射開 反射:菲涅爾衍射關,光線追蹤開

#7. 透明:折射開 反射:菲涅爾衍射開,光線追蹤開

#8. 反射開,光線追蹤關

#9. 透明: 玻璃開 反射:光線追蹤關

#10. 投射陰影於不可見表面

學習OpenGL (四) 3D空間中的三角形

gl s圖元通過連線三個頂點繪製三角形,得到如圖所示的三角形 頂點的指定次序以及方向的組合稱為環繞,圖中三角形是被認為具有順時針方向的環繞。在預設情況下,opengl認為逆時針方向環繞的一面是多邊形的正面,因此圖中的三角形為圖形的反面。如果想改變opengl這一預設行為,可以呼叫如下函式 glfro...

3D空間中射線與三角形的交叉檢測演算法

射線ray,在3d圖形學中有很多重要的應用。比如,pick操作就是使用射線ray來實現的,還有諸如子彈射線的碰撞檢測等等都可以使用射線ray來完成。所以,在本次部落格中,將會簡單的像大家介紹下,如何進行ray 的交叉檢測。在tomas moller的mt97 中,提出了一種新的演算法。這種演算法能夠...

3D空間中射線與三角形的交叉檢測演算法

射線ray,在3d圖形學中有非常多重要的應用。比方,pick操作就是使用射線ray來實現的,還有諸如子彈射線的碰撞檢測等等都能夠使用射線ray來完畢。所以,在本次部落格中,將會簡單的像大家介紹下。怎樣進行ray 的交叉檢測。在tomas moller的mt97 中,提出了一種新的演算法。這樣的演算法...