Unfold 3D无法e3d怎么导入objj文件怎么回事

后使用快捷导航没有帐号?
查看: 5161|回复: 11
unfold 3d 7.2 在win7 64位系统一导入就崩溃&&这是为什么啊?
没用过不了解。。
和系统版本没有绝对的关系,因为现在做CG的大多都是WIN7 64了,大家用也没出事。。
只能说从几个地方着手试试,关掉一些闲杂的软件(比如迅雷,就好像maya2011以上版本会和迅雷有冲突,有时美图看看等带GPU加速功能的软件也会影响),尝试使用WINDOWS经典模式下运行软件,更新各类运行库,驱动。还可以试下更新下软件版本,现在有7.3的版本了,最后就是最极端的,重装系统。
排除法一个个试吧,之前遇到MAYA兼容性问题也是一个个试出来的。Good luck
otkdl 发表于
和系统版本没有绝对的关系,因为现在做CG的大多都是WIN7 64了,大家用也没出事。。
只能说从几个地方着手试 ...
谢谢& &我还这尝试中
这是鼠标设置问题,导入模型后,不要动鼠标,一旦移动就会报错,导入模型然后按qwe,然后再动鼠标,设置鼠标预设就可以用了& &(google的)&&
这个问题是解决了&&新问题来了&&一个简单的球导入都卡卡的
那就换7.0吧
7.0也有破解?
我的也是这样
zivix 发表于
那就换7.0吧
请问unfold 3d 教学啥时候出啊!?
&星际战士下集发售以后&
先不要导入模型,先把鼠标设置改成max的或者maya的,然后就不会报错了。
Powered by【转】OBj文件格式详解
&&&【转自】&/post.1521053.html
我们经常见到的*.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   v 0...500000   v -0...500000   v 0...500000   v -0...500000   v 0...500000   v -0...500000   v 0...500000   vt 0..000000   vt 1..000000   vt 0..000000   vt 1..000000   vt 0..000000   vt 1..000000   vt 0..000000   vt 1..000000   vt 0..000000   vt 1..000000   vt 2..000000   vt 2..000000   vt -1..000000   vt -1..000000   vn 0...000000   vn 0...000000   vn 0...000000   vn 0...000000   vn 0...000000   vn 0...000000   vn 0...000000   vn 0...000000   vn 0...000000   vn 0...000000   vn 0...000000   vn 0...000000   vn 0...000000   vn 0...000000   vn 0...000000   vn 0...000000   vn 1...000000   vn 1...000000   vn 1...000000   vn 1...000000   vn -1...000000   vn -1...000000   vn -1...000000   vn -1...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&这句&vt&代表点的贴图坐标。   &vn 0...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...800000&,其它的索引值以此类推。 因此与这一行等效的正值索引写法为:&f 1 2 3 4&   v -0...400000   v -0...800000   v -0...800000   v -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   v 0...000000   v 2...000000   v 2...000000   v 0...000000   v 0...000000   v 2...000000   v 2...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   v -5...000000   v -5...000000   v -5...000000   v -1...000000   v -1...000000   v -1...000000   v -1...000000   v 1...000000   v 1...000000   v 1...000000   v 1...000000   v 5...000000   v 5...000000   v 5...000000   v 5...000000   # 16 vertices   cstype bezier   deg 3 3   # Example of line continuation   surf 0.... 14 \   15 16 9 10 11 12 5 6 7 8 1 2 3 4   parm u 0..000000   parm v 0..000000   end    # 1 element
  基数曲线(Cardinal Curve):   Maya好像不支持OBJ格式的曲线,导入时不会出现错误信息,却也不会出现曲线。   # 3.0 Cardinal curve   v 0...000000   v -0...000000   v -0...000000   v 1...000000   v 3...000000   # 6 vertices   cstype cardinal   deg 3   curv 0.. 2 3 4 5 6   parm u 0....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   v 0...000000   v 2...000000   v 2...000000   vt 0...000000   vt 0...000000   vt 1...000000   vt 1...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
  fixLWObj_v1.0   最后,我再提供一个自己编写的专门修复重复顶点错误的mel程序,可以修复LightWave 3D OBJ Export v2.1输出的某些*.obj文件无法导入Maya的错误。
  使用方法:   新建一个文件夹,把你要修复的*.obj文件都放到这个文件夹里,把fixLWObj.mel也放到这个文件夹里,   然后把fixLWObj.mel拖放到Maya视窗中,耐心地等一两分种,就可以完成修复。   可以在Output视窗看到修复的进度。   修复完后你会发现文件夹中多个一个名为fix的文件夹,修复过的*.obj文件就存放在fix文件夹中。   文件夹中的Output.txt文件记录修复信息。
请各位遵纪守法并注意语言文明unity导入fbx\obj文件出现的问题
往unity导入fbx\obj文件后,发现模型左右方向是反的,还需要在unity里将z轴旋转180度。
尝试了在导出fbx文件,选择z轴还是y轴向上,结果此设置导入unity后没起任何效果。
导出fbx文件时,有一个单位比例转换选项,如果max场景设置为米的话,转换比例(1m will be 1m;scale
factor 0.01)设置为0.01,则导入后的模型会与unity场景比例一致。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。MAYA生成的OBJ文件导入3D MAX不显示是怎么回事啊_百度知道
MAYA生成的OBJ文件导入3D MAX不显示是怎么回事啊
提问者采纳
确定maya导出的obj文件是哪种多边形。,是否有材质
导出文件时怎么设置成四边形啊 谢谢
提问者评价
其他类似问题
为您推荐:
obj文件的相关知识
其他2条回答
导入进后按z如果还没有,导fbx格式…
不是不显示
缩放一下吧
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁OpenGL进阶(十) - obj文件的导入 - 推酷
OpenGL进阶(十) - obj文件的导入
Obj文件简介
& & & &&OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件&Advanced Visualizer&开发的一种标准3D模型文件格式,很适合用于3D软件模型之间的互导,也可以通过Maya读写。比如你在3dsMax或LightWave中建了一个模型,想把它调到Maya里面渲染或动画,导出OBJ文件就是一种很好的选择。目前几乎所有知名的3D软件都支持OBJ文件的读写,不过其中很多需要通过插件才能实现。
& & & & & 有一款开源的3D编辑,渲染软件,叫Blender,通过Blender建模,OpenGL导入,就可以更好的发挥想象,通过Linux+Blender+OpenGL这一套完全的开源平台,创造属于自己的3D世界。
OBJ文件导出
& & & &首先需要在系统中安装Blender,软件中心搜一下就可以找到了,2.62版本。也可以到官网下载最新的2.68版本。
& & & &安装好之后打开软件,已经建好了一个cubic,鼠标右键可以选定并且拖动模型,中键用于变换视角,滚轮用于放大和缩小视图。
& & & &选中方块之后按delete把它删掉,因为这个模型太简单了,之所以要用三维建模软件,就是为了应付复杂的模型,如果只是一个cubic,直接画一下就出来了。
& & & & 接下来创建一个猴脸!
& & & & Add -& Mesh -& Monkey
File -& Export -& .obj
&下面的选项一定要注意!
改一下名字,命名为monkey.obj, 回车~。
用gedit打开看一下:
# Blender v2.62 (sub 0) OBJ File: 'quit.blend'
# www.blender.org
v 0...239630
v -0...239630
v 0...169318
v -0...169318
vn 0...653910
vn -0...653910
vn -0...199693
f 96//81 152//81 150//81
f 153//82 99//82 97//82
f 153//82 97//82 151//82
f 98//83 100//83 154//83
v & &:顶点的坐标
vn :顶点法向量
f & &:面,96//81 152//81 150//81 指的是面的三个顶点,96指面的第一个顶点指的是前面定义的第96号顶点,81指的是第81个法向量,后面的两个顶点类推。
注:老版本的blender导出来的obj文件会有些许的不同,最好查看好obj的文件内容之后再进行解析!
简单的Parser
obj文件格式非常简单,用c++的vector可以很好的处理变长数组的问题。
bool loadOBJ(
const char * path,
std::vector&glm::vec3& & out_vertices,
std::vector&glm::vec2& & out_uvs,
std::vector&glm::vec3& & out_normals
printf(&Loading OBJ file %s...\n&, path);
std::vector&unsigned int& vertexIndices, uvIndices, normalI
std::vector&glm::vec3& temp_
std::vector&glm::vec2& temp_
std::vector&glm::vec3& temp_
FILE * file = fopen(path, &r&);
if( file == NULL ){
printf(&Impossible to open the file ! Are you in the right path ? See Tutorial 1 for details\n&);
while( 1 ){
char lineHeader[128];
// read the first word of the line
int res = fscanf(file, &%s&, lineHeader);
if (res == EOF)
// EOF = End Of File. Quit the loop.
// else : parse lineHeader
if ( strcmp( lineHeader, &v& ) == 0 ){
cout&&&Get v&&&
fscanf(file, &%f %f %f\n&, &vertex.x, &vertex.y, &vertex.z );
temp_vertices.push_back(vertex);
}else if ( strcmp( lineHeader, &vt& ) == 0 ){
cout&&&Get vt&&&
fscanf(file, &%f %f\n&, &uv.x, &uv.y );
uv.y = -uv.y; // Invert V coordinate since we will only use DDS texture, which are inverted. Remove if you want to use TGA or BMP loaders.
temp_uvs.push_back(uv);
}else if ( strcmp( lineHeader, &vn& ) == 0 ){
cout&&&Get vn&&&
fscanf(file, &%f %f %f\n&, &normal.x, &normal.y, &normal.z );
temp_normals.push_back(normal);
}else if ( strcmp( lineHeader, &f& ) == 0 ){
cout&&&Get f&&&
std::string vertex1, vertex2, vertex3;
unsigned int vertexIndex[3], uvIndex[3], normalIndex[3];
int matches = fscanf(file, &%d//%d %d//%d %d//%d\n&, &vertexIndex[0], &normalIndex[0], &vertexIndex[1], &normalIndex[1], &vertexIndex[2], &normalIndex[2]);
if (matches != 6){
printf(&File can't be read by our simple parser :-( Try exporting with other options\n&);
vertexIndices.push_back(vertexIndex[0]);
vertexIndices.push_back(vertexIndex[1]);
vertexIndices.push_back(vertexIndex[2]);
normalIndices.push_back(normalIndex[0]);
normalIndices.push_back(normalIndex[1]);
normalIndices.push_back(normalIndex[2]);
// Probably a comment, eat up the rest of the line
char stupidBuffer[1000];
fgets(stupidBuffer, 1000, file);
// For each vertex of each triangle
for( unsigned int i=0; i&vertexIndices.size(); i++ ){
// Get the indices of its attributes
unsigned int vertexIndex = vertexIndices[i];
unsigned int normalIndex = normalIndices[i];
// Get the attributes thanks to the index
glm::vec3 vertex = temp_vertices[ vertexIndex-1 ];
glm::vec3 normal = temp_normals[ normalIndex-1 ];
// Put the attributes in buffers
out_vertices.push_back(vertex);
out_normals .push_back(normal);
这里只处理顶点和法向量,uv坐标再议。
下面的代码可以用来加载monkey.obj , 并且打印坐标信息。
// Read our .obj file
vector&glm::vec3&
vector&glm::vec2&
vector&glm::vec3&
bool res = loadOBJ(&monkey.obj&, vertices, uvs, normals);
cout&&vertices.size()&&
for(int i=0; i&vertices.size(); i++)
cout && vertices[i].x && & & && vertices[i].y && & & && vertices[i].z&&
运行效果就想这样;
&说明格式解析正确了。
& & & 由于C/C++标准库中没有几何数学库,这样造成在开发一个三维系统之初往往都需要自行实现一个实用的几何数学库,这样太费时费力了。Boost中有几何数学库,不过就这几行代码要用boost似乎有点牛刀小用了....GLM的出现可以很好的解决这个问题。
& & & GLM设计上遵照OpenGL Shading Language风格,使用开放的MIT授权协议。会GLSL的人可以很快上手。因采用了数据结构与函数方法分离的方式,可以很容易扩充函数方法而不改变原文件(增加新的头文件即可,不过得在不同的头文件中找函数方法比较费力)。
& & & &顺便提一句,glm还可以很好的集成到cuda中去。
& & &可以去官网(
)下载最新的源码,无需编译,解压之后直接将里面的glm文件夹拷贝到
/usr/local/include
目录下面就可以使用了。
& & &官网可能被墙掉了,我自己上传了一份到csdn,
& &之前的一些代码都是用C来完成,因为代码的没几行,但现在我觉得需要花点时间来重构一下代码了,改用面向对象,我用的是CodeBlocks来构建项目的,觉得不想用IDE的可以用CMake的。
首先来看一下项目结构:
cgl 是对OpenGL的封装,csdl是对SDL的封装,util则是一个工具类。简单看一下头文件。
#ifndef CGL_H
#define CGL_H
#include &GL/glew.h&
#include &GL/gl.h&
#include &GL/glu.h&
#include &SDL/SDL.h&
#include &util.h&
CGL(int _width, int _height);
virtual ~CGL();
bool initGL();
bool resizeGL(int width,int height);
bool renderGL();
protected:
#endif // CGL_H
#ifndef SDL_H
#define SDL_H
#include &SDL/SDL.h&
#include &GL/glew.h&
#include &GL/gl.h&
#include &GL/glu.h&
class CSDL
CSDL(int width, int height, int bpp, int flags);
virtual ~CSDL();
void init(Uint32 flags);
void quit(int code);
void toggle_fullscreen();
void handleKeyEvent( SDL_keysym* keysym );
void handleEvent();
void setCaption(char *);
protected:
int screen_
int screen_
int screen_
SDL_Surface *
//Whether the window is windowed or not
//Whether the window is fine
bool windowOK;
#endif // SDL_H
#ifndef UTIL_H
#define UTIL_H
#include &glm/glm.hpp&
#include &vector&
#include &string&
#include &cstring&
#include &iostream&
class Util
virtual ~Util();
bool loadOBJ(const char * path,std::vector&glm::vec3& & out_vertices,std::vector&glm::vec2& & out_uvs,std::vector&glm::vec3& & out_normals);
char *textFileRead(char *fn);
protected:
#endif // UTIL_H
cpp就不贴了,太长。
这样,main.cpp就非常简洁了~
#include &iostream&
#include &csdl.h&
#include &cgl.h&
const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT =800;
const int SCREEN_BPP = 32;
int main()
CGL *gl = new CGL(SCREEN_WIDTH, SCREEN_HEIGHT);
// Color depth in bits of our window.
int flags= SDL_OPENGL|SDL_RESIZABLE;
CSDL *sdl = new CSDL(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,flags, gl);
sdl-&setCaption(&Load obj in OpenGL&);
gl-&initGL();
while(true) { sdl-&handleEvent(gl); gl-&renderGL(); } return 0;}
需要修改渲染内容的话,直接修改cgl.cpp中的代码就可以了,要添加功能函数就在util中添加,而sdl类基本就不用修改了。
花了一个晚上了用面向对象的方式重构代码,这个时间是值得的——代码结构变得非常清晰,健壮性和可读性都有很大的提升,调试起来也更加方便。
接下来就要在OpenGL中导入obj文件了。
首先修改一下initGL函数,设置一下灯光和材质,同时导入obj文件。
bool CGL::initGL()
float ratio = width /
// Our shading model--Gouraud (smooth).
glShadeModel( GL_SMOOTH );
// Set the clear color.
glClearColor( 0, 0, 0, 0 );
// Setup our viewport.
glViewport( 0, 0, width, height );
glEnable(GL_DEPTH_TEST);
//Change to the projection matrix and set our viewing volume.
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 60.0, ratio, 1.0, 100.0 );
GLfloat light_position[] = {13.0, 13.0, 13.0, 0.0};
GLfloat white_light[] = {1.0, 0.0, 0.0, 1.0};
GLfloat lmodel_ambient[] = {0.1, 0.1, 0.1, 1.0};
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light);
glLightfv(GL_LIGHT0,GL_SPECULAR,white_light);
GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat mat_shininess[] = {50.0};
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
//Read .obj file and store the infos
bool res = util.loadOBJ(&monkey.obj&, vertices, uvs, normals);
return( true );
接下来就可以进行渲染了:
glBegin(GL_TRIANGLES);
for(i = 0; i&nodesS i++)
glNormal3f(normals[i].x, normals[i].y, normals[i].z);
glVertex3f( vertices[i].x, vertices[i].y, vertices[i].z);
实际就是不断地绘制三角形...
当然,你也可以去一些网站下载一些模型来载入~搜 Blender model
《OpenGL编程指南》示例笔记(1)--渲染光照球体 - http://blog.csdn.net/norains/article/details/5684011
Model loading - http://www.opengl-tutorial.org/beginners-tutorials/tutorial-7-model-loading/
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
排版有问题
没有分页内容
视频无法显示
图片无法显示

我要回帖

更多关于 element 3d导入obj 的文章

 

随机推荐