keil obj 文件 结构_OBJ文件格式详解
OBJ文件是Alias|Wavefront公司為它的一套基于工作站的3D建模和動(dòng)畫(huà)軟件"Advanced Visualizer"開(kāi)發(fā)的一種標(biāo)準(zhǔn)3D模型文件格式,很適合用于3D軟件模型之間的互導(dǎo),也可以通過(guò)Maya讀寫(xiě)。比如你在3dsMax或LightWave中建了一個(gè)模型,想把它調(diào)到Maya里面渲染或動(dòng)畫(huà),導(dǎo)出OBJ文件就是一種很好的選擇。目前幾乎所有知名的3D軟件都支持OBJ文件的讀寫(xiě),不過(guò)其中很多需要通過(guò)插件才能實(shí)現(xiàn)。
OBJ文件是一種文本文件,可以直接用寫(xiě)字板打開(kāi)進(jìn)行查看和編輯修改。另外,有一種與此相關(guān)二進(jìn)制文件格式(*.MOD),其作為專利未公開(kāi),因此這里不作討論。
1、OBJ文件的特點(diǎn)
OBJ3.0文件格式支持直線(Line)、多邊形(Polygon)、表面(Surface)和自由形態(tài)曲線(Free-form Curve)。直線和多邊形通過(guò)它們的點(diǎn)來(lái)描述,曲線和表面則根據(jù)它們的控制點(diǎn)和依附于曲線類型的額外信息來(lái)定義,這些信息支持規(guī)則和不規(guī)則的曲線,包括那些基于貝塞爾曲線(Bezier)、B樣條(B-spline)、基數(shù)(Cardinal/Catmull-Rom)和泰勒方程(Taylor equations)的曲線。其他特點(diǎn)如下:
(1)OBJ文件是一種3D模型文件。不包含動(dòng)畫(huà)、材質(zhì)特性、貼圖路徑、動(dòng)力學(xué)、粒子等信息。
(2)OBJ文件主要支持多邊形(Polygons)模型。雖然也支持曲線(Curves)、表面(Surfaces)、點(diǎn)組材質(zhì)(Point Group Materials),但Maya導(dǎo)出的OBJ文件并不包括這些信息。
(3)OBJ文件支持三個(gè)點(diǎn)以上的面,這一點(diǎn)很有用。很多其它的模型文件格式只支持三個(gè)點(diǎn)的面,所以導(dǎo)入Maya的模型經(jīng)常被三角化了,這對(duì)于我們對(duì)模型進(jìn)行再加工甚為不利。
(4)OBJ文件支持法線和貼圖坐標(biāo)。在其它軟件中調(diào)整好貼圖后,貼圖坐標(biāo)信息可以存入OBJ文件中,這樣文件導(dǎo)入Maya后只需指定一下貼圖文件路徑就行了,不需要再調(diào)整貼圖坐標(biāo)。
2、OBJ文件的基本結(jié)構(gòu)? ? OBJ文件不需要任何種文件頭(File Header),盡管經(jīng)常使用幾行文件信息的注釋作為文件的開(kāi)頭。OBJ文件由一行行文本組成,注釋行以符號(hào)“#”為開(kāi)頭,空格和空行可以隨意加到文件中以增加文件的可讀性。有字的行都由一兩個(gè)標(biāo)記字母也就是關(guān)鍵字(Keyword)開(kāi)頭,關(guān)鍵字可以說(shuō)明這一行是什么樣的數(shù)據(jù)。多行可以邏輯地連接在一起表示一行,方法是在每一行最后添加一個(gè)連接符(\)。 注意連接符(\)后面不能出現(xiàn)空格或Tab格,否則將導(dǎo)致文件出錯(cuò)。
下列關(guān)鍵字可以在OBJ文件使用。在這個(gè)列表中, 關(guān)鍵字根據(jù)數(shù)據(jù)類型排列,每個(gè)關(guān)鍵字有一段簡(jiǎn)短描述。
頂點(diǎn)數(shù)據(jù)(Vertex data): ? ? ? ? v 幾何體頂點(diǎn)(Geometric vertices)
vt 貼圖坐標(biāo)點(diǎn)(Texture vertices)
vn 頂點(diǎn)法線(Vertex normals)
vp 參數(shù)空格頂點(diǎn) (Parameter space vertices)
自由形態(tài)曲線(Free-form curve)/表面屬性(surface attributes): deg ? 度(Degree)
bmat ? 基礎(chǔ)矩陣(Basis matrix)
step ? 步尺寸(Step size)
cstype 曲線或表面類型 (Curve or surface type)
元素(Elements): ? ? ?p ?點(diǎn)(Point)
l ?線(Line)
f ?面(Face)
curv ?曲線(Curve)
curv2 ?2D曲線(2D curve)
surf ?表面(Surface)
自由形態(tài)曲線(Free-form curve)/表面主體陳述(surface body statements):
parm 參數(shù)值(Parameter values )
trim 外部修剪循環(huán)(Outer trimming loop)
hole 內(nèi)部整修循環(huán)(Inner trimming loop)
scrv 特殊曲線(Special curve)
sp 特殊的點(diǎn)(Special point)
end ?結(jié)束陳述(End statement)
自由形態(tài)表面之間的連接(Connectivity between free-form surfaces):con 連接 (Connect)
成組(Grouping):
g ?組名稱(Group name)
s 光滑組(Smoothing group)
mg 合并組(Merging group)
o 對(duì)象名稱(Object name)
顯示(Display)/渲染屬性(render attributes): ? ?bevel 導(dǎo)角插值(Bevel interpolation)
c_interp 顏色插值(Color interpolation)
d_interp 溶解插值(Dissolve interpolation)
lod 細(xì)節(jié)層次(Level of detail)
usemtl 材質(zhì)名稱(Material name)
mtllib 材質(zhì)庫(kù)(Material library)
shadow_obj ?投射陰影(Shadow casting)
trace_obj ?光線跟蹤(Ray tracing)
ctech ?曲線近似技術(shù)(Curve approximation technique)
stech ?表面近似技術(shù) (Surface approximation technique)
3、OBJ文件實(shí)例
的確挺難理解,下面通過(guò)實(shí)例來(lái)具體講解。讓我們來(lái)創(chuàng)建一個(gè)OBJ文件,內(nèi)容為一個(gè)四邊形,不過(guò)這一回我們不用3D軟件,而是用寫(xiě)字板來(lái)創(chuàng)建。打開(kāi)寫(xiě)字板,把下面的5行代碼寫(xiě)入,可以適當(dāng)加一點(diǎn)注釋。保存文件為文本格式,文件名為"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
注意:代碼最后一定要按一下回車把光標(biāo)切換到下一行,就是說(shuō)加一個(gè)換行符(\n)。否則會(huì)看到如下錯(cuò)誤信息:? ?// Error: line 1: OBJ file line 5: index out of range. //? ?// Error: line 1: Error reading file. //? ?在Maya中導(dǎo)入"myObj.obj"文件,會(huì)看到四邊形。這個(gè)四邊形的形狀是完全由前面的那5行代碼決定的。
我們來(lái)分析一下這些代碼。
v -0.58 0.84 0?畫(huà)一個(gè)四邊形需要四個(gè)頂點(diǎn),這是第一個(gè)頂點(diǎn),"v"表示頂點(diǎn)(vertex),"-0.58"為這個(gè)頂點(diǎn)的X軸坐標(biāo)值,"0.84"為Y軸坐標(biāo)值,"0"為Z軸坐標(biāo)值。它的索引號(hào)是1。索引號(hào)是畫(huà)面時(shí)要用到的。? ?v 2.68 1.17 0 ?v 2.84 -2.03 0 ?v -1.92 -2.89 0?這分別是第二、三、四個(gè)頂點(diǎn),它們的索引號(hào)分別是2,3,4。
f 1 2 3 4? ?現(xiàn)在開(kāi)始畫(huà)面,"f"表示面(face),1,2,3,4是前面那四個(gè)頂點(diǎn)的索引號(hào)。請(qǐng)注意畫(huà)這個(gè)面連接點(diǎn)的順序,是從第一個(gè)點(diǎn)出發(fā),依次連接第二、三、四個(gè)點(diǎn)。如果連接的順序不同所生成的面也會(huì)截然不同,例如"f 1 2 4 3"會(huì)產(chǎn)生一個(gè)交迭的面。
面的連接點(diǎn)是按順時(shí)針排列或逆時(shí)針排列,將決定面的法線方向(面的反正)。例如:"f 1 2 3 4"面的法線向外,"f 4 3 2 1"面的法線向里。 面的連接點(diǎn)順序錯(cuò)誤,是導(dǎo)致導(dǎo)入模型產(chǎn)生碎面的一個(gè)重要原因。一個(gè)面不能出現(xiàn)兩個(gè)以上相同的頂點(diǎn),這也是檢查OBJ文件出錯(cuò)的一個(gè)要點(diǎn)。例如:"f 1 2 3 4 3",有兩個(gè)相同的頂點(diǎn),索引號(hào)是3。一個(gè)面出現(xiàn)兩個(gè)相同頂點(diǎn),可能造成程序的內(nèi)存分配錯(cuò)誤。
下面來(lái)研究一下Maya導(dǎo)出的OBJ文件。? ?在Maya中創(chuàng)建一個(gè)多邊形立方體,選中這個(gè)立方體,選擇菜單"File -> Export Selection..."導(dǎo)出格式為OBJ,文件名為"cube.obj",如果沒(méi)有此格式,請(qǐng)?jiān)赑lug-in Manager中載入"objExport.mll"。 用寫(xiě)字板打開(kāi)"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
這個(gè)文件看起來(lái)稍復(fù)雜一些,用到了許多關(guān)鍵詞,你可以對(duì)照前面的列表查看一下每個(gè)關(guān)鍵詞的意思。我來(lái)解釋一下:
"vt 1.000000 0.000000"這句"vt"代表點(diǎn)的貼圖坐標(biāo)。
"vn 0.000000 0.000000 -1.000000"這句"vn"代表點(diǎn)的法線。
"s off"表示關(guān)閉光滑組。
"usemtl initialShadingGroup"表示使用的材質(zhì)。
"f 7/13/21"這時(shí)在面的數(shù)據(jù)中多了貼圖坐標(biāo)uv點(diǎn)和法線的索引號(hào),索引號(hào)分別用左斜線(/)隔開(kāi)。
格式:"f 頂點(diǎn)索引/uv點(diǎn)索引/法線索引"。
"g pCube1"表示組,這里的成組與Maya中的成組不一樣,這里的成組是指把"g pCube1"后出現(xiàn)的面都結(jié)合到一起,組成一個(gè)整的多邊形幾何體。
把"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
導(dǎo)入Maya后可以看到,立方體的每個(gè)面是分離的,每個(gè)面的名稱分別是"pCube_Face(1~6)",可見(jiàn)組的名稱其實(shí)就是單獨(dú)幾何體的名稱。
可不可以用中文命名幾何體(組)呢?試試就知道了,把前面的代碼改成:
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
試一下,會(huì)發(fā)現(xiàn)模型順利的導(dǎo)入了。雖然物體的名稱都變亂碼了,可這并不是很嚴(yán)重的事。不過(guò)使用中文名并不總是這么順利,把"g 立方體面1"這行改為"g 選擇"再試試看,這回導(dǎo)入時(shí)模型根本無(wú)法出現(xiàn),只會(huì)出現(xiàn)如下的錯(cuò)誤信息:
// 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. //
由此可見(jiàn),物體命名的不規(guī)范也是導(dǎo)致OBJ文件出錯(cuò)的原因之一。
關(guān)于Maya的物體命名,英文名是很保險(xiǎn)的,標(biāo)點(diǎn)符號(hào)中只有下劃線(_)可用,數(shù)字不能用放到名稱的開(kāi)頭,盡量不要用中、日、韓等雙字節(jié)文字。
OBJ文件不支持有孔的多邊形面。舉個(gè)例子說(shuō)明一下:選擇Maya的創(chuàng)建多邊形工具(Polygons -> Create Polyon Tool),在視圖中畫(huà)一個(gè)四邊形,不要按回車,按Ctrl在四邊形中間點(diǎn)一下,可以繼續(xù)在四邊形中挖一個(gè)洞。把這個(gè)有孔的多邊形存成OBJ格式,在導(dǎo)入Maya時(shí),會(huì)發(fā)現(xiàn)多邊形少了一塊。如果你把這也看成錯(cuò)誤,現(xiàn)在至少你已經(jīng)知道錯(cuò)誤的原因了,就是OBJ文件不支持有孔的多邊形面。
4、OBJ文件的實(shí)際問(wèn)題:
現(xiàn)在來(lái)討論一點(diǎn)比較實(shí)際的問(wèn)題吧,就是一旦你遇到了一個(gè)出錯(cuò)的OBJ文件,倒底該怎么辦?
當(dāng)你打開(kāi)OBJ文件后,往往會(huì)看到有幾萬(wàn)行的代碼,你恐怕還沒(méi)本事情一眼看出錯(cuò)誤所在行,除非程序的錯(cuò)誤信息中已經(jīng)告訴你錯(cuò)誤行。如果你不知道錯(cuò)誤在哪里,可以用排除法,弄清楚肯定正確的代碼范圍,通過(guò)縮減錯(cuò)誤代碼范圍定位錯(cuò)誤。例如,你先新建一個(gè)空的OBJ文件,把有錯(cuò)的OBJ文件代碼粘貼一半過(guò)來(lái),然后把這個(gè)只有一半代碼的新OBJ文件導(dǎo)入Maya。如果這時(shí)沒(méi)有錯(cuò)誤信息,說(shuō)明錯(cuò)誤行是在另一半代碼中,可以從另一半代碼中再粘貼一部分代碼試試看;如果這時(shí)出現(xiàn)錯(cuò)誤,說(shuō)明錯(cuò)誤行就在粘貼的代碼中,可以把粘貼過(guò)來(lái)的代碼刪去一部分再試試看。就這樣,逐步縮減范圍直到找到錯(cuò)誤行為止。
這種方法雖然很麻煩,不過(guò)頗為有效。如果你不會(huì)編程,又遇到非常緊急的情況,這種方法還是值得一試的。
5、OBJ文件的更多細(xì)節(jié):
簡(jiǎn)單的OBJ格式寫(xiě)法。
#?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
面可以使用負(fù)值索引,有時(shí)用負(fù)值索引描述面更為簡(jiǎn)便。
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"這行往上數(shù)第3個(gè)頂點(diǎn),就是"v -0.500000 0.000000 -0.800000",其它的索引值以此類推。 因此與這一行等效的正值索引寫(xiě)法為:"f 1 2 3 4"? ? OBJ文件不包含面的顏色定義信息,不過(guò)可以引用材質(zhì)庫(kù),材質(zhì)庫(kù)信息儲(chǔ)存在一個(gè)后綴是".mtl"的獨(dú)立文件中。關(guān)鍵字"mtllib"即材質(zhì)庫(kù)的意思。材質(zhì)庫(kù)中包含材質(zhì)的漫射(diffuse),環(huán)境(ambient),光澤(specular)的RGB(紅綠藍(lán))的定義值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。"usemtl"指定了材質(zhì)之后,以后的面都是使用這一材質(zhì),直到遇到下一個(gè)"usemtl"來(lái)指定新的材質(zhì)。
指定材質(zhì)的方法:
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不能導(dǎo)出OBJ格式的貝塞爾片面,卻能夠?qū)胨?dǎo)入的貝塞爾片面自動(dòng)轉(zhuǎn)換為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
基數(shù)曲線(Cardinal Curve):
Maya好像不支持OBJ格式的曲線,導(dǎo)入時(shí)不會(huì)出現(xiàn)錯(cuò)誤信息,卻也不會(huì)出現(xiàn)曲線。
#?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
總結(jié)
以上是生活随笔為你收集整理的keil obj 文件 结构_OBJ文件格式详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 花呗已出账单是什么意思
- 下一篇: 钱站有额度为什么审核不通过