STL、PLY、OBJ格式分析

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

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


[ 主页 ]

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. Ply格式的mesh Ply格式是一种通用的3D模型文件格式,可以存储点云、网格和曲面等各种类型的3D数据。Ply文件通常包含顶点信息、面信息、法线信息、纹理坐标信息和颜色信息等。Ply文件可以通过Ply解析器来加载和处理。 2. STL格式的mesh STL格式是一种简单的3D模型文件格式,通常用于存储三角形网格数据。STL文件包含了每个三角形的三个顶点坐标和法线向量信息。STL文件可以通过STL解析器来加载和处理。 3. OBJ格式的mesh OBJ格式是一种通用的3D模型文件格式,它可以存储多边形网格、曲面和点云等各种类型的3D数据。OBJ文件通常包含顶点信息、面信息、纹理坐标信息和法线信息等。OBJ文件可以通过OBJ解析器来加载和处理。 4. OFF格式的mesh OFF格式是一种简单的3D模型文件格式,通常用于存储多边形网格数据。OFF文件包含了每个顶点的坐标信息和每个面的顶点索引信息。OFF文件可以通过OFF解析器来加载和处理。 5. glTF格式的mesh glTF格式是一种新兴的3D模型文件格式,它使用JSON作为数据格式,可以存储多种类型的3D数据,例如网格、材质、动画和场景等。glTF文件可以通过glTF解析器来加载和处理。 6. glb格式的mesh glb格式是一种二进制的glTF格式,它将glTF文件打包成一个二进制文件,可以更快地加载和渲染3D模型。glb文件可以通过glTF解析器来加载和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值