keil obj 文件 结构_OBJ文件格式详解
OBJ文件是Alias|Wavefront公司為它的一套基于工作站的3D建模和動畫軟件"Advanced Visualizer"開發的一種標準3D模型文件格式,很適合用于3D軟件模型之間的互導,也可以通過Maya讀寫。比如你在3dsMax或LightWave中建了一個模型,想把它調到Maya里面渲染或動畫,導出OBJ文件就是一種很好的選擇。目前幾乎所有知名的3D軟件都支持OBJ文件的讀寫,不過其中很多需要通過插件才能實現。
OBJ文件是一種文本文件,可以直接用寫字板打開進行查看和編輯修改。另外,有一種與此相關二進制文件格式(*.MOD),其作為專利未公開,因此這里不作討論。
1、OBJ文件的特點
OBJ3.0文件格式支持直線(Line)、多邊形(Polygon)、表面(Surface)和自由形態曲線(Free-form Curve)。直線和多邊形通過它們的點來描述,曲線和表面則根據它們的控制點和依附于曲線類型的額外信息來定義,這些信息支持規則和不規則的曲線,包括那些基于貝塞爾曲線(Bezier)、B樣條(B-spline)、基數(Cardinal/Catmull-Rom)和泰勒方程(Taylor equations)的曲線。其他特點如下:
(1)OBJ文件是一種3D模型文件。不包含動畫、材質特性、貼圖路徑、動力學、粒子等信息。
(2)OBJ文件主要支持多邊形(Polygons)模型。雖然也支持曲線(Curves)、表面(Surfaces)、點組材質(Point Group Materials),但Maya導出的OBJ文件并不包括這些信息。
(3)OBJ文件支持三個點以上的面,這一點很有用。很多其它的模型文件格式只支持三個點的面,所以導入Maya的模型經常被三角化了,這對于我們對模型進行再加工甚為不利。
(4)OBJ文件支持法線和貼圖坐標。在其它軟件中調整好貼圖后,貼圖坐標信息可以存入OBJ文件中,這樣文件導入Maya后只需指定一下貼圖文件路徑就行了,不需要再調整貼圖坐標。
2、OBJ文件的基本結構? ? OBJ文件不需要任何種文件頭(File Header),盡管經常使用幾行文件信息的注釋作為文件的開頭。OBJ文件由一行行文本組成,注釋行以符號“#”為開頭,空格和空行可以隨意加到文件中以增加文件的可讀性。有字的行都由一兩個標記字母也就是關鍵字(Keyword)開頭,關鍵字可以說明這一行是什么樣的數據。多行可以邏輯地連接在一起表示一行,方法是在每一行最后添加一個連接符(\)。 注意連接符(\)后面不能出現空格或Tab格,否則將導致文件出錯。
下列關鍵字可以在OBJ文件使用。在這個列表中, 關鍵字根據數據類型排列,每個關鍵字有一段簡短描述。
頂點數據(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)
3、OBJ文件實例
的確挺難理解,下面通過實例來具體講解。讓我們來創建一個OBJ文件,內容為一個四邊形,不過這一回我們不用3D軟件,而是用寫字板來創建。打開寫字板,把下面的5行代碼寫入,可以適當加一點注釋。保存文件為文本格式,文件名為"myObj.obj"。
???v?-0.58?0.84?0
v?2.68?1.17?0
v?2.84?-2.03?0
v?-1.92?-2.89?0
f?1?2?3?4
注意:代碼最后一定要按一下回車把光標切換到下一行,就是說加一個換行符(\n)。否則會看到如下錯誤信息:? ?// Error: line 1: OBJ file line 5: index out of range. //? ?// Error: line 1: Error reading file. //? ?在Maya中導入"myObj.obj"文件,會看到四邊形。這個四邊形的形狀是完全由前面的那5行代碼決定的。
我們來分析一下這些代碼。
v -0.58 0.84 0?畫一個四邊形需要四個頂點,這是第一個頂點,"v"表示頂點(vertex),"-0.58"為這個頂點的X軸坐標值,"0.84"為Y軸坐標值,"0"為Z軸坐標值。它的索引號是1。索引號是畫面時要用到的。? ?v 2.68 1.17 0 ?v 2.84 -2.03 0 ?v -1.92 -2.89 0?這分別是第二、三、四個頂點,它們的索引號分別是2,3,4。
f 1 2 3 4? ?現在開始畫面,"f"表示面(face),1,2,3,4是前面那四個頂點的索引號。請注意畫這個面連接點的順序,是從第一個點出發,依次連接第二、三、四個點。如果連接的順序不同所生成的面也會截然不同,例如"f 1 2 4 3"會產生一個交迭的面。
面的連接點是按順時針排列或逆時針排列,將決定面的法線方向(面的反正)。例如:"f 1 2 3 4"面的法線向外,"f 4 3 2 1"面的法線向里。 面的連接點順序錯誤,是導致導入模型產生碎面的一個重要原因。一個面不能出現兩個以上相同的頂點,這也是檢查OBJ文件出錯的一個要點。例如:"f 1 2 3 4 3",有兩個相同的頂點,索引號是3。一個面出現兩個相同頂點,可能造成程序的內存分配錯誤。
下面來研究一下Maya導出的OBJ文件。? ?在Maya中創建一個多邊形立方體,選中這個立方體,選擇菜單"File -> Export Selection..."導出格式為OBJ,文件名為"cube.obj",如果沒有此格式,請在Plug-in Manager中載入"objExport.mll"。 用寫字板打開"cube.obj",可以看到如下代碼:
#?The?units?used?in?this?file?are?centimeters.
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.000000?0.000000
vt?1.000000?0.000000
vt?0.000000?1.000000
vt?1.000000?1.000000
vt?0.000000?2.000000
vt?1.000000?2.000000
vt?0.000000?3.000000
vt?1.000000?3.000000
vt?0.000000?4.000000
vt?1.000000?4.000000
vt?2.000000?0.000000
vt?2.000000?1.000000
vt?-1.000000?0.000000
vt?-1.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?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?off
g?pCube1
usemtl?initialShadingGroup
f?1/1/1?2/2/2?4/4/3?3/3/4
f?3/3/5?4/4/6?6/6/7?5/5/8
f?5/5/9?6/6/10?8/8/11?7/7/12
f?7/7/13?8/8/14?2/10/15?1/9/16
f?2/2/17?8/11/18?6/12/19?4/4/20
f?7/13/21?1/1/22?3/3/23?5/14/24
這個文件看起來稍復雜一些,用到了許多關鍵詞,你可以對照前面的列表查看一下每個關鍵詞的意思。我來解釋一下:
"vt 1.000000 0.000000"這句"vt"代表點的貼圖坐標。
"vn 0.000000 0.000000 -1.000000"這句"vn"代表點的法線。
"s off"表示關閉光滑組。
"usemtl initialShadingGroup"表示使用的材質。
"f 7/13/21"這時在面的數據中多了貼圖坐標uv點和法線的索引號,索引號分別用左斜線(/)隔開。
格式:"f 頂點索引/uv點索引/法線索引"。
"g pCube1"表示組,這里的成組與Maya中的成組不一樣,這里的成組是指把"g pCube1"后出現的面都結合到一起,組成一個整的多邊形幾何體。
把"cube.obj"文件修改一下就知道成組的意思了。把"s off"這句后面的代碼替換成以下代碼:
usemtl?initialShadingGroup
g?pCube_Face1
f?1/1/1?2/2/2?4/4/3?3/3/4
g?pCube_Face2
f?3/3/5?4/4/6?6/6/7?5/5/8
g?pCube_Face3
f?5/5/9?6/6/10?8/8/11?7/7/12
g?pCube_Face4
f?7/7/13?8/8/14?2/10/15?1/9/16
g?pCube_Face5
f?2/2/17?8/11/18?6/12/19?4/4/20
g?pCube_Face6
f?7/13/21?1/1/22?3/3/23?5/14/24
導入Maya后可以看到,立方體的每個面是分離的,每個面的名稱分別是"pCube_Face(1~6)",可見組的名稱其實就是單獨幾何體的名稱。
可不可以用中文命名幾何體(組)呢?試試就知道了,把前面的代碼改成:
usemtl?initialShadingGroup
g?立方體面1
f?1/1/1?2/2/2?4/4/3?3/3/4
g?立方體面2
f?3/3/5?4/4/6?6/6/7?5/5/8
g?立方體面3
f?5/5/9?6/6/10?8/8/11?7/7/12
g?立方體面4
f?7/7/13?8/8/14?2/10/15?1/9/16
g?立方體面5
f?2/2/17?8/11/18?6/12/19?4/4/20
g?立方體面6
f?7/13/21?1/1/22?3/3/23?5/14/24
試一下,會發現模型順利的導入了。雖然物體的名稱都變亂碼了,可這并不是很嚴重的事。不過使用中文名并不總是這么順利,把"g 立方體面1"這行改為"g 選擇"再試試看,這回導入時模型根本無法出現,只會出現如下的錯誤信息:
// Error: line 1: Your OBJ file contains a line which is too long to be parsed. Please edit your obj file. //
// Error: line 1: Error reading file. //
由此可見,物體命名的不規范也是導致OBJ文件出錯的原因之一。
關于Maya的物體命名,英文名是很保險的,標點符號中只有下劃線(_)可用,數字不能用放到名稱的開頭,盡量不要用中、日、韓等雙字節文字。
OBJ文件不支持有孔的多邊形面。舉個例子說明一下:選擇Maya的創建多邊形工具(Polygons -> Create Polyon Tool),在視圖中畫一個四邊形,不要按回車,按Ctrl在四邊形中間點一下,可以繼續在四邊形中挖一個洞。把這個有孔的多邊形存成OBJ格式,在導入Maya時,會發現多邊形少了一塊。如果你把這也看成錯誤,現在至少你已經知道錯誤的原因了,就是OBJ文件不支持有孔的多邊形面。
4、OBJ文件的實際問題:
現在來討論一點比較實際的問題吧,就是一旦你遇到了一個出錯的OBJ文件,倒底該怎么辦?
當你打開OBJ文件后,往往會看到有幾萬行的代碼,你恐怕還沒本事情一眼看出錯誤所在行,除非程序的錯誤信息中已經告訴你錯誤行。如果你不知道錯誤在哪里,可以用排除法,弄清楚肯定正確的代碼范圍,通過縮減錯誤代碼范圍定位錯誤。例如,你先新建一個空的OBJ文件,把有錯的OBJ文件代碼粘貼一半過來,然后把這個只有一半代碼的新OBJ文件導入Maya。如果這時沒有錯誤信息,說明錯誤行是在另一半代碼中,可以從另一半代碼中再粘貼一部分代碼試試看;如果這時出現錯誤,說明錯誤行就在粘貼的代碼中,可以把粘貼過來的代碼刪去一部分再試試看。就這樣,逐步縮減范圍直到找到錯誤行為止。
這種方法雖然很麻煩,不過頗為有效。如果你不會編程,又遇到非常緊急的情況,這種方法還是值得一試的。
5、OBJ文件的更多細節:
簡單的OBJ格式寫法。
#?Simple?Wavefront?file
v?0.0?0.0?0.0
v?0.0?1.0?0.0
v?1.0?0.0?0.0
f?1?2?3
面可以使用負值索引,有時用負值索引描述面更為簡便。
v?-0.500000?0.000000?0.400000
v?-0.500000?0.000000?-0.800000
v?-0.500000?1.000000?-0.800000
v?-0.500000?1.000000?0.400000
f?-4?-3?-2?-1
"f -4 -3 -2 -1"這句索引值"-3"表示從"f"這行往上數第3個頂點,就是"v -0.500000 0.000000 -0.800000",其它的索引值以此類推。 因此與這一行等效的正值索引寫法為:"f 1 2 3 4"? ? OBJ文件不包含面的顏色定義信息,不過可以引用材質庫,材質庫信息儲存在一個后綴是".mtl"的獨立文件中。關鍵字"mtllib"即材質庫的意思。材質庫中包含材質的漫射(diffuse),環境(ambient),光澤(specular)的RGB(紅綠藍)的定義值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。"usemtl"指定了材質之后,以后的面都是使用這一材質,直到遇到下一個"usemtl"來指定新的材質。
指定材質的方法:
Cube?with?Materials:
#?This?cube?has?a?different?material
#?applied?to?each?of?its?faces.
mtllib?master.mtl
v?0.000000?2.000000?2.000000
v?0.000000?0.000000?2.000000
v?2.000000?0.000000?2.000000
v?2.000000?2.000000?2.000000
v?0.000000?2.000000?0.000000
v?0.000000?0.000000?0.000000
v?2.000000?0.000000?0.000000
v?2.000000?2.000000?0.000000
#?8?vertices
g?front
usemtl?red
f?1?2?3?4
g?back
usemtl?blue
f?8?7?6?5
g?right
usemtl?green
f?4?3?7?8
g?top
usemtl?gold
f?5?1?4?8
g?left
usemtl?orange
f?5?6?2?1
g?bottom
usemtl?purple
f?2?6?7?3
#?6?elements
貝塞爾片面(Bezier Patch):
Maya不能導出OBJ格式的貝塞爾片面,卻能夠導入它。導入的貝塞爾片面自動轉換為Nurbs表面。
#?3.0?Bezier?patch
v?-5.000000?-5.000000?0.000000
v?-5.000000?-1.666667?0.000000
v?-5.000000?1.666667?0.000000
v?-5.000000?5.000000?0.000000
v?-1.666667?-5.000000?0.000000
v?-1.666667?-1.666667?0.000000
v?-1.666667?1.666667?0.000000
v?-1.666667?5.000000?0.000000
v?1.666667?-5.000000?0.000000
v?1.666667?-1.666667?0.000000
v?1.666667?1.666667?0.000000
v?1.666667?5.000000?0.000000
v?5.000000?-5.000000?0.000000
v?5.000000?-1.666667?0.000000
v?5.000000?1.666667?0.000000
v?5.000000?5.000000?0.000000
#?16?vertices
cstype?bezier
deg?3?3
#?Example?of?line?continuation
surf?0.000000?1.000000?0.000000?1.000000?13?14?\
15?16?9?10?11?12?5?6?7?8?1?2?3?4
parm?u?0.000000?1.000000
parm?v?0.000000?1.000000
end
#?1?element
基數曲線(Cardinal Curve):
Maya好像不支持OBJ格式的曲線,導入時不會出現錯誤信息,卻也不會出現曲線。
#?3.0?Cardinal?curve
v?0.940000?1.340000?0.000000
v?-0.670000?0.820000?0.000000
v?-0.770000?-0.940000?0.000000
v?1.030000?-1.350000?0.000000
v?3.070000?-1.310000?0.000000
#?6?vertices
cstype?cardinal
deg?3
curv?0.000000?3.000000?1?2?3?4?5?6
parm?u?0.000000?1.000000?2.000000?3.000000?end
#?1?element
貼圖映射(Texture-Mapped):
#?A?2?x?2?square?mapped?with?a?1?x?1?square
#?texture?stretched?to?fit?the?square?exactly.
mtllib?master.mtl
v?0.000000?2.000000?0.000000
v?0.000000?0.000000?0.000000
v?2.000000?0.000000?0.000000
v?2.000000?2.000000?0.000000
vt?0.000000?1.000000?0.000000
vt?0.000000?0.000000?0.000000
vt?1.000000?0.000000?0.000000
vt?1.000000?1.000000?0.000000
#?4?vertices
usemtl?wood
#?The?first?number?is?the?point,
#?then?the?slash,
#?and?the?second?is?the?texture?point
f?1/1?2/2?3/3?4/4
#?1?element
總結
以上是生活随笔為你收集整理的keil obj 文件 结构_OBJ文件格式详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 花呗已出账单是什么意思
- 下一篇: flutter友盟分享_flutter中