这篇教程本来是要放致到妙mel语初解第三章里讲.docx
- 文档编号:30075415
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:17
- 大小:84.43KB
这篇教程本来是要放致到妙mel语初解第三章里讲.docx
《这篇教程本来是要放致到妙mel语初解第三章里讲.docx》由会员分享,可在线阅读,更多相关《这篇教程本来是要放致到妙mel语初解第三章里讲.docx(17页珍藏版)》请在冰豆网上搜索。
这篇教程本来是要放致到妙mel语初解第三章里讲
这篇教程本来是要放致到"妙(mel)语初解"第三章里讲的,因为有人问到相关的问题,所以提前讲一下。
我们经常见到的*.obj文件有两种:
第一种是基于COFF(CommonObjectFileFormat)格式的OBJ文件(也称目标文件),这种格式用于编译应用程序;第二种是Alias|Wavefront公司推出的OBJ模型文件。
我要讲的OBJ文件格式是指第二种-OBJ模型文件。
说起3D文件格式,大家一定不会感到陌生,"*.3ds","*.max","*.lw","*.mb","*.dxf","*.obj",相信人人都能列举出几种来。
但是说起OBJ文件的具体特征,却很少有人能给出较为圆满的描述。
很多人认识OBJ文件是从使用Poser开始的,Poser是一款人体建模软件,要把Poser生成的人体导出到其它3D软件中进行再加工,就用到了OBJ文件。
OBJ文件是一种标准的3D模型文件格式,很适合用于3D软件模型之间的互导。
比如你在3dsMax或LightWave中建了一个模型,想把它调到Maya里面渲染或动画,导出OBJ文件就是一种很好的选择。
目前几乎所有知名的3D软件都支持OBJ文件的读写,不过很多软件需要通过插件才能做到这一点。
另外,作为一种优秀的文件格式,很多游戏引擎也都支持OBJ文件的读取。
了解OBJ文件格式有什么用呢?
如果你不学编程的话,用处确实不大。
不过,3D软件模型之间的互导是一件很常见的事情,不幸的是,目前的3D软件模型导出功能都不那么完美,经常会出现缺面少线的情况,有时还会遇到导出的模型根本打不开的情况。
如果情况非常紧急的话,你一定会不惜一切代价仔细研究,期望找到原因,解决问题。
在这种情况下,我的教程也许会对你有很大帮助。
OBJ文件是一种文本文件格式,这就意味着你可以直接用写字板打开进行查看修改,如果你能看懂每一行的内容是什么意思,相信距离你成功的解决问题已经不远了。
如果Maya自身的模型出错,也可以先转成OBJ格式,修改之后再导回Maya。
OBJ文件--概念
OBJ文件是Wavefront公司为它的一套基于工作站的3D建模和动画软件"AdvancedVisualizer"开发的一种文件格式,这种格式同样也以通过Maya读写。
要想知道一个文件是不是OBJ文件,通常根据这个文件名的后缀来判断,OBJ文件的后缀是".obj"。
OBJ文件是让人可读的文本,你可以直接用写字板打开对它进行编辑。
另外,有一种与此相关二进制文件格式(使用".MOD"后缀),二进制格式作为专利未公开,因此在这里我们不作讨论。
OBJ最近的有文档的版本是v3.0,代替以前的v2.11版本。
OBJ3.0格式支持多边形(Polygon),直线(Lines),表面(Surfaces),和自由形态曲线(Free-formCurves)。
直线和多角形通过它们的点来描述,曲线和表面则根据于它们的控制点和依附于曲线类型的额外信息来定义。
这些信息支持规则和不规则的曲线,包括那些基于贝塞尔(Bezier)曲线,B样条(B-spline),基数(Cardinal/Catmull-Rom样条),和泰勒方程(Taylorequations)的曲线。
OBJ文件--特点
(1)OBJ是一种3D模型文件,因此不包含动画、材质特性、贴图路径、动力学、粒子等信息。
(2)OBJ文件主要支持多边形(Polygons)模型。
虽然OBJ文件也支持曲线(Curves)、表面(Surfaces)、点组材质(PointGroupMaterials),但Maya导出的OBJ文件并不包括这些信息。
(3)OBJ文件支持三个点以上的面,这一点很有用。
很多其它的模型文件格式只支持三个点的面,所以我们导入Maya的模型经常被三角化了,这对于我们对模型的再加工甚为不利。
(4)OBJ文件支持法线和贴图坐标。
在其它软件中调整好贴图后,贴图坐标信息可以存入OBJ文件中,这样文件导入Maya后只需指定一下贴图文件路径就行了,不需要再调整贴图坐标了。
OBJ文件--基本结构
OBJ文件不需要任何种文件头(FileHeader),尽管经常使用几行文件信息的注释作为文件的开头。
OBJ文件由一行行文本组成,注释行以一个“井”号(#)为开头,空格和空行可以随意加到文件中以增加文件的可读性。
有字的行都由一两个标记字母也就是关键字(Keyword)开头,关键字可以说明这一行是什么样的数据。
多行可以逻辑地连接在一起表示一行,方法是在每一行最后添加一个连接符(\)。
注意连接符(\)后面不能出现空格或tab格,否则将导致文件出错。
下列关键字可以在OBJ文件使用。
在这个列表中,关键字根据数据类型排列,每个关键字有一段简短描述。
顶点数据(Vertexdata):
v几何体顶点(Geometricvertices)
vt贴图坐标点(Texturevertices)
vn顶点法线(Vertexnormals)
vp参数空格顶点(Parameterspacevertices)
自由形态曲线(Free-formcurve)/表面属性(surfaceattributes):
deg度(Degree)
bmat基础矩阵(Basismatrix)
step步尺寸(Stepsize)
cstype曲线或表面类型(Curveorsurfacetype)
元素(Elements):
p点(Point)
l线(Line)
f面(Face)
curv曲线(Curve)
curv22D曲线(2Dcurve)
surf表面(Surface)
自由形态曲线(Free-formcurve)/表面主体陈述(surfacebodystatements):
parm参数值(Parametervalues)
trim外部修剪循环(Outertrimmingloop)
hole内部整修循环(Innertrimmingloop)
scrv特殊曲线(Specialcurve)
sp特殊的点(Specialpoint)
end结束陈述(Endstatement)
自由形态表面之间的连接(Connectivitybetweenfree-formsurfaces):
con连接(Connect)
成组(Grouping):
g组名称(Groupname)
s光滑组(Smoothinggroup)
mg合并组(Merginggroup)
o对象名称(Objectname)
显示(Display)/渲染属性(renderattributes):
bevel导角插值(Bevelinterpolation)
c_interp颜色插值(Colorinterpolation)
d_interp溶解插值(Dissolveinterpolation)
lod细节层次(Levelofdetail)
usemtl材质名称(Materialname)
mtllib材质库(Materiallibrary)
shadow_obj投射阴影(Shadowcasting)
trace_obj光线跟踪(Raytracing)
ctech曲线近似技术(Curveapproximationtechnique)
stech表面近似技术(Surfaceapproximationtechnique)
的确挺难理解,所以要用实例来说明。
OBJ文件--实例:
下面通过实例来具体讲解。
OBJ文件记录一个四边形的代码:
v-0.580.840
v2.681.170
v2.84-2.030
v-1.92-2.890
f1234
让我们来创建一个OBJ文件,不过这一回我们不用3D软件,而是用写字板来创建。
打开写字板,把上面的5行代码写上去,可以适当加一点注释。
保存文件为文本格式,文件名为"myObj.obj",如图。
注意:
代码最后一定要按一下回车把光标切换到下一行,就是说加一个换行符(\n)。
否则会看到如下错误信息:
//Error:
line1:
OBJfileline5:
indexoutofrange.//
//Error:
line1:
Errorreadingfile.//
点击放大
在Maya中导入"myObj.obj"文件,看见了吧,导入了一个四边形。
这个四边形的形状是完全由前面的那5行代码决定的,下面我们来分析一个这些代码。
v-0.580.840
画一个四边形需要四个顶点,这是第一个顶点,"v"表示顶点(vertex),"-0.58"为这个顶点的X轴坐标值,"-0.84"为Y轴坐标值,"0"为Z轴坐标值。
这是第一个顶点,它的索引号是1。
索引号是画面时要用到的。
v2.681.170
v2.84-2.030
v-1.92-2.890
这分别是第二、三、四个顶点,它们的索引号分别是2,3,4。
f1234
f1234
f1234
现在开始画面,"f"表示面(face),1,2,3,4是前面那四个顶点的索引号。
请注意画这个面连接点的顺序,是从第一个点出发,依次连接第二、三、四个点。
如果连接的顺序不同所生成的面也会截然不同,例如"f1243"会产生一个交迭的面,如图。
面的连接点是按顺时针排列或逆时针排列,将决定面的法线方向(面的反正)。
例如:
"f1234"面的法线向外,"f4321"面的法线向里。
面的连接点顺序错误,是导致导入模型产生碎面的一个重要原因。
一个面不能出现两个以上相同的顶点,这也是检查OBJ文件出错的一个要点。
例如:
"f12343",有两个相同的顶点,索引号是3。
一个面出现两个相同顶点,可能造成程序的内存分配错误。
下面来研究一下Maya导出的OBJ文件。
在Maya中创建一个多边形立方体,选中这个立方体,选择菜单"File->ExportSelection..."导出格式为OBJ,文件名为"cube.obj",如果没有此格式,请在Plug-inManager中载入"objExport.mll"。
用写字板打开"cube.obj",可以看到如下代码:
#Theunitsusedinthisfilearecentimeters.
gdefault
v-0.500000-0.5000000.500000
v0.500000-0.5000000.500000
v-0.5000000.5000000.500000
v0.5000000.5000000.500000
v-0.5000000.500000-0.500000
v0.5000000.500000-0.500000
v-0.500000-0.500000-0.500000
v0.500000-0.500000-0.500000
vt0.0000000.000000
vt1.0000000.000000
vt0.0000001.000000
vt1.0000001.000000
vt0.0000002.000000
vt1.0000002.000000
vt0.0000003.000000
vt1.0000003.000000
vt0.0000004.000000
vt1.0000004.000000
vt2.0000000.000000
vt2.0000001.000000
vt-1.0000000.000000
vt-1.0000001.000000
vn0.0000000.0000001.000000
vn0.0000000.0000001.000000
vn0.0000000.0000001.000000
vn0.0000000.0000001.000000
vn0.0000001.0000000.000000
vn0.0000001.0000000.000000
vn0.0000001.0000000.000000
vn0.0000001.0000000.000000
vn0.0000000.000000-1.000000
vn0.0000000.000000-1.000000
vn0.0000000.000000-1.000000
vn0.0000000.000000-1.000000
vn0.000000-1.0000000.000000
vn0.000000-1.0000000.000000
vn0.000000-1.0000000.000000
vn0.000000-1.0000000.000000
vn1.0000000.0000000.000000
vn1.0000000.0000000.000000
vn1.0000000.0000000.000000
vn1.0000000.0000000.000000
vn-1.0000000.0000000.000000
vn-1.0000000.0000000.000000
vn-1.0000000.0000000.000000
vn-1.0000000.0000000.000000
soff
gpCube1
usemtlinitialShadingGroup
f1/1/12/2/24/4/33/3/4
f3/3/54/4/66/6/75/5/8
f5/5/96/6/108/8/117/7/12
f7/7/138/8/142/10/151/9/16
f2/2/178/11/186/12/194/4/20
f7/13/211/1/223/3/235/14/24
这个文件看起来稍复杂一些,用到了许多关键词,你可以对照前面的列表查看一下每个关键词的意思。
我来解释一下。
"vt1.0000000.000000"这句"vt"代表点的贴图坐标。
"vn0.0000000.000000-1.000000"这句"vn"代表点的法线。
"soff"表示关闭光滑组。
"usemtlinitialShadingGroup"表示使用的材质。
"f7/13/21"这时在面的数据中多了贴图坐标uv点和法线的索引号,索引号分别用左斜线(/)隔开。
格式:
"f顶点索引/uv点索引/法线索引"。
"gpCube1"表示组,这里的成组与Maya中的成组不一样,这里的成组是指把"gpCube1"后出现的面都结合到一起,组成一个整的多边形几何体。
把"cube.obj"文件修改一下就知道成组的意思了。
把"soff"这句后面的代码替换成以下代码:
usemtlinitialShadingGroup
gpCube_Face1
f1/1/12/2/24/4/33/3/4
gpCube_Face2
f3/3/54/4/66/6/75/5/8
gpCube_Face3
f5/5/96/6/108/8/117/7/12
gpCube_Face4
f7/7/138/8/142/10/151/9/16
gpCube_Face5
f2/2/178/11/186/12/194/4/20
gpCube_Face6
f7/13/211/1/223/3/235/14/24
导入Maya后可以看到,立方体的每个面是分离的,每个面的名称分别是"pCube_Face(1~6)",可见组的名称其实就是单独几何体的名称。
可不可以用中文命名几何体(组)呢?
试试就知道了,把前面的代码改成:
usemtlinitialShadingGroup
g立方体面1
f1/1/12/2/24/4/33/3/4
g立方体面2
f3/3/54/4/66/6/75/5/8
g立方体面3
f5/5/96/6/108/8/117/7/12
g立方体面4
f7/7/138/8/142/10/151/9/16
g立方体面5
f2/2/178/11/186/12/194/4/20
g立方体面6
f7/13/211/1/223/3/235/14/24
试一下,会发现模型顺利的导入了。
虽然物体的名称都变乱码了,可这并不是很严重的事。
不过使用中文名并不总是这么顺利,把"g立方体面1"这行改为"g选择"再试试看,这回导入时模型根本无法出现,只会出现如下的错误信息:
//Error:
line1:
YourOBJfilecontainsalinewhichistoolongtobeparsed.Pleaseedityourobjfile.//
//Error:
line1:
Errorreadingfile.//
由此可见,物体命名的不规范也是导致OBJ文件出错的原因之一。
OBJ文件不支持有孔的多边形面。
举个例子说明一下:
选择Maya的创建多边形工具(Polygons->CreatePolyonTool),在视图中画一个四边形,不要按回车,按Ctrl在四边形中间点一下,可以继续在四边形中挖一个洞。
把这个有孔的多边形存成OBJ格式,在导入Maya时,会发现多边形少了一块。
如果你把这也看成错误,现在至少你已经知道错误的原因了,就是OBJ文件不支持有孔的多边形面。
OBJ文件--实际问题:
现在来讨论一点比较实际的问题吧,就是一旦你遇到了一个出错的OBJ文件,倒底该怎么办?
当你打开OBJ文件后,往往会看到有几万行的代码,你恐怕还没本事情一眼看出错误所在行,除非程序的错误信息中已经告诉你错误行。
如果你不知道错误在哪里,可以用排除法,弄清楚肯定正确的代码范围,通过缩减错误代码范围定位错误。
例如,你先新建一个空的OBJ文件,把有错的OBJ文件代码粘贴一半过来,然后把这个只有一半代码的新OBJ文件导入Maya。
如果这时没有错误信息,说明错误行是在另一半代码中,可以从另一半代码中再粘贴一部分代码试试看;如果这时出现错误,说明错误行就在粘贴的代码中,可以把粘贴过来的代码删去一部分再试试看。
就这样,逐步缩减范围直到找到错误行为止。
这种方法虽然很麻烦,不过颇为有效。
如果你不会编程,又遇到非常紧急的情况,这种方法还是值得一试的。
OBJ文件--细节:
掌握了这么多差不多也够用了,不过由于网上详细讲解OBJ文件的中文文档很少,我还是再讲一些例子,给大家提供多一点的信息吧。
简单的OBJ格式写法。
#SimpleWavefrontfile
v0.00.00.0
v0.01.00.0
v1.00.00.0
f123
面可以使用负值索引,有时用负值索引描述面更为简便。
"f-4-3-2-1"这句索引值"-3"表示从"f"这行往上数第3个顶点,就是"v-0.5000000.000000-0.800000",其它的索引值以此类推。
因此与这一行等效的正值索引写法为:
"f1234"
v-0.5000000.0000000.400000
v-0.5000000.000000-0.800000
v-0.5000001.000000-0.800000
v-0.5000001.0000000.400000
f-4-3-2-1
OBJ文件不包含面的颜色定义信息,不过可以引用材质库,材质库信息储存在一个后缀是".mtl"的独立文件中。
关键字"mtllib"即材质库的意思。
材质库中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB(红绿蓝)的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。
"usemtl"指定了材质之后,以后的面都是使用这一材质,直到遇到下一个"usemtl"来指定新的材质。
下面的例子说明了指定材质的方法。
CubewithMaterials:
#Thiscubehasadifferentmaterial
#appliedtoeachofitsfaces.
mtllibmaster.mtl
v0.0000002.0000002.000000
v0.0000000.0000002.000000
v2.0000000.0000002.000000
v2.0000002.0000002.000000
v0.0000002.0000000.000000
v0.0000000.0000000.000000
v2.0000000.0000000.000000
v2.0000002.0000000.000000
#8vertices
gfront
usemtlred
f1234
gback
usemtlblue
f8765
gright
usemtlgreen
f4378
gtop
usemtlgold
f5148
g
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教程 本来 是要放致到妙 mel 语初解 第三 章里讲