OBJ文件格式详解
- 格式:docx
- 大小:78.08 KB
- 文档页数:12
OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模型之间的互导,也可以通过Maya读写。
比如你在3dsMax或LightWave中建了一个模型,想把它调到Maya里面渲染或动画,导出OBJ文件就是一种很好的选择。
目前几乎所有知名的3D软件都支持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),尽管经常使用几行文件信息的注释作为文件的开头。
文件格式简介Cube.objmtllib cube.mtlg defaultv -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.001992 0.001992vt 0.998008 0.001992vt 0.001992 0.998008vt 0.998008 0.998008vt 0.001992 0.001992vt 0.998008 0.001992vt 0.001992 0.998008vt 0.998008 0.998008vt 0.001992 0.001992vt 0.998008 0.001992vt 0.001992 0.998008vt 0.998008 0.998008vt 0.001992 0.001992vt 0.998008 0.001992vt 0.001992 0.998008vt 0.998008 0.998008vt 0.001992 0.001992vt 0.998008 0.001992vt 0.001992 0.998008vt 0.998008 0.998008vt 0.998008 0.998008vt 0.001992 0.998008vt 0.998008 0.001992vt 0.001992 0.001992vn 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.000000vn 0.000000 1.000000 0.000000vn 0.000000 1.000000 0.000000vn 0.000000 1.000000 0.000000vn 0.000000 1.000000 0.000000vn 0.000000 0.000000 -1.000000vn 0.000000 0.000000 -1.000000vn 0.000000 0.000000 -1.000000vn 0.000000 0.000000 -1.000000vn 0.000000 -1.000000 0.000000vn 0.000000 -1.000000 0.000000vn 0.000000 -1.000000 0.000000vn 0.000000 -1.000000 0.000000vn 1.000000 0.000000 0.000000vn 1.000000 0.000000 0.000000vn 1.000000 0.000000 0.000000vn 1.000000 0.000000 0.000000vn -1.000000 0.000000 0.000000vn -1.000000 0.000000 0.000000vn -1.000000 0.000000 0.000000vn -1.000000 0.000000 0.000000s 1g pCube1usemtl file1SGf 1/1/1 2/2/2 3/3/3f 3/3/3 2/2/2 4/4/4s 2f 3/13/5 4/14/6 5/15/7f 5/15/7 4/14/6 6/16/8s 3f 5/21/9 6/22/10 7/23/11f 7/23/11 6/22/10 8/24/12s 4f 7/17/13 8/18/14 1/19/15f 1/19/15 8/18/14 2/20/16s 5f 2/5/17 8/6/18 4/7/19f 4/7/19 8/6/18 6/8/20s 6f 7/9/21 1/10/22 5/11/23f 5/11/23 1/10/22 3/12/24上面这个obj文件描述了一个立方体。
obj文件标准(一)OBJ文件标准介绍•OBJ文件是一种常见的3D模型文件格式。
•它由一系列以文本形式描述的顶点、纹理坐标、法线和面组成。
•OBJ文件以.obj扩展名保存,并可由各种3D建模软件创建和读取。
文件结构•OBJ文件由一系列以不同标签开头的行组成,如v、vt、vn和f。
•v表示顶点坐标,vt表示纹理坐标,vn表示法线,f表示面。
•每个标签后面跟着对应的数值,以空格分隔。
顶点•v标签后面是三个浮点数,表示一个顶点的空间坐标。
•例如:v 表示一个位于原点上方的顶点。
纹理坐标•vt标签后面是两个浮点数,表示一个顶点的纹理坐标。
•纹理坐标是用于贴图的,确定在模型表面上如何映射纹理图像。
•例如:vt 表示纹理坐标的中心点。
法线•vn标签后面是三个浮点数,表示一个顶点的法线。
•法线是垂直于面的向量,用于计算光照和阴影效果。
•例如:vn 表示一个指向上方的法线。
面•f标签后面是一系列整数,表示一个面的顶点索引。
•面是由三个或四个顶点组成的多边形。
•例如:f 1/1/1 2/2/2 3/3/3 表示一个由三个顶点组成的面。
材质•OBJ文件还可以包含关于材质的信息。
•材质可以定义模型的颜色、光照和纹理等特性。
•材质信息通常保存在一个.mtl文件中,OBJ文件中使用mtllib 标签指定其路径。
总结•OBJ文件是一种流行的3D模型文件格式。
•它以文本形式保存模型的顶点、纹理坐标、法线和面等信息。
•了解OBJ文件标准将有助于开发者创建、读取和处理3D模型。
以上是关于OBJ文件标准的简要介绍,希望能对您有所帮助!。
这篇教程本来是要放致到"妙(mel)语初解"第三章里讲的,因为有人问到相关的问题,所以提前讲一下。
我们经常见到的*.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文件是一种文本文件格式,这就意味着你可以直接用写字板打开进行查看修改,如果你能看懂每一行的内容是什么意思,相信距离你成功的解决问题已经不远了。
obj文件标准
OBJ(Wavefront OBJ)是一种常见的三维模型文件格式,它
是由Wavefront Technologies公司创建的。
OBJ文件使用纯文
本格式,可以通过文本编辑器打开和编辑。
OBJ文件标准定义了一系列规则和语法,用于描述三维模型的几何形状和相关属性。
其基本结构包括以下几个关键元素:
1. 顶点(Vertex):描述三维空间中的一个点,包括其坐标信
息(x、y、z)。
2. 顶点属性(Vertex Attribute):描述顶点的其他属性,例如
颜色(RGB值)、法线(用于光照计算)、纹理坐标等。
3. 面(Face):使用顶点索引定义模型的面,可以是三角形(三个顶点索引)、四边形(四个顶点索引)或更多边形。
4. 材质(Material):定义模型的外观属性,包括颜色、纹理、透明度等。
5. 纹理映射(Texture Mapping):通过纹理坐标将二维图像映射到模型的表面,以增加模型的真实感。
6. 光照(Lighting):定义模型在不同光照条件下的表现形式,包括使用法线计算的漫反射、镜面反射等。
OBJ文件还支持一些扩展功能,例如模型的组织结构、动画、
变形等。
总体来说,OBJ文件是一个通用的三维模型文件格式,易于阅读和编辑,因此被广泛应用于各种三维建模和动画软件中。
三维模型obj⽂件的格式解析与读取请先看这两个中⽂博客中对于obj的介绍:更为详细的英⽂资料(⽤google或者aol搜索 "obj format"即可得到):最详细的资料 obj spec:看完以上随便⼀个内容,obj的格式可以说了解了。
下⾯实现对obj⽂件的读取。
.obj⽂件中,每⼀⾏都有表明该⾏意义的标志符。
对obj的读取中,处理以下标志符"v"--点的坐标,三维模型为x, y, z的顺序;程序中以1 typedef struct ObjVector32 {3 ObjFloat x;4 ObjFloat y;5 ObjFloat z;6 } ObjVector3;结构存储。
"vt"--纹理坐标,程序中以1 typedef struct ObjVector22 {3 ObjFloat x;4 ObjFloat y;5 } ObjVector2;结构存储"vn"--法向量坐标,程序中与“v”的存储结构相同"f"--⾯所⽤到的点坐标/纹理坐标/法向量坐标的索引,"mtllib"--.obj⽂件⽤到的material库⽂件,“usemtl”标志符⽤到的material都是从material库⽂件中取出的"g"--组group的名称,group⾥⾯的"f"可以使⽤0-N个"usemtl"对⾯的显⽰渲染进⾏控制,当使⽤了⼤于1个“usemtl”标志符,程序处理时对于已经读取的"f"很难控制;同时查看obj读取的源码,有的⽤到了这个标志符,有的没有使⽤该标志,有的使⽤了"usemtl"标志符对所读取的"f"⾯进⾏分割,本⽂的处理是使⽤"usemtl"标志符将"f"⾯分割为mesh,但是考虑到不同的group可以使⽤相同的"usemtl”标志(即不同的group都使⽤了 usemtl AAA),因此将"g"与"usemtl"结合起来,⼆者的名称作为mesh的名称"usemtl"--参见"mtllib","g"。
obj文件格式与.mtl文件格式最近在学习obj文件格式,上网查了些资料,很难找到比较全面的文章,尤其是对.mtl文件的说明甚少。
今天把最近搜索的资料整合了一下。
这里的obj文件格式指的是Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种文件格式。
OBJ文件是一种标准的3D模型文件格式,很适合用于3D软件模型之间的互导。
OBJ文件是一种文本文件格式,这就意味着你可以直接用写字板打开进行查看修改。
目前几乎所有知名的3D 软件都支持OBJ文件的读写,不过很多软件需要通过插件才能做到这一点。
另外,作为一种优秀的文件格式,很多游戏引擎也都支持OBJ文件。
OBJ3.0格式支持多边形(最近在学习obj文件格式,上网查了些资料,很难找到比较全面的文章,尤其是对.mtl文件的说明甚少。
今天把最近搜索的资料整合了一下。
这里的obj文件格式指的是Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种文件格式。
OBJ文件是一种标准的3D模型文件格式,很适合用于3D软件模型之间的互导。
OBJ文件是一种文本文件格式,这就意味着你可以直接用写字板打开进行查看修改。
目前几乎所有知名的3D 软件都支持OBJ文件的读写,不过很多软件需要通过插件才能做到这一点。
另外,作为一种优秀的文件格式,很多游戏引擎也都支持OBJ文件。
OBJ3.0格式支持多边形(Polygon),直线(Lines),表面(Surfaces),和自由形态曲线(Free-form Curves)。
直线和多角形通过它们的点来描述,曲线和表面则根据于它们的控制点和依附于曲线类型的额外信息来定义。
这些信息支持规则和不规则的曲线,包括那些基于贝塞尔(Bezier)曲线,B样条(B-spline),基数(Cardinal/Catmull-Rom样条),和泰勒方程(Taylor equations)的曲线。
obj⽂件格式OBJ⽂件是⼀种3D模型⽂件,是Wavefront开发的⼀种⽂件格式,适合⽤于3D软件模型之间的互导OBJ⽂件是⼀种⽂本⽂件,有与此相关⼆进制⽂件格式(*.MOD)OBJ格式⽀持点,线,纹理顶点,⾯和⾃由形状的⼏何图形(曲线和曲⾯)等多边形⼏何图形OBJ本⾝不包含动画、材质特性、贴图路径、动⼒学、粒⼦等信息⽂件内容: ⽆⽂件头 每⾏由前边的关键字说明数据类型常⽤关键字(1)顶点数据(Vertex data)v ⼏何体顶点(Geometric vertices) 格式:v x y zvt 贴图坐标点(Texture vertices) 格式: vt u vvn 顶点法线(Vertex normals) 格式:vn dx dy dz(2)元素(Elements)p 点(Point) 格式:p v1l 线(Line) 格式:l v1 v2 ... vnf ⾯(Face) 格式:normal f v1 v2 ... vn with texture coords f v1/t1 v2/t2 .... vn/tn with vertex normals f v1//n1 v2//n2 .... vn//nn with txt and norms f v1/t1/n1 v2/t2/n2 .... vn/tn/nn(3)显⽰/渲染属性(Display/render attributes)usemtl 材质名称(Material name) 格式:usemtl materialnamemtllib 材质库(Material library) 格式:mtllib materiallibname.mtleg:verify.obj# Verification OBJ created with gulpmtllib verify.mtl# Cube no materials. Translated x:-150o cube 1v -1606010v -1604010v -1404010v -1406010v -16060 -10v -16040 -10v -14040 -10v -14060 -10f 1234f 8765f 4378f 5148f 5621f 2673# Cube with two materials. Translated x:-100o cube 2v -1106010v -1104010v -904010v -906010v -11060 -10v -11040 -10v -9040 -10v -9060 -10usemtl orangef 9101112f 16151413f 12111516usemtl purplef 1391216f 1314109f 10141511verify.mtlnewmtl orangeKa 1.0000000.6470590.000000Kd 1.0000000.6470590.000000Ks 0.0000000.0000000.000000illum 1Ns 0.000000newmtl purpleKa 0.8258060.0000000.825806Kd 0.8258060.0000000.825806Ks 0.0000000.0000000.000000illum 1Ns 0.000000说明: 材质库信息储存在⼀个后缀是".mtl"的独⽴⽂件中 mtl⽂件是obj⽂件附属的材质库⽂件 包含漫射(diffuse),环境(ambient),光泽(specular)的RGB的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征mtl中关键字含义newmtl: 定义新的材质组Ka: 材质的环境光(ambient color)Kd: 散射光(diffuse color)Ks: 镜⾯光(specular color)Ke: 放射光(emissive color)Ns: 材质的光亮度d,Tr 均可⽤于定义材质的Alpha透明度sharpness:材质的锐度(sharpness)illum:照明度(illumination)后⾯可接0~10范围内的数字参数。
在解释以f为前缀的行的格式之前,我们不得不提一个新的概念,这就是顶点索引(Vertex Indices)。
我们知道,对于每一个三角形,都需要用3个顶点来表示。
例如在上面的立方体模型中,一共有6×2×3=36个顶点。
仔细想想就会知道,在这36个顶点中,又相当数量的顶点是重合的。
如果把这些重合的顶点都一一表示出来,就太浪费存储空间了。
于是,我们提出了顶点索引的想法,解决空间占用问题。
顶点索引的思想是建立两个数组,一个数组用于存储模型中所有的顶点坐标值,另一个数组则存储每一个表面所对应的三个顶点在第一个数组中的索引。
建立这样的顶点索引显然更加节约存储空间。
假设Indices:array of Integer是顶点索引数组,Vertices:array of TVertex是顶点数组,使用下面的代码段就可以把整个顶点索引对应的所有三角形绘制出来:procedure DrawIndex(Indices:array of Integer;Vertices:array of TVertex);var i :Integer;beginglBegin(GL_TRIANGLES);for i := 0 to (High(Vertices)+1) div 3 -1 dobeginglVertex3fv(@Vertices[Indices[i*3]]);glVertex3fv(@Vertices[Indices[i*3+1]]);glVertex3fv(@Vertices[Indices[i*3+2]]);end;glEnd;end;以此类推,我们可以为模型中所有的法线、纹理坐标都建立起相应的索引,以节省更多的空间。
而事实上,OBJ文件就是这么做的。
现在,我们再来看一下OBJ文件的结构。
在一个OBJ文件中,首先有一些以v、vt 或vn前缀开头的行指定了所有的顶点、纹理坐标、法线的坐标。
然后再由一些以f开头的行指定每一个三角形所对应的顶点、纹理坐标和法线的索引。
三维模型常见的格式1. 介绍三维模型是计算机图形学中的重要概念,它是对物体或场景的几何、外观和材质的数学表达。
为了在计算机上进行渲染、动画和交互操作,三维模型需要以特定的格式存储和表示。
本文将介绍三维模型常见的格式,包括OBJ、STL、FBX、Collada 和GLTF等。
2. OBJ格式2.1 定义OBJ格式是一种简单的文本格式,用于描述三维几何模型的顶点、纹理坐标和法线等信息。
它是一种广泛应用于三维建模软件和游戏引擎的开放格式。
2.2 特点•OBJ格式易于理解和编写,可直接用文本编辑器进行编辑。
•OBJ文件通常包含一个或多个对象,每个对象由一系列顶点、纹理坐标和法线组成。
•OBJ格式支持多边形和曲面,如三角形、四边形和N边形。
•OBJ文件还可以包含材质和纹理信息。
2.3 示例以下是一个简单的OBJ文件示例:# OBJ文件示例# 物体名称o Cube# 顶点坐标v -1.0 -1.0 1.0v -1.0 1.0 1.0v 1.0 1.0 1.0v 1.0 -1.0 1.0# 纹理坐标vt 0.0 0.0vt 0.0 1.0vt 1.0 1.0vt 1.0 0.0vn 0.0 0.0 1.0# 面f 1/1/1 2/2/1 3/3/1f 1/1/1 3/3/1 4/4/13. STL格式3.1 定义STL格式是一种二进制或文本格式,用于表示三维模型的表面几何信息。
它是最常用的三维打印格式之一,也被广泛应用于CAD软件和计算机辅助工程领域。
3.2 特点•STL格式仅表示物体的表面几何,不包含颜色、纹理等信息。
•STL文件由三角形面片组成,每个面片由三个顶点和法线构成。
•STL格式支持ASCII文本和二进制两种存储方式。
3.3 示例以下是一个简单的STL文件示例:solid Cubefacet normal 0.0 0.0 1.0outer loopvertex -1.0 -1.0 1.0vertex -1.0 1.0 1.0vertex 1.0 1.0 1.0endloopendfacetfacet normal 0.0 0.0 1.0outer loopvertex -1.0 -1.0 1.0vertex 1.0 1.0 1.0vertex 1.0 -1.0 1.0endloopendfacetendsolid Cube4. FBX格式4.1 定义FBX格式是由Autodesk开发的一种用于交换三维模型和动画数据的文件格式。
管立得obj格式全文共四篇示例,供读者参考第一篇示例:管立得(OBJ)是一种常用的3D模型文件格式,用于存储三维模型的几何形状、材质信息和其他相关数据。
OBJ格式是一种开放的文本格式,因此易于阅读和编辑。
它可以被许多不同的三维建模软件和渲染引擎支持,是许多专业和业余设计师首选的文件格式之一。
在OBJ文件中,三维模型的几何形状被表示为一系列的顶点(vertex),每个顶点由其xyz坐标值表示。
通过连接这些顶点,可以形成各种形状,如三角形、四边形等。
除顶点外,OBJ文件还包含了法线(normal)信息,用来定义几何体的表面方向和光线反射等性质。
此外,OBJ文件还可以包括材质(material)、纹理坐标(texture coordinates)等信息,以增强模型的表现力和真实感。
OBJ文件的结构相对简单,易于理解和编辑。
它由多个部分组成,每个部分以关键字开头,后跟相应的数据。
例如,“v” 表示顶点坐标,“vn” 表示法线信息,“f” 表示面信息等。
通过编辑OBJ文件,用户可以轻松地修改模型的结构、材质和纹理等属性,从而实现个性化定制和优化。
除了存储几何形状和材质信息外,OBJ文件还支持保存其它相关数据,如对象名称、组信息、注释等。
这些元数据可以帮助用户更好地管理和组织三维模型,提高工作效率和合作性。
同时,OBJ格式还允许多个对象或多个组合一起存储在一个文件中,以便于复杂场景的管理和渲染。
在实际应用中,OBJ格式被广泛用于三维建模、渲染和动画制作等领域。
许多专业的三维设计软件如Maya、3ds Max、Blender等都支持导入和导出OBJ文件,使得不同软件之间的数据交换变得更加方便。
此外,许多在线资源库和模型市场也提供了大量的OBJ格式模型供用户下载和使用,为创作和学习提供了便利。
总的来说,OBJ格式作为一种通用的3D模型文件格式,具有简单、开放、易用的特点,受到了广泛的认可和应用。
通过OBJ格式,用户可以轻松地创建、存储和共享三维模型,实现各种设计和渲染任务。
obj格式表面积
OBJ格式是一种常见的3D模型文件格式,用于存储3D对象的几何数据、材质属性和纹理等信息。
要计算OBJ格式模型的表面积,通常需要使用3D建模软件或库。
使用3D建模软件如Blender、Maya等,可以打开OBJ文件并获取模型的几何数据。
然后,通过计算所有顶点和面的面积,可以获得模型的表面积。
具体步骤如下:
打开3D建模软件并导入OBJ文件。
选择模型,并确保只选中模型的外部表面,排除内部孔洞和重叠的面。
使用软件提供的工具测量或计算每个面的面积,并累加得到模型的总表面积。
另外,也可以使用一些开源的3D库如Assimp、Open3D等来读取和计算OBJ文件的表面积。
这些库提供了更底层的接口和函数,可以方便地获取模型的顶点和面信息,并进行相应的计算。
需要注意的是,计算3D模型的表面积是一个相对复杂的过程,特别是对于具有复杂形状和拓扑结构的模型。
因此,对于较复杂的模型,可能需要使用专业的3D建模软件或编程技术来实现准确的表面积计算。
3D中的OBJ文件格式详解常见到的*.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文件格式的一般标准:1. 文件结构:OBJ文件由若干行组成,每行以一个关键字开头,关键字用于标识行的内容和用途。
常见的关键字有:- "v":定义顶点坐标。
- "vt":定义纹理坐标。
- "vn":定义法线向量。
- "f":定义多边形面的顶点索引。
- "mtllib":指定材质库文件的路径。
- "usemtl":指定当前面使用的材质。
2. 顶点定义:使用关键字"v" 后面跟随三个浮点数,表示一个顶点的空间坐标。
3. 纹理坐标定义:使用关键字"vt" 后面跟随两个浮点数,表示纹理坐标的u、v分量。
4. 法线定义:使用关键字"vn" 后面跟随三个浮点数,表示顶点的法线向量。
5. 面定义:使用关键字"f" 后面跟随一系列顶点索引,定义多边形面的连接关系。
顶点索引可以是顶点、纹理坐标和法线的组合,如"f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3"。
6. 材质库定义:使用关键字"mtllib" 后面跟随材质库文件的路径,指定了包含材质信息的外部文件。
7. 材质定义:使用关键字"usemtl" 后面跟随材质名称,指定当前面使用的材质。
OBJ文件还支持注释行(以井号"#"开头)和对象组(以关键字"o" 开头),用于更多的信息描述和组织模型数据。
需要注意的是,虽然OBJ是一种通用的三维模型格式,但它并不支持动画、骨骼、灯光和其他高级特性。
为了满足这些需求,通常需要采用其他格式或结合其他文件格式一起使用。
Obj格式解析以及在Unity3D下导⼊测试⽬前基本实现了导⼊,注意只能打开含有单个模型的obj⽂件四边⾯模型:全三⾓⾯模型(测试单⼀材质,⾃动分了下UV):这⾥介绍下obj格式:obj格式是waveFront推出的⼀种3D模型格式,可以存放静态模型以及⼀些诸如曲线的附加信息。
其格式以⽂本形式存放,所以解析起来⽐较⽅便,它的⼤体格式如下:# WaveFront *.obj file (generated by CINEMA 4D)mtllib ./test.mtlv -100.00000000000000 -100.00000000000000 -100.00000000000000v -100.00000000000000100.00000000000000 -100.00000000000000v 100.00000000000000 -100.00000000000000 -100.00000000000000v 100.00000000000000100.00000000000000 -100.00000000000000v 100.00000000000000 -100.00000000000000100.00000000000000v 100.00000000000000100.00000000000000100.00000000000000v -100.00000000000000 -100.00000000000000100.00000000000000v -100.00000000000000100.00000000000000100.00000000000000# 8 verticesvn 0.000000000000000.00000000000000 -1.00000000000000vn 1.000000000000000.000000000000000.00000000000000vn 0.000000000000000.000000000000001.00000000000000vn -1.000000000000000.000000000000000.00000000000000vn 0.000000000000001.000000000000000.00000000000000vn 0.00000000000000 -1.000000000000000.00000000000000# 6 normalsvt 0.00000000000000 -1.000000000000000.00000000000000vt 0.00000000000000 -0.000000000000000.00000000000000vt 1.00000000000000 -0.000000000000000.00000000000000vt 1.00000000000000 -1.000000000000000.00000000000000# 4 texture coordinateso Cubeusemtl defaultf 1/4/12/3/14/2/13/1/1f 3/4/24/3/26/2/25/1/2f 5/4/36/3/38/2/37/1/3f 7/4/48/3/42/2/41/1/4f 2/4/58/3/56/2/54/1/5f 7/4/61/3/63/2/65/1/6Cube(Obj)常⽤类型:#开头表⽰注释v表⽰顶点vn表⽰法线,可以共⽤法线vt表⽰uv坐标f表⽰⼀个⾯,⽐如参数1/4/1,表⽰顶点索引/UV索引/法线索引下⾯贴⼀下⼯具类的代码:using System;using System.Linq;using System.Collections;using System.Collections.Generic;namespace Hont{public class ObjFormatAnalyzer{public struct Vector{public float X;public float Y;public float Z;}public struct FacePoint{public int VertexIndex;public int TextureIndex;public int NormalIndex;}public struct Face{public FacePoint[] Points;public bool IsQuad;}public Vector[] VertexArr;public Vector[] VertexNormalArr;public Vector[] VertexTextureArr;public Face[] FaceArr;public void Analyze(string content){content = content.Replace('\r', '').Replace('\t', '');var lines = content.Split('\n');var vertexList = new List<Vector>();var vertexNormalList = new List<Vector>();var vertexTextureList = new List<Vector>();var faceList = new List<Face>();for (int i = 0; i < lines.Length; i++){var currentLine = lines[i];if (currentLine.Contains("#") || currentLine.Length == 0){continue;}if (currentLine.Contains("v ")){var splitInfo = currentLine.Split("".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);vertexList.Add(new Vector() { X = float.Parse(splitInfo[1]), Y = float.Parse(splitInfo[2]), Z = float.Parse(splitInfo[3]) });}else if (currentLine.Contains("vt ")){var splitInfo = currentLine.Split("".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);vertexTextureList.Add(new Vector() { X = splitInfo.Length > 1 ? float.Parse(splitInfo[1]) : 0, Y = splitInfo.Length > 2 ? float.Parse(splitInfo[2]) : 0, Z = splitInfo.Length > 3 ? float.Parse(splitInfo[ }else if (currentLine.Contains("vn ")){var splitInfo = currentLine.Split("".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);vertexNormalList.Add(new Vector() { X = float.Parse(splitInfo[1]), Y = float.Parse(splitInfo[2]), Z = float.Parse(splitInfo[3]) });}else if (currentLine.Contains("f ")){Func<string, int> tryParse = (inArg) =>{var outValue = -1;return int.TryParse(inArg, out outValue) ? outValue : 0;};var splitInfo = currentLine.Split("".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);var isQuad = splitInfo.Length > 4;var face1 = splitInfo[1].Split('/');var face2 = splitInfo[2].Split('/');var face3 = splitInfo[3].Split('/');var face4 = isQuad ? splitInfo[4].Split('/') : null;var face = new Face();face.Points = new FacePoint[4];face.Points[0] = new FacePoint() { VertexIndex = tryParse(face1[0]), TextureIndex = tryParse(face1[1]), NormalIndex = tryParse(face1[2]) };face.Points[1] = new FacePoint() { VertexIndex = tryParse(face2[0]), TextureIndex = tryParse(face2[1]), NormalIndex = tryParse(face2[2]) };face.Points[2] = new FacePoint() { VertexIndex = tryParse(face3[0]), TextureIndex = tryParse(face3[1]), NormalIndex = tryParse(face3[2]) };face.Points[3] = isQuad ? new FacePoint() { VertexIndex = tryParse(face4[0]), TextureIndex = tryParse(face4[1]), NormalIndex = tryParse(face4[2]) } : default(FacePoint);face.IsQuad = isQuad;faceList.Add(face);}}VertexArr = vertexList.ToArray();VertexNormalArr = vertexNormalList.ToArray();VertexTextureArr = vertexTextureList.ToArray();FaceArr = faceList.ToArray();}}}ObjFormatAnalyzer⼯⼚类,⽬前只有输出GameObject:using UnityEngine;using System.IO;using System.Linq;using System.Collections;using System.Collections.Generic;namespace Hont{public static class ObjFormatAnalyzerFactory{public static GameObject AnalyzeToGameObject(string objFilePath){if (!File.Exists(objFilePath)) return null;var objFormatAnalyzer = new ObjFormatAnalyzer();objFormatAnalyzer.Analyze(File.ReadAllText(objFilePath));var go = new GameObject();var meshRenderer = go.AddComponent<MeshRenderer>();var meshFilter = go.AddComponent<MeshFilter>();var mesh = new Mesh();var sourceVertexArr = objFormatAnalyzer.VertexArr;var sourceUVArr = objFormatAnalyzer.VertexTextureArr;var faceArr = objFormatAnalyzer.FaceArr;var notQuadFaceArr = objFormatAnalyzer.FaceArr.Where(m => !m.IsQuad).ToArray();var quadFaceArr = objFormatAnalyzer.FaceArr.Where(m => m.IsQuad).ToArray();var vertexList = new List<Vector3>();var uvList = new List<Vector2>();var triangles = new int[notQuadFaceArr.Length * 3 + quadFaceArr.Length * 6];for (int i = 0, j = 0; i < faceArr.Length; i++){var currentFace = faceArr[i];triangles[j] = j;triangles[j + 1] = j + 1;triangles[j + 2] = j + 2;var vec = sourceVertexArr[currentFace.Points[0].VertexIndex - 1];vertexList.Add(new Vector3(vec.X, vec.Y, vec.Z));var uv = sourceUVArr[currentFace.Points[0].TextureIndex - 1];uvList.Add(new Vector2(uv.X, uv.Y));vec = sourceVertexArr[currentFace.Points[1].VertexIndex - 1];vertexList.Add(new Vector3(vec.X, vec.Y, vec.Z));uv = sourceUVArr[currentFace.Points[1].TextureIndex - 1];uvList.Add(new Vector2(uv.X, uv.Y));vec = sourceVertexArr[currentFace.Points[2].VertexIndex - 1];vertexList.Add(new Vector3(vec.X, vec.Y, vec.Z));uv = sourceUVArr[currentFace.Points[2].TextureIndex - 1];uvList.Add(new Vector2(uv.X, uv.Y));if (currentFace.IsQuad){triangles[j + 3] = j + 3;triangles[j + 4] = j + 4;triangles[j + 5] = j + 5;j += 3;vec = sourceVertexArr[currentFace.Points[0].VertexIndex - 1];vertexList.Add(new Vector3(vec.X, vec.Y, vec.Z));uv = sourceUVArr[currentFace.Points[0].TextureIndex - 1];uvList.Add(new Vector2(uv.X, uv.Y));vec = sourceVertexArr[currentFace.Points[2].VertexIndex - 1];vertexList.Add(new Vector3(vec.X, vec.Y, vec.Z));uv = sourceUVArr[currentFace.Points[2].TextureIndex - 1];uvList.Add(new Vector2(uv.X, uv.Y));vec = sourceVertexArr[currentFace.Points[3].VertexIndex - 1];vertexList.Add(new Vector3(vec.X, vec.Y, vec.Z));uv = sourceUVArr[currentFace.Points[3].TextureIndex - 1];uvList.Add(new Vector2(uv.X, uv.Y));}j += 3;}mesh.vertices = vertexList.ToArray();mesh.uv = uvList.ToArray();mesh.triangles = triangles;meshFilter.mesh = mesh;meshRenderer.material = new Material(Shader.Find("Standard"));return go;}}}ObjFormatAnalyzerFactory测试使⽤脚本:public class ObjFormatAnalyzerTest : MonoBehaviour{void Start(){var go = ObjFormatAnalyzerFactory.AnalyzeToGameObject(@"D:\TestObj\centaur.obj"); WWW www = new WWW("file:/D:/TestObj/texture.jpg");while (!www.isDone) { }go.GetComponent<MeshRenderer>().material.mainTexture = www.texture;}}然后挂载运⾏即可。
.obj数据使用方法
.obj文件是一种面向顶点的文件格式,通常用于存储三维模型的几何结构和材质信息。
您可以按照以下步骤使用.obj数据:
1. 打开.obj文件:使用可读取.obj文件的软件(例如3D建模软件、游戏引擎等)打开.obj文件。
2. 查看模型结构:在软件中加载.obj文件后,您可以查看模型的顶点、面片、法线、纹理坐标等信息。
通常软件会将模型以图形的形式显示出来,您可以通过旋转、缩放、平移等操作查看模型的不同部分。
3. 编辑模型:根据您的需求,您可以对模型进行编辑。
您可以添加、删除、修改顶点、面片,调整模型的材质、纹理等。
4. 导出模型:在您完成对模型的编辑之后,您可以将模型导出为其他格式,如.obj、.fbx、.stl等。
导出模型时,请注意选择适合您使用的文件格式,并根据需要设置相关选项。
5. 使用模型:导出模型后,您可以将其用于各种应用,如游戏开发、建筑规划、虚拟现实等领域。
根据应用的需求,您可能需要将模型导入到相应的软件中,并进行进一步的操作和调整。
注意:.obj文件只包含模型的几何结构和材质信息,不包含动画、物理以及其他附加信息。
如果您需要处理这些附加信息,您可能需要使用其他文件格式或使用相关的工具和技术。
3D中的OBJ文件格式详解常见到的*.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样条),和泰勒方程(Taylorequations)的曲线。
1、OBJ文件-- 特点(1)OBJ是一种3D模型文件,因此不包含动画、材质特性、贴图路径、动力学、粒子等信息。
(2)OBJ文件主要支持多边形(Polygons)模型。
虽然OBJ文件也支持曲线(Curves)、表面(Surfaces)、点组材质(Point GroupMaterials),但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):evel 导角插值(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 0v 2.68 1.17 0v 2.84 -2.03 0v -1.92 -2.89 0f 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 0v 2.84 -2.03 0v -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 defaultv -0.500000 -0.500000 0.500000v 0.500000 -0.500000 0.500000v -0.500000 0.500000 0.500000v 0.500000 0.500000 0.500000v -0.500000 0.500000 -0.500000v 0.500000 0.500000 -0.500000v -0.500000 -0.500000 -0.500000 v 0.500000 -0.500000 -0.500000 vt 0.000000 0.000000vt 1.000000 0.000000vt 0.000000 1.000000vt 1.000000 1.000000vt 0.000000 2.000000vt 1.000000 2.000000vt 0.000000 3.000000vt 1.000000 3.000000vt 0.000000 4.000000vt 1.000000 4.000000vt 2.000000 0.000000vt 2.000000 1.000000vt -1.000000 0.000000vt -1.000000 1.000000vn 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 offg pCube1usemtl initialShadingGroupf 1/1/1 2/2/2 4/4/3 3/3/4f 3/3/5 4/4/6 6/6/7 5/5/8f 5/5/9 6/6/10 8/8/11 7/7/12f 7/7/13 8/8/14 2/10/15 1/9/16f 2/2/17 8/11/18 6/12/19 4/4/20f 7/13/21 1/1/22 3/3/23 5/14/24这个文件看起来稍复杂一些,用到了许多关键词,你可以对照前面的列表查看一下每个关键词的意思。