2018-05-18

   这三种3D格式文件时我们在做CAD或者游戏开发中基本上都会遇到的。所以,如果想要把这些文件转化成自己的程序中想要操作的对象,一般都需要对这些文件进行解析。这些格式时公开的,如STL、PLY、OBJ,STP等,我们可以免费使用。也有很多开源的lib来解析这些类型的文件。但是也有一些类似的3D格式文件,如CATIA,CGR等则是商业收费的。

STL

STL格式是由3D Systems公司提出的,初始版本1987年提出,原本用于立体光刻电脑辅助设计软件。STL文件仅描述三维物体的表面几何形状,没有颜色、材质贴图或其它常见三维模型的属性。STL文件有两种表示方式:文本、二进制。一般会以二进制格式使用,我们也可以使用一些简单的转换工具进行两种格式的互相转换。文本格式相较于二进制格式,一般体积会大四五倍,这也是我们为什么喜欢在各种CAD程序中使用二进制文件的原因了。
STL也是目前3D打印最常使用的格式。
STL格式不包含参数化的信息,也就是说,它没有类似函数表达式这样子的描述信息,表示不了曲线、曲面,STL 格式不带颜色、贴图信息。

OBJ

OBJ格式时Wavefront公司开发的一种标准3D模型文件格式,很适合用于3D软件模型之间的导入导出。大部分知名的3D软件都支持OBJ文件的读写,其中某些需要通过插件。OBJ文件是一种文本文件,可以直接用文本编辑器打开进行查看和编辑修改。也有二进制格式,不过是非公开的。
obj格式的文件可能包含了顶点数据(Vertex),曲面/表面属性(Spline,Surface),绘制索引序列(Polygon,mesh),组和渲染属性信息(材质,法线)。相较于其他两种格式,OBJ支持四边形网格。
OBJ文件不需要任何种文件头标识,一般而言会有一些注释行。每一行的数据的意义,都通过每一行开始的字符串表明,类似于编程语言的类型生命。

顶点相关的:
v 几何体顶点(Geometric vertices)
vt 贴图坐标点(Texture vertices)
vn 顶点法线(Vertex normals)
vp 参数空格顶点 (Parameter space vertices)

曲线、曲面:
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伴随的有mtl文件时描述材质信息的。不过,做几何相关的功能时,一般也很少管这些材质信息。OBJ的处理难度还是比较大的。更详细信息请参考 wki

PLY
1994年提出。该格式主要用以储存立体扫描结果的三维数值,透过多边形片面的集合描述三维物体,与其他格式相较之下这是较为简单的方法。它可以储存的资讯包含颜色、透明度、表面法向量、材质座标与资料可信度,并能对多边形的正反两面设定不同的属性。在档案内容的储存上PLY有两种版本,分别是纯文字(ASCII)版本与二元码(binary)版本,其差异在储存时是否以ASCII编码表示元素资讯。
没有找到独立的文本、二进制转换工具,发现经常使用的meshlab可以做到。不过,编程过程中,我们也只是偶尔的使用这些工具,来验证我们自己的算法。
PLY格式同样没有表示曲线、曲面的能力。同STL格式,它们只能以离散的顶点为基础信息,附加顶点之间的关联关系,相邻顶点组成的面的信息,来表述物体。相比OBJ,STP这样带曲线、曲面的格式,它俩简单多了,只要稍微学一下“计算几何”这本书即可。要想处理好曲线曲面,还需要专门学好一本关于“曲线与曲面的数学”的书,这样子的书难度可是大了不少。
PLY是受 Wavefront .obj 格式启发而设计出来的。

   以上是格式简介。我们把这些格式文件进行解析导入,是想要用到它的几何信息。而且,我们也需要使用表示几何的数据结构来存储他们。这种数据结构,我们一般称之为“半边结构”(half-edget data structure),它可以是通常意义的三角形网格,也可以是四边形网格,或者任意格式的自定义网格。处理STL、PLY格式,也就是把他们转换为这个半边结构而已。要自己手写一个半边结构数据类型,满足存储、使用与运行效率兼顾的需求,还是有一定难度的。也有一定lib可供使用,如OpenMesh,yig/halfedge,halfedgelib等。但是yig/halfedge只支持三角形网格,halfedgelib太老了,08年到现在一直未更新,OpenMesh是一个不错的选择。而且,我们可以extend它所提供的基础数据类型来实现自己所需的功能。如果静态链接,则需要给项目加上OM_STATIC_BUILD macro。OpenMesh 能够支持STL(ASCII,Binary),OBJ,PLY(ASCII,Binary)。只是,我测试的过程中,发现一些文本类型的PLY文件无法转换为半边结构,应该是文件本身的格式不是那么良好,或者说OBJ格式本身不是非常严格,导致一些。

   如果只是用来渲染,则只需要OSG插件导入为osg::Node这样的专门用来显示的简单的数据结构即可。但是,要注意,OSG 的插件机制决定了,他无法并行的导入文件。所以,若有需求处理大量的3D格式文件,还是需要寻找其他的lib。

  1. 3D file format 常见3D文件格式
  2. https://en.wikipedia.org/wiki/ISO_10303 CAD中3D对象 数据交换标准
  3. https://zh.wikipedia.org/wiki/PLY
  4. https://en.wikipedia.org/wiki/STL_(file_format)
  5. https://en.wikipedia.org/wiki/ISO_10303-21 STEP-File
  6. https://en.wikipedia.org/wiki/3DXML
  7. https://en.wikipedia.org/wiki/PLOT3D_file_format
  8. http://www.openscenegraph.org/index.php/documentation/user-guides/61-osgplugins
  9. https://en.wikipedia.org/wiki/Wavefront_.obj_file

如果有任何意见,欢迎留言讨论。 


[ 主页 ]

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐