三维模型文件格式解读
最近接触到三维模型文件,发现格式五花八门的,这里做一个汇总和解读。
STL
简介
STL,全称为STereoLithography,译作:立体光刻,由3D System软件公司创立。但因三角网格形式的其特点,又可以翻译为“标准三角语言(Standard Triangle Language)”,“标准曲面细分语言(Standard Tessellation Language)”。
STL文件使用若干个非结构化的三角网格来记录三维实体信息。在笛卡尔坐标系中,每一个三角网格由三个顶点按照右手定则排序方式构成,同时按照右手定则记录一个与之对应的表面单位法线信息。文件记录的坐标信息是没有尺度的,计量单位为任意的。
文件格式
solid name facet normal ni nj nk outer loop vertex v1x v1y v1z vertex v2x v2y v2z vertex v3x v3y v3z endloop endfacet endsolid name
在stl中,允许存在多个实体对象。通过 solid name
和 endsolid name
这一对关键词来描述一个实体对象。其中 name
是实体对象的名称,可以省略,因为通常一个stl文件只存一个实体对象。
solid name …… endsolid name
在实体对象中,一般存在若干个面片(facet),通过facet
和 endfacet
这一对关键词来描述一个面片。而面片描述信息包括法向量(normal)信息,以及构成面片的三个顶点(vertex)。其中法向量使用 facet normal
,后接 nj nj nk
三个浮点数,表示法向量(, , )。面片的三个顶点通常要成组出现,使用outer loop
和 endloop
这对关键词来分割。顶点的坐标使用vertex
来描述,后接v1x v1y v1z
三个浮点数,表示坐标() 。
facet normal ni nj nk outer loop vertex v1x v1y v1z vertex v2x v2y v2z vertex v3x v3y v3z endloop endfacet
值得注意的是,在stl文件中,相邻的三角面片必须共享两个公共顶点。
上图左侧这种情形则违反了上述原则,应该表示为右侧这种。
PLY
简介
PLY, 全称为 Polygon file format,即使用多边形来记录三维模型的一种文件格式。其主要存储的是构成面片的多边形顶点三维坐标。可以存储颜色、透明度、表面法向量、材质等信息。
文件格式
ply format ascii 1.0 comment这是一个正四面体 element vertex 4 property float x property float y property float z element face 4 property list uchar int vertex_index end_header 0 3 0 2.449 -1.0 -1.414 0 -1 2.828 -2.449 -1.0 -1.414 3 0 1 3 3 0 2 1 3 0 3 2 3 1 2 3
在ply文件中,内容可以分为档头和内容两部分,在档头中描述了当前文件所使用的格式、自定义元素类型和数量等信息。在内容中则根据档头所描述的类型进行数据记录。通常ply分成三部分:
- 档头
- 顶点元素列表
- 面元素列表
首先,以ply作为识别ply文件的标识
ply
然后,声明当前文件格式,以下三种都可以
format ascii 1.0 format binary_little_endian 1.0 format binary_big_endian 1.0
档头还支持一些注解,通过关键词 comment 定义:
comment This is a comment!
接着定义内容区中的元素。格式如下,即先通过element
关键词声明元素名称和数量,然后定义元素中各成员变量的类型和名称。
element <element name> <number in file> property <data_type> <property name 1> property <data_type> <property name 2> property <data_type> <property name 3>
内定的成员变量类型包括:
- char、uchar
- short、ushort
- int、uint
- float、double
- list
如,定义一个包含12个顶点的物体,每个顶点使用3个单精度浮点数 (x,y,z)代表点的座标,使用3个unsigned char代表顶点颜色,颜色顺序为 (B, G, R),则档头的写法为:
element vertex 12 property float x property float y property float z property uchar blue property uchar green property uchar red
再如,定义一个具有10个面的物体,写法为:
element face 10 property list uchar int vertex_indices
最后结束档头:
end_header
STP
to be continued ……
IGS
OBJ
DXF
参考资料
- 本文链接: https://www.cnblogs.com/gshang/p/18580764
- 版权声明: 本博客所有文章除特别声明外,均采用 CC-BY-NC-SA 4.0 许可协议。转载请注明出处!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了