欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

3D模型文件--STL,OBJ,3DS

程序员文章站 2022-03-26 17:22:32
...

原文地址:http://blog.csdn.net/chs007chs/article/details/29171721


STL格式

全称是Stereolithographic,是3DSystem公司提出的3D模型文件格式,它采用三角形离散地近似表示三维模型,目前已被工业界认为是快速成形领域的标准描述文件格式。

STL文件的最大特点也是其主要问题是,它是由一系列的三角形无序排列组合在一起的,没有反映三角形之间的拓扑关系。

目前的STL文件格式包括二进制和ASCII两种格式:

(1)      STL的二进制格式

UINT8[80]         -   Header
UINT32            -   Number of triangles
foreach triangle
  REAL32[3]       -    Normal vector
  REAL32[3]       -    Vertex 1
  REAL32[3]       -    Vertex 2
  REAL32[3]       -    Vertex 3
  UINT16          -    Attribute byte count
end

文件起始的80个字节是文件头,用于存贮零件名;紧接着用4个字节的整数来描述模型的三角形个数,后面逐个给出每个三角形的几何信息。每个三角形占用固定的50个字节,依次是3个4字节浮点数(三角形的法矢量),3个4字节浮点数(1个顶点的坐标),3个4字节浮点数(2个顶点的坐标),3个4字节浮点数(3个顶点的坐标),最后2个字节用来描述三角形的属性信息。一个完整二进制STL文件的大小为三角形面片数乘以50再加上84个字节。

 

(2)      STL的ASCII格式

solid filename stl             //文件路径及文件名

facet normal x y z             //三角形法向量

outer loop

vertex x y z                    //三角形第一个顶点的坐标

vertex x y z                    //三角形第二个顶点的坐标

vertex x y z                    //三角形第三个顶点的坐标

endloop

endfacet                         //第一个三角形定义完毕

……

endsolid filename stl         //整个文件结束

每一行以1个或2个关键字开头,而3顶点沿指向实体外部的法矢量方向逆时针排列,所以其法向量N=(V1-V3)卷积(V2-V3)。

通过上面的分析可以知道,二进制格式文件较小,节省文件存储和处理的时间,而ASCII格式的文件可读性强,更容易做进一步的数据处理

OBJ

由Alias|Wavefront公司开发的一种标准,适合用于3D软件模型之间的互导。目前几乎所有知名的3D软件都支持OBJ文件格式。OBJ文件是一种ASCII文件,另外有一种与此相关的二进制文件格式MOD,其作为专利未公开。

OBJ文件的每一行,都有极其相似的格式,在OBJ文件中,每行的格式如下:

前缀  参数1  参数2  参数3  ……

其中,前缀标识了这一行所存储的信息类型,参数则是具体的数据。OBJ文件的前缀可以有:

表2.1 OBJ文件中的关键字

顶点数据

关键字

说明

v

表示本行指定一个顶点。

此前缀后跟着3个单精度浮点数,分别表示该定点的X、Y、Z坐标值。

vt

表示本行指定一个纹理坐标。

此前缀后跟着两个单精度浮点数。分别表示此纹理坐标的U、V值。

vn

表示本行指定一个法线向量。

此前缀后跟着3个单精度浮点数,分别表示该法向量的X、Y、Z坐标值。

vp

参数空间顶点

基本元素

关键字

说明

p

l

线

f

表示本行指定一个表面(Face)。
一个表面实际上就是一个三角形图元。

curv

曲线

curv2

2D曲线

surf

曲面

*形式的曲线和曲面主体描述

关键字

说明

parm

参数值

trim

外部整理循环

hole

内部整理循环

scrv

特殊的曲线

sp

特殊的点

end

结束描述

*形式的曲面的连接性

关键字

说明

con

连接

*形式曲线和曲面属性

关键字

说明

cstype

曲线或曲面的类型 :basis matrix,Bezier,B-spline,Cardinal,Taylor

deg

bmat

basis matrix

step

步长

分组

关键字

说明

g

组名称

s

光滑组

mg

合并组

o

对象名称

显示与渲染属性

关键字

说明

bevel

导角插值

c_interp

颜色插值

d_interp

Dissolve interpolation

lod

细节层次

usemtl

此前缀后只跟着一个参数。该参数指定了从此行之后到下一个以usemtl开头的行之间的所有表面所使用的材质名称。该材质可以在此OBJ文件所附属的MTL文件中找到具体信息。

mtllib

此前缀后只跟着一个参数。该参数指定了此OBJ文件所使用的材质库文件(*.mtl)的文件路径.

shadow_obj

投射阴影

trace_obj

光线跟踪

ctech

曲线近似技术

stech

表面近似技术

在一个OBJ文件中,首先有一些以v、vt或vn前缀开头的行指定了所有的顶点、纹理坐标、法线的坐标。然后再由一些以f开头的行指定每一个三角形所对应的顶点、纹理坐标和法线的索引。在顶点、纹理坐标和法线的索引之间,使用符号“/”隔开的,值得注意的是这里的索引从1开始。

例如:f 1/3/42/5/6 3/4/2

这样的行表示以第1、2、3号顶点组成一个三角形,其中第一个顶点的纹理坐标的索引值为3,其法线的索引值是4;第二个顶点的纹理坐标的索引值为5,其法线的索引值是6;第三个顶点的纹理坐标的索引值为6,其法线的索引值是2。

另外OBJ文件中多行可以逻辑的连接在一起表示一行,方法是在每一行最后添加一个反斜杠符“\”,并且反斜杠后面不能出现空格或tab格。

 

3DS

是Autodesk 3dsMax使用的一种3D模型文件格式,现在主要用于存储mesh模型,在3D软件中通用性很强,并且它是一种二进制文件格式,下面是一种常见的结构:

0x4D4D // Main Chunk
├─ 0x0002 // M3D Version
├─ 0x3D3D // 3D Editor Chunk
│  ├─ 0x4000 // Object Block
│  │  ├─ 0x4100 // Triangular Mesh
│  │  │  ├─ 0x4110 // Vertices List
│  │  │  ├─ 0x4120 // Faces Description
│  │  │  │  ├─ 0x4130 // Faces Material
│  │  │  │  └─ 0x4150 // Smoothing Group List
│  │  │  ├─ 0x4140 // Mapping Coordinates List
│  │  │  └─ 0x4160 // Local Coordinates System
│  │  ├─ 0x4600 // Light
│  │  │  └─ 0x4610 // Spotlight
│  │  └─ 0x4700 // Camera
│  └─ 0xAFFF // Material Block
│     ├─ 0xA000 // Material Name
│     ├─ 0xA010 // Ambient Color
│     ├─ 0xA020 // Diffuse Color
│     ├─ 0xA030 // Specular Color
│     ├─ 0xA200 // Texture Map 1
│     ├─ 0xA230 // Bump Map
│     └─ 0xA220 // Reflection Map
│        │  /* Sub Chunks For Each Map */
│        ├─ 0xA300 // Mapping Filename
│        └─ 0xA351 // Mapping Parameters
└─ 0xB000 // Keyframer Chunk
   ├─ 0xB002 // Mesh Information Block
   ├─ 0xB007 // Spot Light Information Block
   └─ 0xB008 // Frames (Start and End)
      ├─ 0xB010 // Object Name
      ├─ 0xB013 // Object Pivot Point
      ├─ 0xB020 // Position Track
      ├─ 0xB021 // Rotation Track
      ├─ 0xB022 // Scale Track
      └─ 0xB030 // Hierarchy Position

 

3DS文件格式基于块,每个块包含ID及下一块相对于该块的偏移字节数。ID表示块的含义,为2个字节,偏移字节数是4个字节,它实际表示的就是本数据区的大小。其中有一个块总是位于整个文件的最开始,是其他所有块的根块,称之为主块或基本信息块——MAIN3D。主块下包含两个块,用于描述场景数据的主编辑块和用于描述关键帧数据的关键帧块。主编辑块的子块虽然是按照一定的次序存放,但其中有些块并不是一定存在。