精华内容
下载资源
问答
  • obj文件格式详解及示例

    千次阅读 2021-07-30 14:46:47
    OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模型之间的互导,也可以通过Maya读写。比如你在3dsMax或LightWave中建了...

    转一些obj文件格式的说明,顺带把需要用的东西做了标注!

    =========================================================================

    =========================================================================



    OBJ文件是一种文本文件,可以直接用写字板打开进行查看和编辑修改。

    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)——实际的一些obj,vt和v不对应,vt和f也不对应,vt是材质顶点,因为有很多重复和冗余,所以和v没有对应关系。(从常识角度讲,v可以重复对应vt,是cnt(v)>=cnt(vt),实际也看到v远小于vt的,不知道原因,也许是有些点不用材质导致的)
    vn 顶点法线(Vertex normals)——实际模型未必有,有没有也都能用,vn是顶点的法线,不是面片的法线,也可以计算后加上去。
    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)——材质名称,和mtl文件对应映射到具体材质文件
    mtllib 材质库(Material library)——材质lib文件,在lib内再指向jpg等材质
    shadow_obj 投射阴影(Shadow casting)
    trace_obj 光线跟踪(Ray tracing)
    ctech 曲线近似技术(Curve approximation technique)
    stech 表面近似技术 (Surface approximation technique)

    3、OBJ文件实例

    “写一个小程序来自己生成三维模型”,听起来好像很唬人,其实就是写文本文件,直接用文本编辑器更省事。

    保存文件,文件名为"my_text_obj.obj"。

    内容很好理解,v就是一个点,一共4个点,f是由1、2、3、4四个顶点顺序组成的一个面。

    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. //


    随便一个程序(这里用meshlab)导入打开"my_text_obj.obj""文件

    结果如下。

    如果顺序调整,或者坐标奇怪,你可以生成出来看看具体形状。

    比如本例,我把f从1、2、3、4改为4、3、2、1,排列顺序反了,实际模型中,这个四边形也“变黑”了!

    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 4 3 2 1

     其实并不是黑了,是朝向反了,把模型旋转过来,亮面在这边(注意看形状方向)

     

    具体含义解析:-0.58是第一个顶点的x坐标,0.84是y坐标,0是z坐标,可以看到四个点都没有z坐标,都是0,这里模型就刚好在x-y轴组成的平面上!

    注:这里边隐藏了索引,肉眼看会费劲一点,借助文本编辑器会好辨识一点,为什么不写数字索引?可能为了节约空间,毕竟多一个标记和空格就是两个字节。

    v -0.58 0.84 0
    v 2.68 1.17 0
    v 2.84 -2.03 0
    v -1.92 -2.89 0

    以(索引)4为起点,经过3、2,以1为终点,画一个多边形(四边形 )

    f 4 3 2 1
    f 1 2 3 4

    组合:阴影交替闪烁面,具体效果可能要看渲染器眼色,因为同时有两个相反方向的面同时被渲染,所以会出现很多黑白闪烁和交替

    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
    f 4 3 2 1


     

    面的连接点是按顺时针排列或逆时针排列,将决定面的法线方向(面的反正)。例如:"f 1 2 3 4"面的法线向外,"f 4 3 2 1"面的法线向里。 面的连接点顺序错误,是导致导入模型产生碎面的一个重要原因。
    一个面不能出现两个以上相同的顶点,这也是检查OBJ文件出错的一个要点。例如:"f 1 2 3 4 3",有两个相同的顶点,索引号是3。一个面出现两个相同顶点,可能造成程序的内存分配错误。

    (注:目前为止用到的都是简单顶点、面片的组合,还没有纹理,纹理需要引入材质文件,还需要给每个面片加uv坐标)

    这里我简单做个尝试——引入纹理后我的第一个手工(文本编辑出来的)模型

    my_text_obj.obj

    mtllib my_mtl.mtl
    
    v -0.58 0.84 0
    v 2.68 1.17 0
    v 2.84 -2.03 0
    v -1.92 -2.89 0
    
    vt 0.000000 0.000000
    vt 1.000000 0.000000
    vt 0.000000 1.000000
    vt 1.000000 1.000000
    
    usemtl my_mtl
    f 1/1 2/2 3/3 4/4
    

    这里解释一下:vt是纹理的顶点坐标,并且是按百分比的,1.0就相当于最大了,这四个vt已经能覆盖整个材质文件 ,然后通过f附着上去,f 1/1 2/2 3/3 4/4代表用四个v去画一个平面,然后分别从材质文件拉取一个顶点位置,用多边形抠出材质,把中间的材质铺上去。

    1/1代表第一个顶点用材质0.0 0.0,

    4/4代表材质顶点1.0  1.0

    my_mtl.mtl

    mtl内容琐碎Ka、Kd先不去管他,就记着newmtl后边的名称和obj内的my_mtl是对应的,然后后边的jpg要有真实文件

    newmtl my_mtl
    Ka 1 1 1
    Kd 1 1 1
    d 1
    Ns 0
    illum 1
    map_Kd my_jpg.jpg

    my_jpg.jpg

    随便一个图片,重命名过来了

    最终模型打开效果

     太low了,我换一个dota2正方体再来

    my_dota2_cube.OBJ

    mtllib my_dota2_mtl.mtl
    v -0.50000000 -0.50000000 -0.50000000
    v -0.50000000 -0.50000000 0.50000000
    v -0.50000000 0.50000000 -0.50000000
    v -0.50000000 0.50000000 0.50000000
    v 0.50000000 -0.50000000 -0.50000000
    v 0.50000000 -0.50000000 0.50000000
    v 0.50000000 0.50000000 -0.50000000
    v 0.50000000 0.50000000 0.50000000
    vt 0.000000 0.000000
    vt 1.000000 0.000000
    vt 0.000000 1.000000
    vt 1.000000 1.000000
    f 1/1 3/2 7/4 5/3
    f 3/1 4/2 8/4 7/3
    f 5/1 7/2 8/4 6/3
    

    (别问f为什么只有3个,问就是留作业)

    my_dota2_mtl.mtl

    newmtl my_mtl
    Ka 1 1 1
    Kd 1 1 1
    d 1
    Ns 0
    illum 1
    map_Kd my_dota2_jpg.jpg

    my_dota2_jpg.jpg

    模型打开效果

       图一有点暗,因为这里的面片法向是正方向,移到正面去观察一个面亮度会高一些。

    另外还会涉及一些光影和材质问题,暂时不展开(其实我也不会)

    ------------------------------------------------------------------------------------------------------------------------

    我实际生产会经常用到的一种模型文件:倾斜摄影模型瓦块tile

    Tile_+012_+007.obj

    mtllib Tile_+012_+007.mtl
    v 5.03112303e+02 -2.04172055e+02 2.81293899e+01
    v 5.02817464e+02 -2.03965909e+02 2.80781801e+01
    ........
    
    vt 0.039116859 0.92739797
    vt 0.045456402 0.93210047
    vt 0.036766995 0.93553102
    ........
    
    usemtl Tile_+012_+007_0
    f 3/72340 1/72341 2/72342
    f 4/294 5/295 6/296
    f 7/64925 8/64926 9/64927
    
    ........
    usemtl Tile_+012_+007_untextured
    
    
    

    "f 3/72340 1/72341 2/72342"这时在面的数据中多了贴图坐标uv点和法线的索引号,索引号分别用左斜线(/)隔开。
    格式:"f 顶点索引/uv点索引/法线索引"。(不一定满格三个数据项,可能只有顶点索引和uv点索引)

    ....表示数据省略,实际不能有...

    Tile_+012_+007.mtl

    newmtl Tile_+012_+007_0
    Ka 1 1 1
    Kd 1 1 1
    d 1
    Ns 0
    illum 1
    map_Kd Tile_+012_+007_0.jpg
    newmtl Tile_+012_+007_1
    Ka 1 1 1
    Kd 1 1 1
    d 1
    Ns 0
    illum 1
    map_Kd Tile_+012_+007_1.jpg
    newmtl Tile_+012_+007_untextured
    Ka 0.501961 0.501961 0.501961
    Kd 0.501961 0.501961 0.501961
    d 1
    Ns 0
    illum 1
    

    这里用到了两个材质文件jpg

    例2:

    基于一个航空摄影数据的一小片

    只需要更改一个数值 

     第一个面片(右下角)和第二个面片变成了镜像关系,因为f中材质设定分别为6、5、3,和6、3、5

     

    关于半边数据结构:

    数据结构在内存中改造,通过自定义结构体和自定义读取、导入、转换逻辑,保持obj的格式统一,也就是wavefront这种标准的形式,halfedge专门放在内存中使用,包括和其他库的交互,只能想办法去转换。

    =========================================================================

    =========================================================================

    =========================================================================

    下边为引用,他实际是关于Maya的使用,另外,示例文件也找不到,因为我实际的文件不一定有这么全面的数据项内容,所以仅作为参考保留下来

    http://www.cppblog.com/lovedday/archive/2008/06/13/53153.html

    =========================================================================

    下面来研究一下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

    展开全文
  • 最详细的Obj数据解析

    千次阅读 2018-12-27 16:18:07
    开发的一种标准3D模型文件格式,目前市面上大多数主流的软件平台都是支持OBJ格式OBJ模型于是也就成为了一种常用的数据交换格式OBJ文件是一种文本文件,由于模型是明码标记,这就方便我们对其进行查看、编辑。 ...

    1 前言

    OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,目前市面上大多数主流的软件平台都是支持OBJ格式,OBJ模型于是也就成为了一种常用的数据交换格式。 OBJ文件是一种文本文件,由于模型是明码标记,这就方便我们对其进行查看、编辑。

    博主通过参考OBJ规范文档,将规范文档加上自己的一定理解写成本文,旨在帮助大家了解obj模型结构,在日常工作中更好使用它!

    2 概述

    2.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.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)

    OBJ里的面的索引可正可负,为正数时是指顶点的绝对索引,为负时(比如:f -a -b -c),表示从该面位置开始,倒数的第a,b,c个顶点,vn,vt索引也一样。

    OBJ文件不包含面的颜色定义信息,不过可以引用材质库,材质库信息储存在一个后缀是".mtl"的独立文件中。关键字"mtllib"即材质库的意思。

    材质库中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB(红绿蓝)的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。

    "usemtl"指定了材质之后,以后的面都是使用这一材质,直到遇到下一个"usemtl"来指定新的材质。

    注意:这里面最常用的几个参数是v,vt,vn,f,s,g,o,usemtl,mtllib 其他的参数很少用到。

    3 OBJ数据解析

    3.1 模型材质库的定义(mtllib)
    在这里插入图片描述
    将obj模型通过记事本打开之后发现,在模型的开头会定义材质库的引用对象:mtllib model.mtl 这句话的意思是材质库参考model.mtl文件,至于mtl文件的组织结构后面将会详细介绍,这里不再详述,大家只要知道它是一个模型材质库文件就行了。

    #开头的表示注释内容,软件解析文件的时候会自动忽略。

    3.2模型顶点(v)
    计算机图形学中模型通过顶点、顶点法线、顶点uv、面构成。在obj模型中模型的顶点是通过v进行标识记录的,格式为“v x y z”。其中xyz分别表示xyz坐标值。
    在这里插入图片描述

    3.3顶点法线(vn)
    模型的顶点和面都是具有法线这个概念的,法线决定着对应对象的可见性。法线朝内,对象不可见。法线朝外,对象可见。模型面的法线是可以根据模型顶点法线进行计算得到,所以obj中的法线用顶点法线表示就可以。
    在这里插入图片描述

    顶点法线使用vn进行标识,表示格式为:“vn x y z” 其中xyz分别表示xyz方向上向量值。

    3.4 顶点贴图坐标(vt)
    具有贴图的模型,模型几何与贴图是如何对应起来的?其实很简单,通过uv坐标就可以将模型与对应贴图,标识符为vt,表达格式为:“vt u v”

    在这里插入图片描述

    3.5模型面(f)
    模型面对象就像一个容器将上面的顶点坐标、顶点法线、顶点uv通过索引值进行组织在一起,封闭为模型体。面对象可以由三角形或者四边形构成,其表达格式为:”f verticeIndex\vtIndex\vnIndex”其中verticeIndex表示顶点序列号,vtIndex表示uv索引号,vnIndex表示法线索引号,其中vtIndex,vnIndex可以缺失,不写也没有关系,但是顶点索引值必须得有。
    在这里插入图片描述

    3.6 对象材质(usemtl)
    对于上面编写的模型结构,需要为这个对象指定一个材质,需要用usemtl 进行标识,格式为usemtl [material name]

    在这里插入图片描述
    3.7 其他参数
    o标识对象名称

    g 标识模型组

    s 标识光滑组
    在这里插入图片描述

    4 Mtl数据解析

    当你导出Obj模型的时候会发现除了.obj文件还会有个同名.mtl文件,这个文件用来干什么的?其实这个文件是用来记录模型的材质库参数的,包括贴图、环境光参数、模型反射等参数。
    在这里插入图片描述

    Newmtl 标识材质名称

    Ks 标识镜面反射颜色,颜色为rgb参考,取值0-1

    Ns标识镜面反射中加权反射指数

    Ka标识环境颜色,颜色为rgb参考,取值0-1

    Kd标识漫反射颜色,颜色为rgb参考,取值0-1

    d 和Tr 标识材质的透明度,Tr=1-d

    map_ka和map_kd分别表示贴图路径

    模型的材质可能会要不同的效果,为了达到这种区分,用关键字illum进行标识

    Illum 0表示颜色和环境参数关闭

    Illum 1表示颜色和环境参数开启

    Illum 2表示材质高亮显示

    Illum 3表示开启反射和光线跟踪

    Illum 4表示玻璃透明度开启,管线追踪开启

    展开全文
  • Maya打开obj模型问题

    千次阅读 2018-08-26 16:31:25
    带贴图的OBJ模型导入MAYA怎么导入贴图 给它一个材质,然后在材质的COLOR后面有一个小方格点击后会出来一个新的对话框,这时你再点击那个带FILE的图标。此时会再切换到一个新窗口,在地址栏后面点击找到你的图片位置...

    带贴图的OBJ模型导入MAYA怎么导入贴图

    给它一个材质,然后在材质的COLOR后面有一个小方格点击后会出来一个新的对话框,这时你再点击那个带FILE的图标。此时会再切换到一个新窗口,在地址栏后面点击找到你的图片位置。在MAYA中按4键是网格显示,5键是灰度模式,6键是材质显示模式。

     

    三角网格数据结构 - CSDN博客  https://blog.csdn.net/wozhengtao/article/details/51430025

    展开全文
  • 3D中的OBJ文件格式详解

    万次阅读 2015-11-29 17:28:16
    http://www.cnblogs.com/slysky/p/4081307.html常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式OBJ文件(也称目标文件),这种格式用于编译应用程序;第二种是Alias|Wavefront公司推出的...

    http://www.cnblogs.com/slysky/p/4081307.html

    常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式的OBJ文件(也称目标文件),这种格式用于编译应用程序;第二种是Alias|Wavefront公司推出的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文件的读取。 3D软件模型之间的互导是一件很常见的事情,不幸的是,目前的3D软件模型导出功能都不那么完美,经常会出现缺面少线的情况,有时还会遇到导出的模型根本打不开的情况。

    OBJ文件是一种文本文件格式,比起二进制文件为主、连每个块的用途也得试探来试探去的3DS,文本文件为主的OBJ对我们更友好。与3DS文件的树状[块结构]不同,OBJ文件只是很单纯的字典状结构,没有块ID来表征名字而是简单地用易懂的表意字符来表示。总之看上去是赏心悦目的样子,而苦处也就只有实际写导入代码的时候才知道了- -。OBJ文件优化了存储但劣化了读写。

    如果Maya自身的模型出错,也可以先转成OBJ格式,修改之后再导回Maya。

    OBJ文件 -- 概念

    OBJ文件是Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种文件格式,这种格式同样也以通过Maya读写。

    OBJ文件是一种文本文件,可以直接用写字板打开进行查看和编辑修改。

    另外,有一种与此相关二进制文件格式(使用".MOD"后缀),二进制格式作为专利未公开,因此在这里我们不作讨论。

    OBJ最近的有文档的版本是v3.0,代替以前的v2.11版本。

    OBJ3.0格式支持多边形(Polygon),直线(Lines),表面(Surfaces),和自由形态曲线(Free-form Curves)。

    直线和多角形通过它们的点来描述,曲线和表面则根据于它们的控制点和依附于曲线类型的额外信息来定义。这些信息支持规则和不规则的曲线,包括那些基于贝塞尔(Bezier)曲线,B样条(B-spline),基数(Cardinal/Catmull-Rom样条),和泰勒方程(Taylor equations)的曲线。

    1、OBJ文件 -- 特点

    (1)OBJ是一种3D模型文件,因此不包含动画、材质特性、贴图路径、动力学、粒子等信息。

    (2)OBJ文件主要支持多边形(Polygons)模型。

    虽然OBJ文件也支持曲线(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文件记录一个四边形的代码: 
      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

    让我们来创建一个OBJ文件,不过这一回我们不用3D软件,而是用写字板来创建。 
      打开写字板,把上面的5行代码写上去,可以适当加一点注释。 
      保存文件为文本格式,文件名为"myObj.obj",。

    注意:代码最后一定要按一下回车把光标切换到下一行,就是说加一个换行符(\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"表示面(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文件不支持有孔的多边形面。

    OBJ文件 -- 实际问题: 
      现在来讨论一点比较实际的问题吧,就是一旦你遇到了一个出错的OBJ文件,倒底该怎么办? 
      当你打开OBJ文件后,往往会看到有几万行的代码,你恐怕还没本事情一眼看出错误所在行,除非程序的错误信息中已经告诉你错误行。如果你不知道错误在哪里,可以用排除法,弄清楚肯定正确的代码范围,通过缩减错误代码范围定位错误。例如,你先新建一个空的OBJ文件,把有错的OBJ文件代码粘贴一半过来,然后把这个只有一半代码的新OBJ文件导入Maya。如果这时没有错误信息,说明错误行是在另一半代码中,可以从另一半代码中再粘贴一部分代码试试看;如果这时出现错误,说明错误行就在粘贴的代码中,可以把粘贴过来的代码删去一部分再试试看。就这样,逐步缩减范围直到找到错误行为止。 
      这种方法虽然很麻烦,不过颇为有效。如果你不会编程,又遇到非常紧急的情况,这种方法还是值得一试的。

      OBJ文件 -- 细节: 
      掌握了这么多差不多也够用了,不过由于网上详细讲解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 

      面可以使用负值索引,有时用负值索引描述面更为简便。 
      "f -4 -3 -2 -1"这句索引值"-3"表示从"f"这行往上数第3个顶点,就是"v -0.500000 0.000000 -0.800000",其它的索引值以此类推。 因此与这一行等效的正值索引写法为:"f 1 2 3 4" 
      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 

      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

    展开全文
  • .obj文件格式与.mtl文件格式

    万次阅读 多人点赞 2015-07-07 17:55:23
    最近在学习obj文件格式,上网查了些资料,很难找到比较全面的文章,尤其是对.mtl文件的说明甚少。今天把最近搜索的资料整合了一下。这里的obj文件格式指的是Wavefront公司为它的一套基于工作站的3D建模和动画软件...
  • 三维文件格式三维软件之间互相导入导出一般会涉及到一些格式不兼容的问题,这里就给大家普及一下这些常用的三维文件格式。不同的格式有着不同的定位及用处,有开源的也有商业的。目前很多三维软件之间互导迫在眉睫,...
  • 使用txt文本模拟obj格式的三维模型信息,及打开任意三...下面的代码是一个类似maya的微型程序,可以打开任意的以txt格式储存相关信息的三维模型。 2, txt文本内的信息如下: 4 3 6 2 4 3 0 0 1 1080 640 2 1 1 0 1 ...
  • OBJ(3D模型)文件格式

    万次阅读 2018-08-16 13:42:28
    在最近的3D编程中,想开始做一些多模型的Demo,而网上显然没有那么多直接可供DirectX使用的模型文件(.x),而3D模型文件格式中的obj文件则具有较好的通用性,不仅支持各类3D建模软件的互相导入导出,在Maya上还可以...
  • OBJ文件格式详解

    2017-11-08 22:20:02
    OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模型之间的互导,也可以通过Maya读写。比如你在3dsMax或LightWave中建了...
  • .obj文件格式与.mtl文件格式(转)

    千次阅读 2016-03-23 11:34:18
    .obj文件格式与.mtl文件格式
  • 一篇详解OBJ格式以及实现读入的文章,可以参考参考(介绍了当今流行的三维作图工具Maya,阐述了Maya 生成的OBJ 三维格式,如何将OBJ 格式文件在OpenGL(Open Graphic Library)中进行输入和处理。重点介绍了OBJ 文件的...
  • obj文件格式解读

    2019-12-25 21:43:58
    学习了很长一段时间的建模,obj文件一直都在使用,...maya导出的obj格式主有4种数据, v顶点——代表该点的xyz坐标 vt纹理坐标——对应贴图上的坐标位置 vn顶点法向量——向量xyz方向 f 面——格式为 :f v/vt...
  • 3D中的OBJ文件格式详解(转)

    万次阅读 2015-10-26 10:11:22
    常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式OBJ文件(也称目标文件),这种格式用于编译应用程序;第二种是Alias|Wavefront公司推出的OBJ模型文件。本文对第二种obj模型文件进行分析...
  • .obj 和 .mtl文件格式

    千次阅读 2019-08-10 14:21:32
    obj文件是3D模型文件格式。由Alias|Wavefront公司为3D建模和动画软件"Advanced Visualizer"开发的一种标准,适合用于3D软件模型之间的互导,也可以通过Maya读写。 只支持模型三角面数据和材质信息,无动画功能支持...
  • 序: 在GIS的开发当中经常遇到模型的需要。Cesium作为一个优秀的GIS三维引擎库,它支持的格式是gltf或者glb。如何把拿到的模型转为gltf和glb呢?...打开obj或者fbx格式的文件,如图: 二、另存 ...
  • FBX格式obj格式的区别

    万次阅读 2019-06-25 17:36:50
    FBX格式obj格式的区别 目前主流常用的通用模型格式FBX格式OBJ都是众多可以用在众多软件平台的。...FBX模型是一种通用模型格式,支持所有主要的三维数据元素以及二维、音频和视频媒体元素,Aut...
  • OBJ文件格式

    2019-07-11 10:03:28
    OBJ文件是一种标准的3D模型文件格式,很适合用于3D软件模型之间的互导。OBJ文件是一种文本文件格式,这就意味着你可以直接用写字板打开进行查看修改。目前几乎所有知名的3D软件都支持OBJ文件的读写,不过很多软件...
  • 常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式OBJ文件(也称目标文件),这种格式用于编译应用程序;第二种是Alias|Wavefront公司推出的OBJ模型文件。本文对第二种obj模型文件进行分析...
  • Obj与mtl 3D文件格式详解

    千次阅读 2017-10-23 15:27:11
     obj文件格式是Wavefront公司为它的一套基于工作站的3D建模和动画软件"AdvancedVisualizer"开发的一种文件格式OBJ文件是一种标准的3D模型文件格式,很适合用于3D软件模型之间的互导。OBJ文件是一
  • .obj 和 .mtl格式详解

    2019-11-28 10:35:05
    obj文件是3D模型文件格式。由Alias|Wavefront公司为3D建模和动画软件"Advanced Visualizer"开发的一种标准,适合用于3D软件模型之间的互导,也可以通过Maya读写。 只支持模型三角面数据和材质信息,无动画功能支持...
  • 根据目前看到的资料帮助,使用超图桌面版加载obj 3D模型的步骤如下; 新建场景,图层管理器---普通图层右键,新建KML----开启KML可编辑,右键添加模型。 下面来操作一下; 下一个obj模型;用模型查看器可以打开; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 749
精华内容 299
关键字:

mayaobj数据格式