概述:
obj是一種3d模型格式,很適合與3D模型之間互導。目前幾乎所有知名的3D軟件都支持obj文件的讀寫。
obj文件在導出時一般包括兩個文件.obj文件和.mtl文件。其中obj文件表示模型網絡文件,mtl文件表示模型使用的材質。
Obj示例:
# 一些注釋
mtllib cube.mtl
g default
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
v -0.500000 0.500000 -0.500000
v 0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
vt 0.998008 0.998008
vt 0.001992 0.998008
vt 0.998008 0.001992
vt 0.001992 0.001992
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
s 1
g pCube1
usemtl file1SG
f 1/1/1 2/2/2 3/3/3
f 3/3/3 2/2/2 4/4/4
s 2
f 3/13/5 4/14/6 5/15/7
f 5/15/7 4/14/6 6/16/8
s 3
f 5/21/9 6/22/10 7/23/11
f 7/23/11 6/22/10 8/24/12
s 4
f 7/17/13 8/18/14 1/19/15
f 1/19/15 8/18/14 2/20/16
s 5
f 2/5/17 8/6/18 4/7/19
f 4/7/19 8/6/18 6/8/20
s 6
f 7/9/21 1/10/22 5/11/23
f 5/11/23 1/10/22 3/12/24
特點說明:
OBJ文件不需要任何種文件頭,文件由一行行文本組成,注釋行以符號“#”為開頭,空格和空行可以隨意加到文件中。
有字的行都由一兩個標記字母也就是關鍵字(Keyword)開頭,關鍵字可以說明這一行是什么樣的數據。
多行可以邏輯地連接在一起表示一行,方法是在每一行最后添加一個連接符(\)。 注意連接符(\)后面不能出現空格或Tab格,否則將導致文件出錯。
關鍵字:
頂點數據(Vertex data):
v 幾何體頂點(Geometric vertices)
vt 貼圖坐標點(Texture vertices)
vn 頂點法線(Vertex normals)
vp 參數空格頂點 (Parameter space vertices)
自由形態曲線(Free-form curve)/表面屬性(surface attributes):
deg 度(Degree)
bmat 基礎矩陣(Basis matrix)
step 步尺寸(Step size)
cstype 曲線或表面類型 (Curve or surface type)
元素(Elements):
p 點(Point)
l 線(Line)
f 面(Face)
curv 曲線(Curve)
curv2 2D曲線(2D curve)
surf 表面(Surface)
自由形態曲線(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)
成組(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)
重點元素詳解:
- v頂點
- vt紋理坐標
- vn頂點法向量
- f 面
一、頂點
v -0.500000 -0.500000 0.500000 v 0.500000 -0.500000 0.500000
- 格式:v x y z
- 意義:每個頂點的坐標
二、紋理坐標
vt 0.001992 0.001992 vt 0.998008 0.001992
- 格式:vt u v w
- 意義:繪制模型的三角面片時,每個頂點取像素點時對應的紋理圖片上的坐標。紋理圖片的坐標指的是,紋理圖片如果被放在屏幕上顯示時,以屏幕左下角為原點的坐標。
- 注意:w一般用於形容三維紋理,大部分是用不到的,基本都為0。
三、頂點法向量
vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000
- 格式:vn x y z
- 意義:繪制模型三角面片時,需要確定三角面片的朝向,整個面的朝向,是由構成每個面的頂點對應的頂點法向量的做矢量和決定的(xyz的坐標分別相加再除以3得到的)。
四、面
f 3/13/5 4/14/6 5/15/7 f 5/15/7 4/14/6 6/16/8
- 格式 :f v/vt/vn v/vt/vn v/vt/vn(f 頂點索引 / 紋理坐標索引 / 頂點法向量索引)
- 意義:繪制三角面片的依據,每個三角面片由三個f構成,由f可以確定頂點、頂點的對應的紋理坐標(提取紋理圖片對應該坐標的像素點)、通過三個頂點對應的頂點法向量可以確定三角面的方向。
- 補充:有些模型可能會出現四邊形的繪制方式,那樣的模型關於面的數據描述是這樣的 f v/vt/vn v/vt/vn v/vt/vn v/vt/vn ,比三角面繪制方式多一項數據。
補充說明:
- 頂點的個數與頂點法向量的個數一樣多。
- 頂點的個數不一定與紋理坐標的個數一樣多,因為有可能很多頂點公用一個紋理坐標的像素。
- 面索引的個數也與其余數據數量無關。
- 最終每個三角面的顏色,是由構成這個三角面的三個頂點進行插值計算(有例如:一個三角面其中兩個頂點對應的紋理坐標是黑色的,另外一個是白色,那整個面呈現的顏色是由黑變白漸變,而不是三個顏色值的平均值。這就是插值的作用)來確定。所以面的顏色有可能不與每個點的顏色一致。
原文地址:https://blog.csdn.net/xyh930929/article/details/82260581