什么是OBJ 

2006-09-13 23:14 发布

4446 5 0

图像使用2次方是很讨厌的问题,不在技术难度上,而在技术妥协上.实际上要求美工作出2次方纹理,并且整张图的空间利用率要高,是很难的.
当有些策划丢过来奇奇怪怪的尺寸的图像,我都要吐血,当知道2n次方限制后,他们把图像尺寸扩大一下,再丢给我空余大量空白的2n次方纹理,再吐血.

玻璃渣资源里标准的2n次方人物纹理,图像挤的满满的,每个身体部位纹理还是一个矩形,利用率之高不得不令人佩服,然而这对美工要求是极高的.
1024*768的图像是要拆成4*3的256*256图像的,而不是一整大张纹理,因为768不是2的n次方,更不要扩大为1024*1024,加大25%的内存.
还有Wow里Loading界面的图像都压成512*512,因为Loading图像模糊一点不要紧,很简单却都是很重要的细节.
所以当Wow运行在我Geforce2的显卡上时,我觉的很cool.

Nvidia的驱动程序也很讨厌,实际Geforce6显卡才支持non power of two texture,Geforce 5200级的显卡,在硬件能力上不足以支持NPOT,但是最新的驱动程序使用了软件模式进行模拟支持,而软件模拟根本毫无实用价值,渲染变得超级缓慢,因为驱动程序每次纹理渲染都会很聪明地把非2次方尺寸图像自动Scale到2次方尺寸,对于一个800*600的图像,驱动程序在这个步骤就吃光了CPU.
所以总有些人喊着为什么OpenGL没有软件渲染支持,DX很体贴都有(实际上DX也没有,比如那个所谓的8层纹理),而我认为如果软件渲染能解决问题,那要硬件作什么!不能解决问题的方案我们支持它作什么!

B Color Smilies

全部评论5

  • hanbin933
    hanbin933 2006-9-13 23:16:00

    // OpenGL动态执行2n次方图像限制
    inline int next_p2(int a)
    {
     int rval=1;
     while(rval<a) rval<<=1;
     return rval;
    }

    int nWidthPowerOfTwo = next_p2(tex.nWidth);
    int nHeightPowerOfTwo = next_p2(tex.nHeight);

    if(tex.nWidth == nWidthPowerOfTwo  &&  tex.nHeight == nHeightPowerOfTwo)
    {
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, nWidthPowerOfTwo, nHeightPowerOfTwo, 0, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE, ilGetData());
     tex.fScaleX = tex.fScaleY = 1.0f;
    }
    else
    {
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, nWidthPowerOfTwo, nHeightPowerOfTwo, 0, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE, NULL);
     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex.nWidth, tex.nHeight, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE, ilGetData());
     tex.fScaleX = (float)tex.nWidth / (float)nWidthPowerOfTwo;
     tex.fScaleY = (float)tex.nHeight/ (float)nHeightPowerOfTwo;
    }

    然而对这个问题,正确的解决方案是事先规划,强制执行,be clever.
     
     
     
    添加评论
    19:58  |  固定链接 | 引用通告 (0) | 记录它
     
     
    固定链接  关闭
     
    http://zergb.spaces.msn.com/blog/cns!C417B6C5A59504CE!550.entry
     

     
     
     
     
     

     
    5月17日
     
     
     
    在控制台程序中隐藏控制台窗口
     
    大家都知道,当编写一个win32 console application时,当运行此类程序的时候
    默认情况下会有一个类似DOS窗口的console窗口,但是有的时候我们只想在程序
    中运行一段功能代码,不希望显示这个console窗口,让代码执行完毕之后程序自
    动退出.

    下面就介绍一下,如何隐藏win32 console application的console窗口

    因为此种方法是通过设置编译器的链接开关来实现,所以让我们来看一下编译
    器的链接开关选项(也就是linker选项).

    首先我们来看一下linker的 /subsystem 选项

    该选项的语法形式如下:
    /SUBSYSTEM:{CONSOLE|EFI_APPLICATION|EFI_BOOT_SERVICE_DRIVER|
                EFI_ROM|EFI_RUNTIME_DRIVER|NATIVE|POSIX|WINDOWS|WINDOWSCE}
                [,major[.minor]]

    这个链接选项告诉操作系统如何运行可执行文件

    CONSOLE:
    win32 字符模式应用程序,此种类型的应用程序在运行的时候会产生一个类似DOS
    窗口的控制台窗口,如果在应用程序的主函数为main()或者wmain(),在默认情况下
    该应用程序就是一个控制台应用程序

    Extensible Firmware Interface
    和CPU具体架构相关的一个参数选项,并不常用,在这里暂不详细介绍.
    如果对此有兴趣的可以访问intel主页来查看相关内容

  • hanbin933
    hanbin933 2006-9-13 23:17:00

    NATIVE;
    设备驱动器选项,如果/DRIVER:WDM选项被设定的话,该链接选项(NATIVE)就为默认选项

    POSIX:
    在windows NT 种运行在POSIX子系统上的应用程序

    WINDOWS:
    该类型的应用程序不产生console窗口,该类型的应用程序的窗口由用户自己创建,简而言之
    就是一个标准的Win32 application,其入口地址为WinMain()函数或者wWinMain()函数的地址
    如果你在应用程序种定义的主函数为WinMain或者wWinMain,在默认情况下该应用程序就是一个
    Win32 Application !

    WINDOWSCE:
    运行在windows CE上的应用程序

    major and minor (optional):
    主版本号和次版本号,该选项为可选,该选项为0~65535之间的十进制整数

    从上面可以看出如果我们建立一个win32 console application的话,linker的/subsystem选项应该为
    CONSOLE,可以在VC开发环境的project->setting->link->project option中看到!

    接下来我们再看看应用程序是如何运行的!
    我们知道用VC编写的程序,运行的时候是需要 C\C++运行库支持的.当我们运行一个C/C++程序的时候
    链接器会首先寻找应用程序的启动函数,例如:
    如果你建立了一个console程序的话,编译器得链接开关会是以下这种形式
    /subsystem:"console" /entry:"mainCRTStartup"   (ANSI)
    /subsystem:"console" /entry:"wmainCRTStartuup" (UNICODE)

    如果你建立了一个win32 application,编译器得链接开关则会是一下形式
    /subsystem:"windows" /entry:"WinMain"   (ANSI)
    /sbusystem:"windows" /entry:"wWinMain"  (UINCODE)

    上面的两种形式可以再project->setting->link->project option中看到
    上面的subsystem和entry并不需要都设置,如果你只设置了/subsystem:"console"
    的话,那么默认的entry开关在默认情况下应为/entry:"mainCRTStartup"
    反之,如果你在应用程序中定义了main函数的话,默认情况下,你的/subsystem开关
    应该为/system:"console"


    在默认情况下/subsystem 和/entry开关是匹配的,也就是
    console对应mainCRTStartup或者wmainCRTStartup
    windows对应WinMain或者wWinMain

    但是我们也可以通过手动改动的方式使他们不匹配


    例如我们可以这样改动

    #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) // 设置入口地址


    int main(int argc, char* argv[])
    {
     MessageBox(NULL, "hello", "Notice", MB_OK);
     return 0;
    }

    在默认情况下链接器看到/subsystem下是windows选项的时候,它会自动寻找WinMain或者wWinMain

    但我们强制指定入口地址,这样运行程序的时候默认的console窗口就会隐藏!


    上面是在代码中使用#pragma指令来设置,还有一种就是直接在开发环境的
    project->setting->link->project option中手工改动!

    写了这么多,自己都有点感觉乱,没有办法,以前没写过什么文章,所以措辞可能不太好,希望大家见谅

  • hanbin933
    hanbin933 2006-9-13 23:19:00

    OBJ文件格式内幕 
     

     
      我们经常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式的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建模和动画软件"Advanced Visualizer"开发的一种文件格式,这种格式同样也以通过Maya读写。
       要想知道一个文件是不是OBJ文件,通常根据这个文件名的后缀来判断,OBJ文件的后缀是".obj"。OBJ文件是让人可读的文本,你可以直接用写字板打开对它进行编辑。
    另外,有一种与此相关二进制文件格式(使用".MOD"后缀),二进制格式作为专利未公开,因此在这里我们不作讨论。
       OBJ最近的有文档的版本是v3.0,代替以前的v2.11版本。
      OBJ3.0格式支持多边形(Polygon),直线(Lines),表面(Surfaces),和自由形态曲线(Free-form Curves)。
    直线和多角形通过它们的点来描述,曲线和表面则根据于它们的控制点和依附于曲线类型的额外信息来定义。这些信息支持规则和不规则的曲线,包括那些基于贝塞尔(Bezier)曲线,B样条(B-spline),基数(Cardinal/Catmull-Rom样条),和泰勒方程(Taylor equations)的曲线。
       OBJ文件 -- 特点
      (1)OBJ是一种3D模型文件,因此不包含动画、材质特性、贴图路径、动力学、粒子等信息。
      (2)OBJ文件主要支持多边形(Polygons)模型。
    虽然OBJ文件也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials),但Maya导出的OBJ文件并不包括这些信息。
      (3)OBJ文件支持三个点以上的面,这一点很有用。
    很多其它的模型文件格式只支持三个点的面,所以我们导入Maya的模型经常被三角化了,这对于我们对模型的再加工甚为不利。     (4)OBJ文件支持法线和贴图坐标。
      在其它软件中调整好贴图后,贴图坐标信息可以存入OBJ文件中,这样文件导入Maya后只需指定一下贴图文件路径就行了,不需要再调整贴图坐标了。

    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文件 -- 实例:
      下面通过实例来具体讲解。
      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 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
      

  • hanbin933
    hanbin933 2006-9-13 23:19:00
    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
     
     
     
    添加评论
    14:30  |  固定链接 | 引用通告 (0) | 记录它 | OpenGL
     
     
    固定链接  关闭
     
    http://zergb.spaces.msn.com/blog/cns!C417B6C5A59504CE!454.entry
     

     
     
     
     
     

     
    2月11日
     
     
     
    河南理工大学FTP,软件下载,速度200k以上
     
    ftp://218.196.240.20
     
     
    添加评论
    21:36  |  固定链接 | 引用通告 (0) | 记录它
     
     
    固定链接  关闭
     
    http://zergb.spaces.msn.com/blog/cns!C417B6C5A59504CE!358.entry
     

     
     
     
     
     

     
    12月15日
     
     
     
    使用OpenGL开发时Blend混合的参数选择技巧
     
    在使用glBlendFunc(GLenum sfactor,   GLenum dfactor )函数时,经常为选择合适的参数而大伤脑筋,不同的参数会产生不同的半透明等效果。实际上,Src有9个参数可选,而Dst有8个参数可选,从而一共有72种组合。 使用以下代码,可以查看所有可能的渲染效果,然后根据特效的索引值选择合适的参数即可。其中,RenderObjectWithAlphaAndTexture()函数是伪代码。
     
    static GLenum SRC_FACTOR[9] =
     {GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA_SATURATE,
     GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA};

     static GLenum DST_FACTOR[8] =
     {GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA,
     GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA};

     for (int i=0; i<9; i++)
      for (int j=0; j<8; j++)
     {
      glBlendFunc(SRC_FACTOR, DST_FACTOR[j]);
      rectd.x = i*(w+10);
      rectd.y = j*(h+10);
      RenderObjectWithAlphaAndTexture();
     }

  • hanbin933
    hanbin933 2006-9-13 23:20:00
    抄贴也很累,不过真有用大家看看

你可能喜欢

什么是OBJ 
联系
我们
快速回复 返回顶部 返回列表