GEMINIGHT
📋注册(Register) | 📛登录(Login)
🎲

主站(Home) »  论坛(Forum)  » 美工设计(Art Design) » OBJ模型格式内幕详解
双子在线
📠📰
自称:帖子发布器
OBJ模型格式内幕详解 1楼1层
Tags引力关联贴
我们经常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式的OBJ文件(也称目标文件),这种格式用于编译应用程序;第二种是Alias|Wavefront公司推出的OBJ模型文件。我要讲的OBJ文件格式是指第二种-OBJ模型文件。 \N   说起3D文件格式,大家一定不会感到陌生,"*.3ds","*.max","*.lw","*.mb","*.dxf","*.obj",相信人人都能列举出几种来。但是说起OBJ文件的具体特征,却很少有人能给出较为圆满的描述。 很多人认识OBJ文件是从使用Poser开始的,Poser是一款人体建模软件,要把Poser生成的人体导出到其它3D软件中进行再加工,就用到了OBJ文件。OBJ文件是一种标准的3D模型文件格式,很适合用于3D软件模型之间的互导。比如你在3dsMax或LightWave中建了一个模型,想把它调到Maya里面渲染或动画,导出OBJ文件就是一种很好的选择。目前几乎所有知名的3D软件都支持OBJ文件的读写,不过很多软件需要通过插件才能做到这一点。 \N另外,作为一种优秀的文件格式,很多游戏引擎也都支持OBJ文件的读取。 了解OBJ文件格式有什么用呢?如果你不学编程的话,用处确实不大。不过,3D软件模型之间的互导是一件很常见的事情,不幸的是,目前的3D软件模型导出功能都不那么完美,经常会出现缺面少线的情况,有时还会遇到导出的模型根本打不开的情况。如果情况非常紧急的话,你一定会不惜一切代价仔细研究,期望找到原因,解决问题。在这种情况下,我的教程也许会对你有很大帮助。 \N  OBJ文件是一种文本文件格式,这就意味着你可以直接用写字板打开进行查看修改,如果你能看懂每一行的内容是什么意思,相信距离你成功的解决问题已经不远了。 \N  如果Maya自身的模型出错,也可以先转成OBJ格式,修改之后再导回Maya。 \N  [b]OBJ文件 -- 概念[/b]\N  OBJ文件是Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种文件格式,这种格式同样也以通过Maya读写。 \N   要想知道一个文件是不是OBJ文件,通常根据这个文件名的后缀来判断,OBJ文件的后缀是".obj"。OBJ文件是让人可读的文本,你可以直接用写字板打开对它进行编辑。 \N另外,有一种与此相关二进制文件格式(使用".MOD"后缀),二进制格式作为专利未公开,因此在这里我们不作讨论。 \N   OBJ最近的有文档的版本是v3.0,代替以前的v2.11版本。 \N  OBJ3.0格式支持多边形(Polygon),直线(Lines),表面(Surfaces),和自由形态曲线(Free-form Curves)。 \N直线和多角形通过它们的点来描述,曲线和表面则根据于它们的控制点和依附于曲线类型的额外信息来定义。这些信息支持规则和不规则的曲线,包括那些基于贝塞尔(Bezier)曲线,B样条(B-spline),基数(Cardinal/Catmull-Rom样条),和泰勒方程(Taylor equations)的曲线。 \N   OBJ文件 -- 特点 \N  (1)OBJ是一种3D模型文件,因此不包含动画、材质特性、贴图路径、动力学、粒子等信息。 \N  (2)OBJ文件主要支持多边形(Polygons)模型。 \N虽然OBJ文件也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials),但Maya导出的OBJ文件并不包括这些信息。 \N  (3)OBJ文件支持三个点以上的面,这一点很有用。 \N很多其它的模型文件格式只支持三个点的面,所以我们导入Maya的模型经常被三角化了,这对于我们对模型的再加工甚为不利。     (4)OBJ文件支持法线和贴图坐标。 \N  在其它软件中调整好贴图后,贴图坐标信息可以存入OBJ文件中,这样文件导入Maya后只需指定一下贴图文件路径就行了,不需要再调整贴图坐标了。\N[b]OBJ文件 -- 基本结构[/b]\N OBJ文件不需要任何种文件头(File Header),尽管经常使用几行文件信息的注释作为文件的开头。 \NOBJ文件由一行行文本组成,注释行以一个“井”号(#)为开头,空格和空行可以随意加到文件中以增加文件的可读性。有字的行都由一两个标记字母也就是关键字(Keyword)开头,关键字可以说明这一行是什么样的数据。多行可以逻辑地连接在一起表示一行,方法是在每一行最后添加一个连接符(\)。 \N注意连接符(\)后面不能出现空格或tab格,否则将导致文件出错。\N  下列关键字可以在OBJ文件使用。 \N  在这个列表中, 关键字根据数据类型排列,每个关键字有一段简短描述。 \N  顶点数据(Vertex data): \N   v 几何体顶点 (Geometric vertices) \N  vt 贴图坐标点 (Texture vertices) \N  vn 顶点法线 (Vertex normals) \N  vp 参数空格顶点 (Parameter space vertices) \N  自由形态曲线(Free-form curve)/表面属性(surface attributes): \N  deg 度 (Degree) \N  bmat 基础矩阵 (Basis matrix) \N  step 步尺寸 (Step size) \N  cstype 曲线或表面类型 (Curve or surface type) \N  元素(Elements): \N  p 点 (Point) \N  l 线 (Line) \N  f 面 (Face) \N  curv 曲线 (Curve) \N  curv2 2D曲线 (2D curve) \N  surf 表面 (Surface) \N  自由形态曲线(Free-form curve)/表面主体陈述(surface body statements):\N  parm 参数值 (Parameter values ) \N  trim 外部修剪循环 (Outer trimming loop) \N  hole 内部整修循环 (Inner trimming loop) \N  scrv 特殊曲线 (Special curve) \N  sp 特殊的点 (Special point) \N  end 结束陈述 (End statement) \N  自由形态表面之间的连接(Connectivity between free-form surfaces):\N  con 连接 (Connect) \N-  成组(Grouping): \N   g 组名称 (Group name) \N  s 光滑组 (Smoothing group) \N  mg 合并组 (Merging group) \N  o 对象名称 (Object name) \N-  显示(Display)/渲染属性(render attributes):\N  bevel 导角插值 (Bevel interpolation) \N  c_interp 颜色插值 (Color interpolation) \N  d_interp 溶解插值 (Dissolve interpolation) \N  lod 细节层次 (Level of detail) \N  usemtl 材质名称 (Material name) \N  mtllib 材质库 (Material library) \N  shadow_obj 投射阴影 (Shadow casting) \N  trace_obj 光线跟踪 (Ray tracing) \N  ctech 曲线近似技术 (Curve approximation technique) \N  stech 表面近似技术 (Surface approximation technique) \N  的确挺难理解,所以要用实例来说明。 \N  OBJ文件 -- 实例: \N  下面通过实例来具体讲解。 \N  OBJ文件记录一个四边形的代码: \N  v -0.58 0.84 0 \N  v 2.68 1.17 0 \N  v 2.84 -2.03 0 \N  v -1.92 -2.89 0 \N  f 1 2 3 4\N  让我们来创建一个OBJ文件,不过这一回我们不用3D软件,而是用写字板来创建。 \N  打开写字板,把上面的5行代码写上去,可以适当加一点注释。 \N  保存文件为文本格式,文件名为"myObj.obj",如图。 \N  注意:代码最后一定要按一下回车把光标切换到下一行,就是说加一个换行符(\n)。否则会看到如下错误信息: \N  // Error: line 1: OBJ file line 5: index out of range. // \N  // Error: line 1: Error reading file. //\N[align=center][url=http://www.artist.org.cn/student/UploadFiles/200408/20040805153250727.gif][img]http://www.artist.org.cn/student/UploadFiles/200408/20040805153252272.jpg[/img][/url]点击放大[/align]\N  在Maya中导入"myObj.obj"文件,看见了吧,导入了一个四边形。这个四边形的形状是完全由前面的那5行代码决定的,下面我们来分析一个这些代码。 \N  v -0.58 0.84 0 \N  画一个四边形需要四个顶点,这是第一个顶点,"v"表示顶点(vertex),"-0.58"为这个顶点的X轴坐标值,"-0.84"为Y轴坐标值,"0"为Z轴坐标值。这是第一个顶点,它的索引号是1。索引号是画面时要用到的。 \N  v 2.68 1.17 0 \N  v 2.84 -2.03 0 \N  v -1.92 -2.89 0 \N  这分别是第二、三、四个顶点,它们的索引号分别是2,3,4。\N[align=center][img]http://www.artist.org.cn/student/UploadFiles/200408/20040805153253379.gif[/img][/align]\N  f 1 2 3 4 \N  现在开始画面,"f"表示面(face),1,2,3,4是前面那四个顶点的索引号。请注意画这个面连接点的顺序,是从第一个点出发,依次连接第二、三、四个点。如果连接的顺序不同所生成的面也会截然不同,例如"f 1 2 4 3"会产生一个交迭的面,如图。 面的连接点是按顺时针排列或逆时针排列,将决定面的法线方向(面的反正)。 例如:"f 1 2 3 4"面的法线向外,"f 4 3 2 1"面的法线向里。 面的连接点顺序错误,是导致导入模型产生碎面的一个重要原因。\N[align=center][img]http://www.artist.org.cn/student/UploadFiles/200408/20040805153253912.gif[/img][/align]\N  一个面不能出现两个以上相同的顶点,这也是检查OBJ文件出错的一个要点。 \N  例如:"f 1 2 3 4 3",有两个相同的顶点,索引号是3。一个面出现两个相同顶点,可能造成程序的内存分配错误。\N  下面来研究一下Maya导出的OBJ文件。 \N  在Maya中创建一个多边形立方体,选中这个立方体,选择菜单"File -> Export Selection..."导出格式为OBJ,文件名为"cube.obj",如果没有此格式,请在Plug-in Manager中载入"objExport.mll"。 用写字板打开"cube.obj",可以看到如下代码: \N  # The units used in this file are centimeters. \N  g default \N  v -0.500000 -0.500000 0.500000 \N  v 0.500000 -0.500000 0.500000 \N  v -0.500000 0.500000 0.500000 \N  v 0.500000 0.500000 0.500000 \N  v -0.500000 0.500000 -0.500000 \N  v 0.500000 0.500000 -0.500000 \N  v -0.500000 -0.500000 -0.500000 \N  v 0.500000 -0.500000 -0.500000 \N  vt 0.000000 0.000000 \N  vt 1.000000 0.000000 \N  vt 0.000000 1.000000 \N  vt 1.000000 1.000000 \N  vt 0.000000 2.000000 \N  vt 1.000000 2.000000 \N  vt 0.000000 3.000000 \N  vt 1.000000 3.000000 \N  vt 0.000000 4.000000 \N  vt 1.000000 4.000000 \N  vt 2.000000 0.000000 \N  vt 2.000000 1.000000 \N  vt -1.000000 0.000000 \N  vt -1.000000 1.000000 \N  vn 0.000000 0.000000 1.000000 \N  vn 0.000000 0.000000 1.000000 \N  vn 0.000000 0.000000 1.000000 \N  vn 0.000000 0.000000 1.000000 \N  vn 0.000000 1.000000 0.000000 \N  vn 0.000000 1.000000 0.000000 \N  vn 0.000000 1.000000 0.000000 \N  vn 0.000000 1.000000 0.000000 \N  vn 0.000000 0.000000 -1.000000 \N  vn 0.000000 0.000000 -1.000000 \N  vn 0.000000 0.000000 -1.000000 \N  vn 0.000000 0.000000 -1.000000 \N  vn 0.000000 -1.000000 0.000000 \N  vn 0.000000 -1.000000 0.000000 \N  vn 0.000000 -1.000000 0.000000 \N  vn 0.000000 -1.000000 0.000000 \N  vn 1.000000 0.000000 0.000000 \N  vn 1.000000 0.000000 0.000000 \N  vn 1.000000 0.000000 0.000000 \N  vn 1.000000 0.000000 0.000000 \N  vn -1.000000 0.000000 0.000000 \N  vn -1.000000 0.000000 0.000000 \N  vn -1.000000 0.000000 0.000000 \N  vn -1.000000 0.000000 0.000000 \N  s off \N  g pCube1 \N  usemtl initialShadingGroup \N  f 1/1/1 2/2/2 4/4/3 3/3/4 \N  f 3/3/5 4/4/6 6/6/7 5/5/8 \N  f 5/5/9 6/6/10 8/8/11 7/7/12 \N  f 7/7/13 8/8/14 2/10/15 1/9/16 \N  f 2/2/17 8/11/18 6/12/19 4/4/20 \N  f 7/13/21 1/1/22 3/3/23 5/14/24 \N  这个文件看起来稍复杂一些,用到了许多关键词,你可以对照前面的列表查看一下每个关键词的意思。\N  我来解释一下。 \N  "vt 1.000000 0.000000"这句"vt"代表点的贴图坐标。 \N  "vn 0.000000 0.000000 -1.000000"这句"vn"代表点的法线。\N  "s off"表示关闭光滑组。 \N  "usemtl initialShadingGroup"表示使用的材质。 \N   "f 7/13/21"这时在面的数据中多了贴图坐标uv点和法线的索引号,索引号分别用左斜线(/)隔开。 \N  格式:"f 顶点索引/uv点索引/法线索引"。 \N   "g pCube1"表示组,这里的成组与Maya中的成组不一样,这里的成组是指把"g pCube1"后出现的面都结合到一起,组成一个整的多边形几何体。\N  把"cube.obj"文件修改一下就知道成组的意思了。把"s off"这句后面的代码替换成以下代码: \N  usemtl initialShadingGroup \N  g pCube_Face1 \N  f 1/1/1 2/2/2 4/4/3 3/3/4 \N  g pCube_Face2 \N  f 3/3/5 4/4/6 6/6/7 5/5/8 \N  g pCube_Face3 \N  f 5/5/9 6/6/10 8/8/11 7/7/12 \N  g pCube_Face4 \N  f 7/7/13 8/8/14 2/10/15 1/9/16 \N  g pCube_Face5 \N  f 2/2/17 8/11/18 6/12/19 4/4/20 \N  g pCube_Face6 \N  f 7/13/21 1/1/22 3/3/23 5/14/24 \N  导入Maya后可以看到,立方体的每个面是分离的,每个面的名称分别是"pCube_Face(1~6)",可见组的名称其实就是单独几何体的名称。\N  可不可以用中文命名几何体(组)呢?试试就知道了,把前面的代码改成: \N  usemtl initialShadingGroup \N  g 立方体面1 \N  f 1/1/1 2/2/2 4/4/3 3/3/4 \N  g 立方体面2 \N  f 3/3/5 4/4/6 6/6/7 5/5/8 \N  g 立方体面3 \N  f 5/5/9 6/6/10 8/8/11 7/7/12 \N  g 立方体面4 \N  f 7/7/13 8/8/14 2/10/15 1/9/16 \N  g 立方体面5 \N  f 2/2/17 8/11/18 6/12/19 4/4/20 \N  g 立方体面6 \N  f 7/13/21 1/1/22 3/3/23 5/14/24 \N  试一下,会发现模型顺利的导入了。虽然物体的名称都变乱码了,可这并不是很严重的事。 \N  不过使用中文名并不总是这么顺利,把"g 立方体面1"这行改为"g 选择"再试试看,这回导入时模型根本无法出现,只会出现如下的错误信息: \N  // Error: line 1: Your OBJ file contains a line which is too long to be parsed. Please edit your obj file. // \N  // Error: line 1: Error reading file. // \N  由此可见,物体命名的不规范也是导致OBJ文件出错的原因之一。 \N  关于Maya的物体命名,英文名是很保险的,标点符号中只有下划线(_)可用,数字不能用放到名称的开头,尽量不要用中、日、韩等双字节文字。\N  OBJ文件不支持有孔的多边形面。 \N  [b]举个例子说明一下:[/b]\N  选择Maya的创建多边形工具(Polygons -> Create Polyon Tool),在视图中画一个四边形,不要按回车,按Ctrl在四边形中间点一下,可以继续在四边形中挖一个洞。把这个有孔的多边形存成OBJ格式,在导入Maya时,会发现多边形少了一块。如果你把这也看成错误,现在至少你已经知道错误的原因了,就是OBJ文件不支持有孔的多边形面。\N[align=center][img]http://www.artist.org.cn/student/UploadFiles/200408/20040805153254746.gif[/img][/align]\N  [b]OBJ文件 -- 实际问题:[/b] \N  现在来讨论一点比较实际的问题吧,就是一旦你遇到了一个出错的OBJ文件,倒底该怎么办? \N  当你打开OBJ文件后,往往会看到有几万行的代码,你恐怕还没本事情一眼看出错误所在行,除非程序的错误信息中已经告诉你错误行。如果你不知道错误在哪里,可以用排除法,弄清楚肯定正确的代码范围,通过缩减错误代码范围定位错误。例如,你先新建一个空的OBJ文件,把有错的OBJ文件代码粘贴一半过来,然后把这个只有一半代码的新OBJ文件导入Maya。如果这时没有错误信息,说明错误行是在另一半代码中,可以从另一半代码中再粘贴一部分代码试试看;如果这时出现错误,说明错误行就在粘贴的代码中,可以把粘贴过来的代码删去一部分再试试看。就这样,逐步缩减范围直到找到错误行为止。 \N  这种方法虽然很麻烦,不过颇为有效。如果你不会编程,又遇到非常紧急的情况,这种方法还是值得一试的。\N  [b]OBJ文件 -- 细节:[/b]\N  掌握了这么多差不多也够用了,不过由于网上详细讲解OBJ文件的中文文档很少,我还是再讲一些例子,给大家提供多一点的信息吧。\N  简单的OBJ格式写法。 \N  # Simple Wavefront file \N  v 0.0 0.0 0.0 \N  v 0.0 1.0 0.0 \N  v 1.0 0.0 0.0 \N  f 1 2 3\N  面可以使用负值索引,有时用负值索引描述面更为简便。 \N  "f -4 -3 -2 -1"这句索引值"-3"表示从"f"这行往上数第3个顶点,就是"v -0.500000 0.000000 -0.800000",其它的索引值以此类推。 因此与这一行等效的正值索引写法为:"f 1 2 3 4" \N  v -0.500000 0.000000 0.400000 \N  v -0.500000 0.000000 -0.800000 \N  v -0.500000 1.000000 -0.800000 \N  v -0.500000 1.000000 0.400000 \N  f -4 -3 -2 -1 \N  OBJ文件不包含面的颜色定义信息,不过可以引用材质库,材质库信息储存在一个后缀是".mtl"的独立文件中。关键字"mtllib"即材质库的意思。 \N   材质库中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB(红绿蓝)的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。 \N   "usemtl"指定了材质之后,以后的面都是使用这一材质,直到遇到下一个"usemtl"来指定新的材质。 \N   下面的例子说明了指定材质的方法。 \N  Cube with Materials: \N  # This cube has a different material \N  # applied to each of its faces. \N  mtllib master.mtl \N  v 0.000000 2.000000 2.000000 \N  v 0.000000 0.000000 2.000000 \N  v 2.000000 0.000000 2.000000 \N  v 2.000000 2.000000 2.000000 \N  v 0.000000 2.000000 0.000000 \N  v 0.000000 0.000000 0.000000 \N  v 2.000000 0.000000 0.000000 \N  v 2.000000 2.000000 0.000000 \N  # 8 vertices \N  g front \N  usemtl red \N  f 1 2 3 4 \N  g back \N  usemtl blue \N  f 8 7 6 5 \N  g right \N  usemtl green \N  f 4 3 7 8 \N  g top \N  usemtl gold \N  f 5 1 4 8 \N  g left \N  usemtl orange \N  f 5 6 2 1 \N  g bottom \N  usemtl purple \N  f 2 6 7 3 \N  # 6 elements\N  [b]贝塞尔片面(Bezier Patch):[/b]\N  Maya不能导出OBJ格式的贝塞尔片面,却能够导入它。导入的贝塞尔片面自动转换为Nurbs表面。 \N  # 3.0 Bezier patch \N  v -5.000000 -5.000000 0.000000 \N  v -5.000000 -1.666667 0.000000 \N  v -5.000000 1.666667 0.000000 \N  v -5.000000 5.000000 0.000000 \N  v -1.666667 -5.000000 0.000000 \N  v -1.666667 -1.666667 0.000000 \N  v -1.666667 1.666667 0.000000 \N  v -1.666667 5.000000 0.000000 \N  v 1.666667 -5.000000 0.000000 \N  v 1.666667 -1.666667 0.000000 \N  v 1.666667 1.666667 0.000000 \N  v 1.666667 5.000000 0.000000 \N  v 5.000000 -5.000000 0.000000 \N  v 5.000000 -1.666667 0.000000 \N  v 5.000000 1.666667 0.000000 \N  v 5.000000 5.000000 0.000000 \N  # 16 vertices \N  cstype bezier \N  deg 3 3 \N  # Example of line continuation \N  surf 0.000000 1.000000 0.000000 1.000000 13 14 \ \N  15 16 9 10 11 12 5 6 7 8 1 2 3 4 \N  parm u 0.000000 1.000000 \N  parm v 0.000000 1.000000 \N  end  \N  # 1 element\N  [b]基数曲线(Cardinal Curve):[/b] \N  Maya好像不支持OBJ格式的曲线,导入时不会出现错误信息,却也不会出现曲线。 \N  # 3.0 Cardinal curve \N  v 0.940000 1.340000 0.000000 \N  v -0.670000 0.820000 0.000000 \N  v -0.770000 -0.940000 0.000000 \N  v 1.030000 -1.350000 0.000000 \N  v 3.070000 -1.310000 0.000000 \N  # 6 vertices \N  cstype cardinal \N  deg 3 \N  curv 0.000000 3.000000 1 2 3 4 5 6 \N  parm u 0.000000 1.000000 2.000000 3.000000 end \N  # 1 element \N  贴图映射(Texture-Mapped): \N  # A 2 x 2 square mapped with a 1 x 1 square \N  # texture stretched to fit the square exactly. \N  mtllib master.mtl \N  v 0.000000 2.000000 0.000000 \N  v 0.000000 0.000000 0.000000 \N  v 2.000000 0.000000 0.000000 \N  v 2.000000 2.000000 0.000000 \N  vt 0.000000 1.000000 0.000000 \N  vt 0.000000 0.000000 0.000000 \N  vt 1.000000 0.000000 0.000000 \N  vt 1.000000 1.000000 0.000000 \N  # 4 vertices \N  usemtl wood \N  # The first number is the point, \N  # then the slash, \N  # and the second is the texture point \N  f 1/1 2/2 3/3 4/4 \N  # 1 element \N  fixLWObj_v1.0 \N  最后,我再提供一个自己编写的专门修复重复顶点错误的mel程序,可以修复LightWave 3D OBJ Export v2.1输出的某些*.obj文件无法导入Maya的错误。 \N  [b]使用方法:[/b] \N  新建一个文件夹,把你要修复的*.obj文件都放到这个文件夹里,把fixLWObj.mel也放到这个文件夹里, \N  然后把fixLWObj.mel拖放到Maya视窗中,耐心地等一两分种,就可以完成修复。 \N  可以在Output视窗看到修复的进度。 \N  修复完后你会发现文件夹中多个一个名为fix的文件夹,修复过的*.obj文件就存放在fix文件夹中。 \N  文件夹中的Output.txt文件记录修复信息。\N\N来源:hi.baidu.com/uvrworld/blog/item/56cece3204e839f01b4cff01.html
SIGNATURE
🗓2010-8-27 07:12(约15年前)  👁1730

双子在线
📠📰
自称:帖子发布器
VRML模型WRL格式概述 2楼2层
Tags: VRML,WRL

Tags引力关联贴
1.VRML发展的简史\N\NVRML最初出现在1994年的瑞士日内瓦的W3会议上,Tim Berners-Lee,也就是Web的奠基人,对Mark Pesce的编程工作产生了浓厚的兴趣并邀请他给出名为”Cyberspace”的论文。这篇论文解释了一个名为Labyrinth的VRML 浏览器原型,这是Mark和Tony Parisi在1994年1月完成的一个程序。冲动来源于William Gibson的一部名为Neuromancer的小说。 \N因为是第一次在Web上呈现出三维的界面,所以在W3会议上Labyrinth受到了特别的关注。 \NVRML是这样一个缩写词,它的英文全称是Virtual Reality Modeling Language。在最初的时候,M代表Markup,后来为了和HTML相区别,在W3会议之后的几个月内就把名称改为了Modeling了。 \NMark的那篇论文获得了巨大的成功,所以就举办了名为www-vrml的mailing list(http://vag.vrml.org/www-vrml/)以进行更为深入的讨论。Mark的身份是这个mailing list的协调员。 \N这个邮件列表代表了VRML在学术上的发展。Gavin Bell,SGI公司的一名编程人员,在VRML团体中享有很高的声誉,采用Open Inventor作为VRML文件的官方格式。一些人觉得应该为这项新技术创建一个全新的格式,而另一部分人包括Mark本人则认为如果VRML文件格式符合现存的所有图象文件格式,那么它必将获得巨大的成功。理想的结构应该是创建一个和HTML相类似而又符合专业三维设计师的需求。最终Open Inventor被采纳了,Gavin Bell在VRML 1.0标准的制订过程中做了大量的文档工作。 \N在OI被大众所接受之后,它被调整到我们现在所见到的VRML 1.0格式。很明显VRML是作为一个独立语言出现的,而不仅仅是作为一个HTML的扩展而出现的。VRML对于网络的要求比HTML更加严格并且在使用时要求更多数量的服务器。VRML 1.0标准中给出了超链接锚点(WWWAnchor)平行于HTML中的HREF,另一个语言上的特征是LOD(细节节点),它依据物体在场景中的位置和浏览器的渲染性能来为物体分配正确的浏览数据。 \NVRML 1.0和它的后继者不太一样,它是完全面向ASCII字符集的,被限制在处理127个字符的能力上。这个限制对于处理非罗马语言的字符就会产生问题。VRML 1.0标准不能处理avatar也是一个很大的失误。 \N1994年的11月第二界WWW会议召开,在这次会议上提出了VRML 1.0标准。在这次会议之后,Parisi建立了自己的公司Intervista并创建了第一个VRML浏览器WorldView。SGI公司也在1995年的四月给出了它的第一个Web浏览器WebSpace。在当年的夏天Netscape、NEC、DEC和Spyglass宣布对VRML进行支持。同年的八月,VAG(VRML工程组)成立。95年的十月,VAG成员决定把工作重心放在引导方向,VRML 2.0由此产生。 \NVRML和Java团体的第一次会晤是在1996年的第三次的W3会议上。 \N目前最新的标准是1997年制订的VRML 97。在VRML的整个发展历程中,出现了几个变种的标准:VRML+和VRML 1.1。VRML +是IBM对VRML的一种扩展标准,出现在1995年的八月。IBM公司准备以这项技术对VRML服务提供大范围的支持。VRML +准备在场景中提供一个象avatar一样的数字演员并提供象VRML 2.0一样功能的交互支持。 \NVRML 1.1是VRML 1.0的一套扩展集,它试图扩展最初版本的功能。这个标准后来被集成进了VRML 2.0当中。 \N\N2 VRML的基本工作原理及其基本特性 \N\N用文本信息描述三维场景,在Internet网上传输,在本地机上由VRML的浏览器解释生成三维场景,解释生成的标准规范即是VRML规范。正是基于VRML的这种工作机制,才使其可能在网络应用中有很快的发展。当初VRML的设计者们考虑的也正是--文本描述的信息在网络上的传输比图形文件迅速,所以他们避开在网络上直接传输图形文件而改用传输图形文件的文本描述信息,把复杂的处理任务交给本地机从而减轻了网路的负荷。 \N统分结合模式:VRML的访问方式基于C/S模式,其中服务器提供VRML文件,客户通过网络下载希望访问的文件,并通过本地平台的浏览器(Viewer)对该文件描述的VR世界进行访问;即VRML文件包含了VR世界的逻辑结构信息,浏览器根据这些信息实现许多VR功能。这种由服务器提供统一的描述信息,客户机各自建立VR世界的访问方式被称为统分结合模式,也是VRML的基本概念。由于浏览器是本地平台提供的,从而实现了VR的平台无关性。 \N基于ASCII码的低带宽可行性:VRML像HTML一样,用ASCII文本格式来描述世界和链接,保证在各种平台上通用,同时也降低了数据量,从而在低带宽的网络上也可以实现。 \N实时3D着色引擎:传统的VR中使用的实时3D着色引擎在VRML中得到了更好的体现。这一特性把VR的建模与实时访问更明确的隔离开来,也是VR不同于三维建模和动画的地方。后者预先着色,因而不能提供交互性。VRML提供了6+1个自由度,即三个方向的移动和旋转,以及和其他3D空间的超链接(Anchor)。 \N可扩充性:VRML作为一种标准,不可能满足所有应用的需要。有的应用希望交互性更强,有的希望画面质量更高,有的希望VR世界更复杂。这些要求往往是相互制约的,同时又受到用户平台硬件性能的制约,因而VRML是可扩充的,即可以根据需要定义自己的对象及其属性,并通过Java语言等方式使浏览器可以解释这种对象及其行为。 \N\N3 VRML文件格式及MIME类型 \N\NVRML文件可以包括下列四个主要成份:VRML文件头、原型、造型和脚本、路由。并不是所有的文件都包括这些要素,唯一必须的是VRML文件头。 \NVRML 2.0标准的文件头为#VRML V2.0 utf8。这不同于1.0标准中的文件头,1.0标准中文件只支持ASCII字符集,所以文本头为#VRMLV1.0ASCII。为了向下兼容,VRML 2.0文件格式兼容1.0文件格式。这个文件头有三个含义:第一、表明这个文件是一个VRML文件;第二,符合VRML 2.0版本;第三,文件使用的是utf8字符集(这是多种语言中键入字符的一种标准方式,包括英语,也支持朝鲜语、日语和阿拉伯语的字符)。 \NVRML注释允许在不影响VRML空间外观情况下,在VRML中包括其他信息。可以加入对文件内容、文件绘制的不同部分的注释。注释以一个#符号开始,结束于该行的最后。 \NVRML中包含描述空间中造型及其属性的节点。这些是VRML的构件。单个节点描述造型、颜色、光照、视点、以及造型、动画定时器、传感器、内插器等的定位和朝向等等。节点一般包括: \N节点的类型(必需)。 \N一对括号(必需)。 \N括号中的一定数目描述节点属性的域(可选)和域值。 \N括号将节点的域信息组织在一起。组织在括号中的域是属于节点的。由节点及其相关域定义的造型或属性在空间中被视为一个整体。 \N所有的域类型,要么是单值类型,要么是多值类型。单值类型是单一的值,如一种颜色和一个数字,该类型命名以“SF”开始。多值类型可以很有值,比如颜色和数字的列表,命名以“MF”开始。当指定多值类型时,使用括号将值的列表扩起来。 \NVRML文件以扩展名.wrl或.wrz结尾,表示这是一个包含VRML空间的文件。 \NMIME是英文Multipurpose Internet Mail Extensions—多用途Internet邮件扩展的缩写。它用来定义Internet上传送的文件内容类型的软件标准,所有的Web浏览器都能够理解MIME所定义的文件类型,并使用它们在浏览器上自动决定显示的信息内容。例如:如果一个MIME类型显示一个文件中包含VRML文本,那么浏览器将格式化VRML文本使其显示在浏览器的窗口中。一个MIME内容类型由用斜杠分开的两部分指定。第一部分说明内容的一般类型,象文本、音频、视频类型。第二部分说明内容的子类型,用于指定内容使用的确切格式。 \NMIME内容类型由Internet协会标准化,临时的或最新的MIME内容类型都以x-开始(x表示扩展)。VRML非常新,以至于它现在使用下列扩展的MIME内容类型:x-world/x-vrml。将来,VRML的内容类型将融合进正式的MIME标准,并成为下列MIME内容类型:model/vrml。 \N\N4 VRML中的节点分类 \N\NVRML中的节点有以下几种类型: \N·造型尺寸、外观节点:Shape、Appearance、Material \N·原始几何造型节点:Box、Cone、Cylinder、Sphere \N·造型编组节点:Group、Switch、Billboard \N·文本造型节点:Text、FrontStyle \N·造型定位、旋转、缩放节点:Transform \N·内插器节点:TimeSensor、PositionInterpolater、OrientationInterpolater、ColorInterpolator、 ScalarInterpolator、CoordinateInterpolator \N·感知节点:TouchSensor、CylinderSensor、PlaneSensor、SphereSensor、VisibilitySensor、ProximitySensor、Collision \N·点、线、面集节点:PointSet、IndexedLineSet、IndexedFaceSet、Coordinate \N·海拔节点:ElevationGrid \N·挤出节点:Extrusion \N·颜色、纹理、明暗节点:Color、ImageTexture、PixelTexture、MovieTexture、Normal \N·控制光源的节点:PointLight、DirectionalLight、SpotLight \N·背景节点:Background \N·声音节点:AudioClip、MovieTexture、Sound \N·细节控制节点:LOD \N·雾节点:Fog \N·空间信息节点:WorldInfo \N·锚点节点:Anchor \N·脚本节点:Script \N·控制视点的节点:Viewpoint、NavigationInfo \N·用于创建新节点类型的节点:PROTO、EXTERNPROTO、IS \N\N二、VRML中较为深入的几个概念 \N1.构建VRML文件的几种方法 \N构建VRML文件一般有三种方法: \N使用文本编辑器直接进行VRML文件的书写。这样做的不足之处是只能创建比较简单的物体和场景。创建复杂场景的时候,几乎不可能使用文本编辑器来直接编写。第一是因为场景之间相互关系和位置确定比较复杂,第二是对于复杂物体的建模显得无能为力(精确到小数位两位已经是计算的一个极限了),第三对数学能力要求较高。 \N一般的方法是使用可视化编辑器来建模。使用可视化编辑器避免了直接使用文本建模时的一些问题,例如不能生成复杂场景等。这些工具的一个突出的优点就是使用起来相当方便,它不需要手工地输入大量的命令而只需要轻轻拖动鼠标即可实现大量程序才可能完成的功能。 \N常见的几个可视化编辑器有:Cosmo World 2.0、Paragraph’s Virtual Home Space Builder、Home Space、Caligari’s Pioneer、Virtus WalkThrough Pro和3-D Website Builder等。 \N第三种方法就是使用其它常见的图形格式进行转换。在Web网上,存在着大量的各种各样的三维文件格式,转换工具的作用就是在这些文件格式之间进行转换。需要注意的是,所有的转换程序都有局限性,例如在转换特定文件中的光照和纹理贴图时就会失败。 \NInterChange是Syndesis公司(http://www.threedee.com)的一项产品,它可以执行大约五十种文件格式之间的转换,VRML就是这五十种文件格式中的一种。 \NExtreme 3-D是Macromedia公司(http://www.macromedia.com)的一项功能非常强大的产品,它对于VRML文件的转换功能在多媒体创作人员当中是深受欢迎的。使用Extreme 3-D,你就可以通过点击鼠标来把二维模型转换成三维模型。 \NDoomToVrml2使你可以在网上发布你自己的Doom文件,它使得你可以把Doom层次的多边形和纹理信息转换成为VRML 2.0格式的文件(http://vrml.sig.com/tools/ doomtovrml2 /index.html)。 \NVRML1to2可以将符合VRML 1.0格式的文件转换成为符合VRML 2.0格式的文件,Sony公司(http://vrml.sgi.com/cgi-bin/vrmlToVrml2.cgi)在这个领域开了先河。 \NVRML1toVRML2来自SGI公司,它执行的功能和上面的转换器一样。 \N2.浏览VRML的方法及几种常见的VRML插件 \N浏览VRML的一般方法是使用VRML浏览器,也可以在IE等通用浏览器上通过VRML浏览器插件对VRML文件进行浏览。 \N3.VRML中的动画效果 \N要理解VRML中动画的概念,必需首先理解路由和事件。为了使虚拟空间具有动感,构造指令可以包含绑定指令,绑定指令描述如何将节点绑定在一起。VRML绑定包括:绑定在一起的节点和在节点之间绑定的路由或者叫做路径。绑定两个节点之后,第一个节点通过这样的路径传送给第二个节点的信息叫作事件。事件包含一个值。当一个节点接收到一个事件时,它将根据节点的特征开始动画或者其它事情。通过绑定多个节点,用户可以创建许多路由,从而使空间更加具有动感。 \N大多数VRML节点都可以绑定在线路之上,每个节点都有输入、输出插座。一些节点同时具有输入、输出插座,而另外的一些节点仅有其中的一种。节点的输入插座称为eventIn,输出插座称为eventOut。当链接一个路由时,eventIn接受输入,eventOut将事件输出。 \N节点的每个输入输出路由也有类型,例如一个SFFloat类型的eventOut,当它绑定一个路由时,输出浮点数。SFFloat类型的eventIn,能够接收浮点值。创建路由之后,线路路由将处于睡眠状态,直到有一个事件从发送节点发送到接收节点。接收节点接收事件之后将作出反应,反应类型依赖于: \N·接收事件节点的类型 \N·路由所绑定的节点输入插座 \N·事件所包含的数值 \N·当 前节点的活动状态 \NVRML中的动画产生是由于变动了任何一个坐标系的位置、方向和形体比例,从而使物体按你所想的方式飞行、平移、旋转或按比例缩放。 \NTimeSensor节点的作用象一个时钟,它可以被用来执行开始,停止或者其他控制动画的动作。随着时间的流逝,这个传感器就会产生事件来表示时间的变化。通过将这些事件人TimeSensor节点的eventOut路由到其他节点,当TimeSensor节点的时钟计时时,你可以使这些节点发生相应的变化。如果要使一个坐标系平移、旋转和按比例缩放的话,你可以将TimeSensor节点事件路由至PositionInerpolator和OrientationInterpolator节点。这些节点中的每一个产生新的位置和旋转值,并通过他们的eventOut传送这些值。按顺序将这些值路由到Tranform节点,就可以使节点的坐标系随动画过程的发展而发生平移、旋转和按比例缩放。 \N4.VRML中的自身交互可以做到什么程度 \N如果要使你的空间具有交互性,你可以给一个造型附带一个传感器,该传感器使用一个定点设备来感知观察者的动作。当观察者点击到一个附带有传感器的造型时,传感器就输出一个事件,这个事件就被路由到其它的节点来开始一个动画。 \NTouchSensor是一种用来检测观察者的接触和将事件输出的传感器。这些输出描述了在何时、何地,观察者接触到了可感知的造型。CylinderSensor、PlaneSensor和SphereSensor节点也可用来检测何时观察者接触到一个可感知的造型,并且提供了用来改变造型位置和方向的输出。 \N在VRML中,你可以将一个传感器附在一个造型上,用它来检测观察者的移动、点击和拖动。当观察者与一个可感知的造型相互作用时,你就可以把传感器的输出连入一个线路中,从而引起造型的移动和动画的播放。 \N感知观察者接近常使用三种方法:感知观察者的可视性、感知观察者的接近性和通过碰撞检测。 \N可见传感器从观察者的位置和方向来感知在空间中的一个长方体区域是否可视。你可以通过这些传感器来启动和停止动画或者控制其他的动作,这些动作仅当一个可感知的区域可见时是必要的。通过给出中心和尺寸,你可以指定一个由VisibilitySensor节点感测的空间区域。 \N碰撞检测是检测空间中观察者与造型接近和碰撞的时间。碰撞节点在检测观察者的碰撞时做两件事: \N通过CollideTime eventOut事件输出当前的绝对时间。 \N提示浏览器。 \N以上就是VRML场景中的几种交互,使用这些交互我们可以做到类似电灯开启,自动滑动门等效果。但是更为复杂的交互使用它本身所提供的传感器就显得无能为力了,这就需要利用Script和Proto节点等对其进行功能上的扩展,最好是利用Java技术完成这些扩展工作,因为Sun公司对VRML技术也非常看好。 \N\N来源:www.douban.com/group/topic/1121838/
SIGNATURE
🗓2010-8-27 07:19(约15年前)  👁617

双子在线
📠📰
自称:帖子发布器
FBX模型格式详解 3楼3层
Tags: FBX

Tags引力关联贴
MAX与MAYA是现在占有率最高的两套3D 动画 软件 ,各擅胜场,关于两套软件的比较不在本文范围以内。因为使用者众,相信大家都会常碰到需要在这两套软件之间转换的状况,例如在MAYA建模用MAX算图;或是因为工作的关系,得要接触使用不同软件的工作伙伴,甚至要\NMAX与MAYA是现在占有率最高的两套3D动画软件,各擅胜场,关于两套软件的比较不在本文范围以内。因为使用者众,相信大家都会常碰到需要在这两套软件之间转换的状况,例如在MAYA建模用MAX算图;或是因为工作的关系,得要接触使用不同软件的工作伙伴,甚至要交换资源…….等状况,尤其项目的规模越大,这样的状况更难避免。\N\N最常见的应该是模型的转换,通常是使用OBJ或是3DS这两种老牌的格式作为中介,不过也因为这两种格式也有一定历史了,造成转换上并不是很完整,会损失不少的信息,例如贴图、平滑…...等等,那就更别说是动作了!\N\N前一阵子因为工作的关系,需要整合MAX与MAYA的工作团队,而在更早之前朕宏上面也有朋友发表过使用Filmbox的fbx作为转换的格式,可以成功转换(大部分)模型、骨架、动作、贴图....等信息,真是惊为天人。\N\N经过一整个项目的整合经验,也累积了一点心得,在此跟大家分享一下,不过还是要强调一下,这纯粹是基于个人使用的经验(经验法则),再者因为个人对MAX比较熟悉一点,所以对MAYA方面的掌握度可能比较不足\N\N难免疏漏或错误,还请不吝指教。\N\N[b]FBX介绍[/b]\Nfbx是filmbox这套软件所使用的格式,现在改称Motionbuilder。Motionbuilder是一套专攻动作制作的软件(尤其是配合mocap系统),详细的资料可以查网络上的信息,这里就点到为止了。官方网站 : www.kaydara.com\N\NMotionbuilder扮演的是动作制作的平台,所以在前端的modeling和后端的rendering也都有赖于其它软件的配合,所以Motionbuilder在档案的转换上自然下了一番功夫。\N\NMAX5已经内建fbx的import/export,如果是MAYA或XSI等请至官方网站下载免费的plugin包一套搞定,目前应该是到5.0版。\N\N还有一个有趣的讯息\N\NFBX有提供Quicktime6的Plugin,意思就是说只要有安装这个插件,就可以直接在Quicktime Player里面显示FBX的模型~~~酷哟\N\NViewport的操作方式和Motionbuilder相同,鼠标只有左键有功用(配合Mac族?)\N\Nshift+LMB=Pan\N\Nctrl+LMB=dolly\N\Nshift+ctrl+LMB=Rotate\N\N[b]输出与输入---基本概念[/b]\N前面提到MAX5已经内建fbx的importer/exporter,如果是MAYA5则需要另行安装(怎幺安装不需要教吧?)\N\NMAYA要输出入fbx没有什幺选项,只要按ok就好,MAX的fbx import/export就提供了不少选项可以作细部的调整,比较重要的是在输入的时候可\N\N以选择Y-UP或Z-UP的坐标,如果是从MAYA出来的东西,记得要选择Y-UP。\N\N因为预设的单位不同,所以从MAX转到MAYA,模型通常都会很大,MAYA转到MAX都会太小(这个大小问题其实也常发生在输入obj档时),不过只要在两边都把单位设好,我的习惯是都设成公分,在modeling的时候也参考现实的尺寸,这个问题基本上就ok了。\N\N接下来就是调整max与maya的网格大小,在maya里加大camera的far clip(如果在prsp里看不太到东西的话)\N\N由MAX转到MAYA或是MAYA转到MAX,FBX会将所有的对象Link到一个FBX Root上(主要是解决Y-UP与Z-UP的问题),所以请勿乱删这个dummy(node),因为这是所有对象参考的原点。\N\N在群组阶层关系部份,个人觉得FBX和MAYA的GROUP对应相当良好,转到MAX会成为一个dummy,而MAX的GROUP转到MAYA会对应到MAYA的GROUP,这里也可以发现MAYA和MAX的GROUP的观念有一定差距,MAYA的GROUP概念比较单纯,接近MAX的link to dummy的作用。\N\N至于Link的部份,大致上是没有什幺问题的,这一点留待模型与动作的部份,再做补充说明。\N\N[b]模型篇[/b]\N模型的转换,相信是最常见的需求。点对点线对线的状况最为单纯,FBX在这个部份的表现相当理想,多边型模型基本上是分毫不差。\N\N有趣的是,在Max里相同拓朴的模型,如果是mesh转出去,都会变成三角面,用poly输出的话就是漂亮的四角面(MAYA没有这个问题,因为MAYA只有polygon),而MAX输入fbx的模型,都会成为mesh的形式。\N\N更利害的是fbx居然能够保留nurbs ─ 例如用MAYA转出一个用nurbs建的模型,相同的fbx文件,如果用MAX输入的话会自动转成mesh,用maya输入的话还是nurbs~更神奇的是再从xsi 输出一个nurbs模型到maya,仍然保留unrbs的格式(好吧!MAX的NURBS真的是超级废柴)\N\N这里有一个小技巧,在MAYA如果输出NURBS到FBX,进入MAX就会转成Mesh,在MAYA的时候可以先按1键,将显示的平滑度降低,这样出来的模型资料量会小很多,到MAX再执行Meshsmooth即可。\N\N接下来这一点很重要,避免使用不等比缩放,如果有用到,MAX在Hierarchy->Reset字段下有两组按钮,点选Transform和Scale,真正将位移缩放的变形量归零;之后再到Utilities面版下,点选Reset Xform或再convert一次将比例归零。MAYA则使用freeze transformation。 这样转换的模型才不会出现乱飞的状况。\N\N[b]材质与灯光[/b]\N材质方面,能够保留MAX或MAYA多边形的贴图轴信息(NURBS的UV不行),材质球的属性,有部分可以保留,能转的就算赚到了,shader都会转成p\N\Nhong shader,diffuse(MAX)对应到color(MAYA)、Opacity(MAX)对应到transparency(MAYA).......其它的依此类推,颜色转换是无误,但比较可惜的是部分数值的对应并不是很理想,这一点还请各位朋友自行比较,我是不太信任这一点,毕竟同样的数值在不同的软件下不见得会产生相同的效果。\N\N在转档后,常会觉得有OVER的感觉,怎幺打光都不对,其实在转档后,FBX会自动把MAX的Enviroment>Global Lighting>Ambient设为50%的灰,调低即可,至于东西转到MAYA则是会把每一个材质的Ambient设为0.588,全选起来用Attrib sprend sheet一次调低即可。\N\N贴图的部分,不用说只能转bitmap(files)的贴图,此外只会保留diffuse这个channel,其它的部分要再自行指定,希望新版可以提供支持(基本上支持bump和Opacity就很感动了) FBX在转换后,会把每一个单独的模型产生一个新的材质,所以会发现在材质编辑器里面有爆多的材质球(尤其是MAYA看起来会很可怕),所以在转换前,能够先Attach或combine就先结合在一起,省得整理麻烦。\N\N若是从MAYA转出的模型,如果没有上贴图设定UV,以MAX开启的话都会被赋予一个材质,在Diffuse的地方还是会加上一个bitmap的贴图(但是是空的-maya ghost),这时候用MAX算图时就会出现没有UVWMap的警告讯息,必须要手动加上UVWmap,或是在MAYA里就先拆UV。\N\N另外,有的时候还是会产生法向量方向的问题,开2side或下normal指令修正啦。\N\N标准的三种光源,Spotlight转成spotlight、onmi转成point light,Directlight转Directlight,位置、方向都不会有问题,灯光强度:Multiplier对应到Intensity、颜色、Spotlight的Cone angle都会保留,不过前面也提过了,相同的数值不代表相同的效果 。\N\N一些比较特别的灯光种类,如MAYA的Ambientlight、体积光、MAX的Skylight…就会被转成helper之类的虚拟对象。阴影部份的属性不会保留,所以FBX的灯光转换还满鸡肋的,主要是作对位功用吧!\N\N"听说"有一个叫OHM的格式,可以顺利转换灯光的属性: 不过大半年过去了,似乎还是只闻楼梯响的阶段。\N\N[b]摄影机篇[/b]\N我把CAMERA的部分独立出来说明,CAMERA顺利转换与否,在协同工作的状况下是相当重要的ㄧ件事,以我个人的例子来说,这次因为没有办法招募到那幺多使用MAYA或MAX的工作伙伴,五五波(笑),必须要各取其长处。最后决定角色动画在MAYA进行,场景部分在MAX进行RENDER速度比较理想,最后再进行合成。\N\N这时候CAMERA的转换就扮演着重要的角色了,第一点是要确保画面在两套软件间维持无误,第二点是要确保摄影机的动作顺利转换\N\N(最好是不要动camera啦,自爆)。\N\N在经过了多次尝试后,主要的重点是要在MAX与MAYA里面保持相对应的设定,因为FBX在这里并不是很聪明,属于Rendering setting或Render Global的设定并不会被转换,需要手动设定。算图的尺寸不用说要保持一致,包括分辨率、像素比、Aperture width……等,通常使用内定工业规格的设定,例如NTSC、HDTV…是最保险的。\N\N在MAX的rendering里面Aperture width和camera setting中的lens数值是相对应的,MAX调整前者,后者也会相对变化,保持画面不变;而在MAYA里Aperture是属于Camera的属性,调整Film back里面的设定,MAYA会保持Focal length不变而画面改变。不过两套软件计算方式似乎不太相同MAX是用mm,MAYA是用ratio,我并没有花时间去找出换算的方式,原则上保持一套软件的设定固定,不要两边都做调整,以免产生误差。\N\N[b]MAYA中的场景与摄影机的参数[/b]\N\NMAX的FOV对应到MAYA的Angle of view,Lens对应到Focal legth,上面提到过两套软件在Aperture部分的计算方式不相同,所以在这里的对应数值也会有出入,例如在MAX设定lens是28mm,转到MAYA会变成28.884(出现小数点),这倒是不用太担心,两边算出来的画面是相同的,FBX会做出转换(先决条件是上面的条件要控制住)。\N\N使用RamPlayer确认影像迭合无误(灰色是由MAYA Render出)\N\N还有ㄧ个容易忽略的重点,就是在filmfit的部分也要保持一致,建议是使用水平Horizontal。\N\N解决了画面的对应,接下来就是摄影机的动作。camera的Dolly、Track、Arc都可以处理,如同一般的对象,摄影机的移动、旋转(缩放没有实际意义)也可以转换过去,不过出状况的比例不低,建议是使用FreeCamera互转,比较稳当(spotlight也是一样,修正一个对象总比再加上一个target来的容易)。\N\N最常发生的状况就是摄影机反转,如果摄影机乱跑,也可以试着使用Freeze transformation来修正 ,釜底抽薪的方式就是多下几个key点来强制校正这个问题,再不行,输出前先把camera的动态逐格取样,转成keyframe应该就ok了(不过就没办法修改了)。\N\N至于zoom的动作,也可以转换,不过我没有仔细测试过这个部份,因为在动作的时候担心出状况,所以就避免使用了。\N\N有时候出现警告讯息,不见得代表一定出问题。\N\N[b]骨架与动作[/b]\N关于骨架的转换,不管是CS的biped,或是bones...转出后都会变成单纯的一根一根的bones,IK会不见,只会保留单纯FK的形式,动作都会转变成每一格每一个关节的旋转量(再编辑无力),我想这是可以理解的,不过我们仍然可以将这段动作透过MAYA的trex editor或是再转成BVH进CS作编辑(这里需要第三方的插件配合)特别注意一点,CS的骨架输出后会在跨下产生一根多出来的(姑且称为老X吧),直通地平面,那是因为Biped的Root其实是投影在地平面上的一个点,就留着不会有什么影响。\N\N虽然骨架可以顺利转换,但前面也提过了,IK handle之类的连结关系并不会被转过去,这样子就麻烦了,因为大部分的时候我们是把keyframe下在各个控制的handle或locater或dummy .....ect上,转过去当然只有dummy的动作......只有CS没有这样的问题这时候就要先把keyframe bake到骨架上去,就可以解决这一个问题了关于动作的转换,大部分状况都是ok的,位移、旋转、缩放都可以转,不过vertex animation就无能为力了(可以透过Morph来想办法,不过不一定划算)\N\N至于keyframe的转换,在输出的时候会有一个取样值,看是每秒几格(预设是30格),不过也不一定就会转出满满30个keyframe,程序会试著作判断~~~~转不过去才会强制取样。\N\N这时候如果都是依赖curve来调整动作的话,就有机会产生取样错误,所以我的方法都是多下几个key点来避免这样的状况(in max or maya)蒙皮的部分,MAX可以转换官方的Skin与Physique,能保留每一个点的weight(残念,Bones pro没办法呀......),在FBX5.0里面,甚至可以指定模型输入时要转成Skin或Physique。不过在这一点我试的经验是成功率有待研究,多多少少还是会出现拉扯、错点....等现象,重新执行Normalize Weights有的时候可以修正一些问题。\N\N目前我的做法还是输出定位好的模型与骨架到个别软件去作skin(bind)的动作。此外,Morpher(Blend shape)也在转换支持之中,不过我并没有仔细的测试过,主要是做MAX的morph modifier和MAYA的Blend shape之间的转换,测试过MAX的输入输出基本上都是ok的,甚至连keyframe都可以保留,不过似乎不支持MAX的progressive morph(无法对应吧),这点有机会在好好研究啦。\N\NFBX实现 MAX与MAYA互转 拉拉杂杂的把这段时间整合的经验分享下来,虽然FBX对于不同软件之间的转换已经提供了相对完整的解决方案,但是实际执行起来,仍不免要解决诸多问题。换个角度想,要是那么容易就搞定了互转,AW和Discreet也不要玩了,谁不想寡占市场呢?\N\N其实个人也有这样的感觉,能够用一套软件搞定,何苦要花费更多的成本在转换的整合上呢?这个时候就是衡量了,要如何在效率、效果、人力资源、项目管理……上面取得一个平衡,相信是超出于技术考量的问题了。\N[align=center][flash]http://www.tudou.com/v/VOYB4mFMSmA/v.swf[/flash][/align]\NANYWAY,提供给有需要的朋友参考一下吧。\N来源:www.9visual.cn/html/Tech/Maya/200909071989_4.html
SIGNATURE
🗓2010-8-27 07:06(约15年前)  👁898

freepgame

自称:魂
注册于:2009年1月30日
等级:高级会员
帖子数:374
积分:1235
阅读权限:40
4楼4层
Autodesk基本上都把好的3D软件给收购了\NAdobe也差不多\N我看这以后2D和3D的天下就剩这两个A了,其它都非主流软件了
🗓2010-8-30 13:57(约15年前)

双子在线
📠📰
自称:帖子发布器
MAX与MAYA互转之FBX格式详解 5楼5层
Tags: FBX

Tags引力关联贴
MAX与MAYA是现在占有率最高的两套3D动画软件,各擅胜场,关于两套软件的比较不在本文范围以内。因为使用者众,相信大家都会常碰到需要在这两套软件之间转换的状况,例如在MAYA建模用MAX算图;或是因为工作的关系,得要接触使用不同软件的工作伙伴,甚至要交换资源…….等状况,尤其项目的规模越大,这样的状况更难避免。 \N  最常见的应该是模型的转换,通常是使用OBJ或是3DS这两种老牌的格式作为中介,不过也因为这两种格式也有一定历史了,造成转换上并不是很完整,会损失不少的信息,例如贴图、平滑…...等等,那就更别说是动作了! \N  前一阵子因为工作的关系,需要整合MAX与MAYA的工作团队,而在更早之前朕宏上面也有朋友发表过使用Filmbox的fbx作为转换的格式,可以成功转换(大部分)模型、骨架、动作、贴图....等信息,真是惊为天人。 \N  经过一整个项目的整合经验,也累积了一点心得,在此跟大家分享一下,不过还是要强调一下,这纯粹是基于个人使用的经验(经验法则),再者因为个人对MAX比较熟悉一点,所以对MAYA方面的掌握度可能比较不足\N难免疏漏或错误,还请不吝指教。 \NFBX介绍\N\Nfbx是filmbox这套软件所使用的格式,现在改称Motionbuilder。Motionbuilder是一套专攻动作制作的软件(尤其是配合mocap系统),详细的资料可以查网络上的信息,这里就点到为止了。\N  Motionbuilder扮演的是动作制作的平台,所以在前端的modeling和后端的rendering也都有赖于其它软件的配合,所以Motionbuilder在档案的转换上自然下了一番功夫。 \NMAX5已经内建fbx的import/export,如果是MAYA或XSI等请至官方网站下载免费的plugin包一套搞定,目前应该是到5.0版。 \N还有一个有趣的讯息 \N  FBX有提供Quicktime6的Plugin,意思就是说只要有安装这个插件,就可以直接在QuicktimePlayer里面显示FBX的模型~~~酷哟 \NViewport的操作方式和Motionbuilder相同,鼠标只有左键有功用(配合Mac族?) \Nshift+LMB=Pan \Nctrl+LMB=dolly \Nshift+ctrl+LMB=Rotate \N输出与输入---基本概念\N  前面提到MAX5已经内建fbx的importer/exporter,如果是MAYA5则需要另行安装(怎幺安装不需要教吧?) \N  MAYA要输出入fbx没有什幺选项,只要按ok就好,MAX的fbx import/export就提供了不少选项可以作细部的调整,比较重要的是在输入的时候可\N以选择Y-UP或Z-UP的坐标,如果是从MAYA出来的东西,记得要选择Y-UP。\N\N因为预设的单位不同,所以从MAX转到MAYA,模型通常都会很大,MAYA转到MAX都会太小(这个大小问题其实也常发生在输入obj档时),不过只要在两边都把单位设好,我的习惯是都设成公分,在modeling的时候也参考现实的尺寸,这个问题基本上就ok了。\N\N接下来就是调整max与maya的网格大小,在maya里加大camera的far clip(如果在prsp里看不太到东西的话) \N  由MAX转到MAYA或是MAYA转到MAX,FBX会将所有的对象Link到一个FBX Root上(主要是解决Y-UP与Z-UP的问题),所以请勿乱删这个dummy(node),因为这是所有对象参考的原点。\N在群组阶层关系部份,个人觉得FBX和MAYA的GROUP对应相当良好,转到MAX会成为一个dummy,而MAX的GROUP转到MAYA会对应到MAYA的GROUP,这里也可以发现MAYA和MAX的GROUP的观念有一定差距,MAYA的GROUP概念比较单纯,接近MAX的link to dummy的作用。\N至于Link的部份,大致上是没有什幺问题的,这一点留待模型与动作的部份,再做补充说明。\N模型篇 \N  模型的转换,相信是最常见的需求。点对点线对线的状况最为单纯,FBX在这个部份的表现相当理想,多边型模型基本上是分毫不差。 \N  有趣的是,在Max里相同拓朴的模型,如果是mesh转出去,都会变成三角面,用poly输出的话就是漂亮的\N\N四角面(MAYA没有这个问题,因为MAYA只有polygon),而MAX输入fbx的模型,都会成为mesh的形式。 \N  更利害的是fbx居然能够保留nurbs ─ 例如用MAYA转出一个用nurbs建的模型,相同的fbx文件,如果用MAX输入的话会自动转成mesh,用maya输入的话还是nurbs~更神奇的是再从xsi 输出一个nurbs模型到maya,仍然保留unrbs的格式(好吧!MAX的NURBS真的是超级废柴) \N  这里有一个小技巧,在MAYA如果输出NURBS到FBX,进入MAX就会转成Mesh,在MAYA的时候可以先按1键,将显示的平滑度降低,这样出来的模型资料量会小很多,到MAX再执行Meshsmooth即可。\N接下来这一点很重要,避免使用不等比缩放,如果有用到,MAX在Hierarchy->Reset字段下有两组按钮,点选Transform和Scale,真正将位移缩放的变形量归零;之后再到Utilities面版下,点选Reset Xform或再convert一次将比例归零。MAYA则使用freeze transformation。 这样转换的模型才不会出现乱飞的状况。\N\N材质与灯光 \N  材质方面,能够保留MAX或MAYA多边形的贴图轴信息(NURBS的UV不行),材质球的属性,有部分可以保留,能转的就算赚到了,shader都会转成phong shader,diffuse(MAX)对应到color(MAYA)、Opacity(MAX)对应到transparency(MAYA).......其它的依此类推,颜色转换是无误,但比较可惜的是部分数值的对应并不是很理想,这一点还请各位朋友自行比较,我是不太信任这一点,毕竟同样的数值在不同的软件下不见得会产生相同的效果。 \N  在转档后,常会觉得有OVER的感觉,怎幺打光都不对,其实在转档后,FBX会自动把MAX的Enviroment>Global Lighting>Ambient设为50%的灰,调低即可,至于东西转到MAYA则是会把每一个材质的Ambient设为0.588,全选起来用Attrib sprend sheet一次调低即可。 \N  贴图的部分,不用说只能转bitmap(files)的贴图,此外只会保留diffuse这个channel,其它的部分要再自行指定,希望新版可以提供支持(基本上支持bump和Opacity就很感动了) FBX在转换后,会把每一个单独的模型产生一个新的材质,所以会发现在材质编辑器里面有爆多的材质球(尤其是MAYA看起来会很可怕),所以在转换前,能够先Attach或combine就先结合在一起,省得整理麻烦。 \N  若是从MAYA转出的模型,如果没有上贴图设定UV,以MAX开启的话都会被赋予一个材质,在Diffuse的地方还是会加上一个bitmap的贴图(但是是空的-maya ghost),这时候用MAX算图时就会出现没有UVWMap的警告讯息,必须要手动加上UVWmap,或是在MAYA里就先拆UV。 \N  另外,有的时候还是会产生法向量方向的问题,开2side或下normal指令修正啦。\N\N标准的三种光源,Spotlight转成spotlight、onmi转成point light,Directlight转Directlight,位置、方向都不会有问题,灯光强度:Multiplier对应到Intensity、颜色、Spotlight的Cone angle都会保留,不过前面也提过了,相同的数值不代表相同的效果 。 \N  一些比较特别的灯光种类,如MAYA的Ambientlight、体积光、MAX的Skylight…就会被转成helper之类的虚拟对象。阴影部份的属性不会保留,所以FBX的灯光转换还满鸡肋的,主要是作对位功用吧! \N"听说"有一个叫OHM的格式,可以顺利转换灯光的属性: 不过大半年过去了,似乎还是只闻楼梯响的阶段。 \N摄影机篇 \N  我把CAMERA的部分独立出来说明,CAMERA顺利转换与否,在协同工作的状况下是相当重要的ㄧ件事,以我个人的例子来说,这次因为没有办法招募到那幺多使用MAYA或MAX的工作伙伴,五五波(笑),必须要各取其长处。最后决定角色动画在MAYA进行,场景部分在MAX进行RENDER速度比较理想,最后再进行合成。 \N  这时候CAMERA的转换就扮演着重要的角色了,第一点是要确保画面在两套软件间维持无误,第二点是要确保摄影机的动作顺利转换\N(最好是不要动camera啦,自爆)。\N在经过了多次尝试后,主要的重点是要在MAX与MAYA里面保持相对应的设定,因为FBX在这里并不是很聪明,属于Rendering setting或Render Global的设定并不会被转换,需要手动设定。算图的尺寸不用说要保持一致,包括分辨率、像素比、Aperture width……等,通常使用内定工业规格的设定,例如NTSC、HDTV…是最保险的。\N\N在MAX的rendering里面Aperture width和camera setting中的lens数值是相对应的,MAX调整前者,后者也会相对变化,保持画面不变;而在MAYA里Aperture是属于Camera的属性,调整Film back里面的设定,MAYA会保持Focal length不变而画面改变。不过两套软件计算方式似乎不太相同MAX是用mm,MAYA是用ratio,我并没有花时间去找出换算的方式,原则上保持一套软件的设定固定,不要两边都做调整,以免产生误差。\N\NMAYA中的场景与摄影机的参数\N\NMAYA中的场景与摄影机的参数\N  MAX的FOV对应到MAYA的Angle of view,Lens对应到Focal legth,上面提到过两套软件在Aperture部分的计算方式不相同,所以在这里的对应数值也会有出入,例如在MAX设定lens是28mm,转到MAYA会变成28.884(出现小数点),这倒是不用太担心,两边算出来的画面是相同的,FBX会做出转换(先决条件是上面的条件要控制住)。\N\N使用RamPlayer确认影像迭合无误(灰色是由MAYA Render出)\N\N还有ㄧ个容易忽略的重点,就是在filmfit的部分也要保持一致,建议是使用水平Horizontal。 \N  解决了画面的对应,接下来就是摄影机的动作。camera的Dolly、Track、Arc都可以处理,如同一般的对象,摄影机的移动、旋转(缩放没有实际意义)也可以转换过去,不过出状况的比例不低,建议是使用FreeCamera互转,比较稳当(spotlight也是一样,修正一个对象总比再加上一个target来的容易)。 \N  最常发生的状况就是摄影机反转,如果摄影机乱跑,也可以试着使用Freeze transformation来修正 ,釜底抽薪的方式就是多下几个key点来强制校正这个问题,再不行,输出前先把camera的动态逐格取样,转成keyframe应该就ok了(不过就没办法修改了)。 \N  至于zoom的动作,也可以转换,不过我没有仔细测试过这个部份,因为在动作的时候担心出状况,所以就避免使用了。 \N有时候出现警告讯息,不见得代表一定出问题。 \N骨架与动作 \N  关于骨架的转换,不管是CS的biped,或是bones...转出后都会变成单纯的一根一根的bones,IK会不见,只会保留单纯FK的形式,动作都会转变成每一格每一个关节的旋转量(再编辑无力),我想这是可以理解的,不过我们仍然可以将这段动作透过MAYA的trex editor或是再转成BVH进CS作编辑(这里需要第三方的插件配合)特别注意一点,CS的骨架输出后会在跨下产生一根多出来的(姑且称为老X吧),直通地平面,那是因为Biped的Root其实是投影在地平面上的一个点,就留着不会有什么影响。\N\N虽然骨架可以顺利转换,但前面也提过了,IK handle之类的连结关系并不会被转过去,这样子就麻烦了,因为大部分的时候我们是把keyframe下在各个控制的handle或locater或dummy .....ect上,转过去当然只有dummy的动作......只有CS没有这样的问题这时候就要先把keyframe bake到骨架上去,就可以解决这一个问题了关于动作的转换,大部分状况都是ok的,位移、旋转、缩放都可以转,不过vertex animation就无能为力了(可以透过Morph来想办法,不过不一定划算) \N  至于keyframe的转换,在输出的时候会有一个取样值,看是每秒几格(预设是30格),不过也不一定就会转出满满30个keyframe,程序会试著作判断~~~~转不过去才会强制取样。 \N  这时候如果都是依赖curve来调整动作的话,就有机会产生取样错误,所以我的方法都是多下几个key点来避免这样的状况(in max or maya)蒙皮的部分,MAX可以转换官方的Skin与Physique,能保留每一个点的weight(残念,Bones pro没办法呀......),在FBX5.0里面,甚至可以指定模型输入时要转成Skin或Physique。不过在这一点我试的经验是成功率有待研究,多多少少还是会出现拉扯、错点....等现象,重新执行Normalize Weights有的时候可以修正一些问题。\N目前我的做法还是输出定位好的模型与骨架到个别软件去作skin(bind)的动作。此外,Morpher(Blend shape)也在转换支持之中,不过我并没有仔细的测试过,主要是做MAX的morph modifier和MAYA的Blend shape之间的转换,测试过MAX的输入输出基本上都是ok的,甚至连keyframe都可以保留,不过似乎不支持MAX的progressive morph(无法对应吧),这点有机会在好好研究啦。\N\NFBX实现 MAX与MAYA互转 拉拉杂杂的把这段时间整合的经验分享下来,虽然FBX对于不同软件之间的转换已经提供了相对完整的解决方案,但是实际执行起来,仍不免要解决诸多问题。换个角度想,要是那么容易就搞定了互转,AW和Discreet也不要玩了,谁不想寡占市场呢? \N  其实个人也有这样的感觉,能够用一套软件搞定,何苦要花费更多的成本在转换的整合上呢?这个时候就是衡量了,要如何在效率、效果、人力资源、项目管理……上面取得一个平衡,相信是超出于技术考量的问题了。 \N\NANYWAY,提供给有需要的朋友参考一下吧。\N\N来源:www.4dworks.net/course/b/201001/4068.html
SIGNATURE
🗓2010-11-30 07:34(约15年前)  👁449


标题(Title):
关键字标签(Tags):
路人:回贴可以不必登录