OBJ格式模型詳細介紹


一、OBJ是什么

OBJ 是一種幾何定義文件格式,Wavefront Technologies 公司在可視化加強動畫包中第一次使用了這個格式,文件格式是公開的,並具有及其優質的兼容性和跨平台、跨行業的通用性,在所有 3D 應用軟件中被支持。

OBJ 文件可以以 ASCII 編碼也可以以二進制格式編碼,以 ASCII 格式編碼的后綴名為 .obj,以二進制格式編碼的后綴名為 .mod。OBJ 格式的三維網格模型儲存了模型的頂點、面片、法向量紋理等幾何信息。

OBJ 文件使用標准的 Polygon(多邊形) 儲存格式,直接儲存頂點坐標和法線等數據,這導致 OBJ 文件無法導出骨骼動畫,只能儲存靜態模型和材質信息。


二、OBJ模型示例

obj 模型內部以文本存儲,例如從Model loading處獲取的一個立方體模型 cube.obj 的數據如下:

# Blender3D v249 OBJ File: untitled.blend
# www.blender3d.org
mtllib cube.mtl
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -1.000000
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
vt 0.748573 0.750412
vt 0.749279 0.501284
vt 0.999110 0.501077
vt 0.999455 0.750380
vt 0.250471 0.500702
vt 0.249682 0.749677
vt 0.001085 0.750380
vt 0.001517 0.499994
vt 0.499422 0.500239
vt 0.500149 0.750166
vt 0.748355 0.998230
vt 0.500193 0.998728
vt 0.498993 0.250415
vt 0.748953 0.250920
vn 0.000000 0.000000 -1.000000
vn -1.000000 -0.000000 -0.000000
vn -0.000000 -0.000000 1.000000
vn -0.000001 0.000000 1.000000
vn 1.000000 -0.000000 0.000000
vn 1.000000 0.000000 0.000001
vn 0.000000 1.000000 -0.000000
vn -0.000000 -1.000000 0.000000
usemtl Material_ray.png
s off
f 5/1/1 1/2/1 4/3/1
f 5/1/1 4/3/1 8/4/1
f 3/5/2 7/6/2 8/7/2
f 3/5/2 8/7/2 4/8/2
f 2/9/3 6/10/3 3/5/3
f 6/10/4 7/6/4 3/5/4
f 1/2/5 5/1/5 2/9/5
f 5/1/6 6/10/6 2/9/6
f 5/1/7 8/11/7 6/10/7
f 8/11/7 7/12/7 6/10/7
f 1/2/8 2/9/8 3/13/8
f 1/2/8 3/13/8 4/14/8

特點說明:

  • 注釋行以符號 “#” 為開頭,空格和空行可以隨意加到文件中。
  • 有字的行都由一兩個標記字母也就是關鍵字(Keyword)開頭,關鍵字可以說明這一行是什么樣的數據。
  • 多行可以邏輯地連接在一起表示一行,方法是在每一行最后添加一個連接符 (\)。 注意連接符 () 后面不能出現空格或 Tab 格,否則將導致文件出錯。
  • o用於引入一個新的 object。

三、關鍵字

頂點數據(Vertex data):

  • v 頂點(Vertices)
  • vt 紋理坐標(Texture vertices)
  • vn 頂點法向量(Vertex normals)
  • vp 參數空格頂點 (Parameter space vertices)

元素(Elements):

  • p 點(Point)
  • l 線(Line)
  • f 面(Face)
  • curv 曲線(Curve)
  • curv2 2D曲線(2D curve)
  • surf 表面(Surface)

成組(Grouping):

  • g 組名稱(Group name)
  • s 光滑組(Smoothing group)
  • mg 合並組(Merging group)
  • o 對象名稱(Object name)

顯示(Display)/渲染屬性(render attributes):

  • bevel 導角插值(Bevel interpolation)
  • c_interp 顏色插值(Color interpolation)
  • d_interp 溶解插值(Dissolve interpolation)
  • lod 細節層次(Level of detail)
  • usemtl 材質名稱(Material name)
  • mtllib 材質庫(Material library)
  • shadow_obj 投射陰影(Shadow casting)
  • trace_obj 光線跟蹤(Ray tracing)
  • ctech 曲線近似技術(Curve approximation technique)
  • stech 表面近似技術 (Surface approximation technique)

自由形態曲線(Free-form curve)/表面屬性(surface attributes):

  • deg 度(Degree)
  • bmat 基礎矩陣(Basis matrix)
  • step 步尺寸(Step size)
  • cstype 曲線或表面類型 (Curve or surface type)

自由形態曲線(Free-form curve)/表面主體陳述(surface body statements):

  • parm 參數值(Parameter values )
  • trim 外部修剪循環(Outer trimming loop)
  • hole 內部整修循環(Inner trimming loop)
  • scrv 特殊曲線(Special curve)
  • sp 特殊的點(Special point)
  • end 結束陳述(End statement)

自由形態表面之間的連接(Connectivity between free-form surfaces):

  • con 連接 (Connect)

四、重點關鍵字詳解

obj 格式主要有一下 4 種關鍵字:

1. v 頂點

v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000

v表示頂點位置,值分別為 x、y、z,即每個頂點在 X、Y、Z 軸的坐標。

  • 格式:v x y z
  • 意義:每個頂點的坐標

2. vt 頂點紋理坐標

vt 0.748573 0.750412
vt 0.749279 0.501284
vt 0.999110 0.501077
  • 格式:vt u v w
  • 意義:繪制模型的三角面片時,每個頂點取像素點時對應的紋理圖片上的坐標。紋理圖片的坐標指的是,紋理圖片如果被放在屏幕上顯示時,以屏幕左下角為原點的坐標。
  • 注意:w 一般用於形容三維紋理,大部分是用不到的,基本都為 0

3. vn 頂點法向量

vn 0.000000 0.000000 -1.000000
vn -1.000000 -0.000000 -0.000000
vn -0.000000 -0.000000 1.000000
  • 格式:vn x y z
  • 意義:繪制模型三角面片時,需要確定三角面片的朝向,整個面的朝向,是由構成每個面的頂點對應的頂點法向量的做矢量和決定的(xyz 的坐標分別相加再除以 3 得到的)。

4. f 面

f 5/1/1 1/2/1 4/3/1
f 5/1/1 4/3/1 8/4/1
f 3/5/2 7/6/2 8/7/2
  • 格式 :f v/vt/vn v/vt/vn v/vt/vn(f 頂點索引 / 紋理坐標索引 / 頂點法向量索引)

  • 意義:繪制三角面片的依據,每個三角面片由三個f構成,由f可以確定頂點、頂點的對應的紋理坐標(提取紋理圖片對應該坐標的像素點)、通過三個頂點對應的頂點法向量可以確定三角面的方向。

  • 補充:以 f 開頭的行表示面片,之后跟上索引語句來將頂點分配給面片,索引語句一共有四種格式:

    • 頂點索引:以f v1 v2 v3 …的格式分配的面片。v1、v2、v3 等是頂點序號,以文件中第一個 v 標志行為 1,逐個遞增。一個面片至少分配 3 個頂點,但可以分配超過 3 個頂點,即 obj 格式不保證三角面。面中頂點的聲明順序一般按逆時針方向,即遵循右手螺旋定則。
    • 紋理坐標索引:以f v1/vt1 v2/vt2 v3/vt3 …的格式分配的面片。v1、v2、v3 等是頂點序號,vt1、vt2、vt3 等是對應頂點的紋理坐標序號,序號分配方式和 v 類似。
    • 頂點法線索引:以f v1//vn1 v2//vn2 v3//vn3 …的格式分配的面片。v1、v2、v3 等是頂點序號,vn1、vn2、vn3 等是對應頂點的法線方向序號,序號分配方式和 v 類似。
    • 頂點紋理法線索引:以f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 …的格式分配的面片。v1、v2、v3 等是頂點序號,vt1、vt2、vt3等是對應頂點的紋理坐標序號,vn1、vn2、vn3 等是對應頂點的法線方向序號。

五、擴展

模型一般通過 3d 建模軟件,例如 Blender, 3DS Max 或者 Maya 等工具建模,導出時的數據格式變化較大,我們導入模型到 OpenGL 的任務就是:將一種模型數據文件表示的模型,轉換為 OpenGL 可以利用的數據。例如上面的 Obj 文件中,我們需要解析頂點位置,紋理坐標等數據,構成 OpenGL 可以渲染的 Mesh 對象。

obj 文件在導出時一般包括兩個文件 .obj 文件和 .mtl 文件。其中 obj 文件表示模型網絡文件,mtl 文件表示模型使用的材質。

補充說明

  1. 頂點的個數與頂點法向量的個數一樣多。
  2. 頂點的個數不一定與紋理坐標的個數一樣多,因為有可能很多頂點公用一個紋理坐標的像素。
  3. 面索引的個數也與其余數據數量無關。
  4. 最終每個三角面的顏色,是由構成這個三角面的三個頂點進行插值計算(有例如:一個三角面其中兩個頂點對應的紋理坐標是黑色的,另外一個是白色,那整個面呈現的顏色是由黑變白漸變,而不是三個顏色值的平均值。這就是插值的作用)來確定。所以面的顏色有可能不與每個點的顏色一致。

參考:

OpenGL學習腳印:模型加載初步-加載obj模型(load obj model)

OBJ格式模型詳細介紹



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM