.ply模型格式解析与Loader编写

来源:互联网 发布:淘宝上有没有卖视频的 编辑:程序博客网 时间:2024/05/20 00:17

格式介绍

  PLY作为一种多边形模型数据格式,不同于三维引擎中常用的场景图文件格式和脚本文件,每个PLY文件只用于描述一个多边形模型对象Object,该模型对象可以通过诸如顶点、面等数据进行描述,被统称作元素Element。

  PLY的文件结构是 文件头+数据列表。其中文件头以行为单位描述文件类型、格式与版本、元素类型、元素的属性等。数据列表根据文件头中所列出元素类型的顺序及其属性,以文本字符或二进制依次存储各个数据。

对于元素的属性定义方式,PLY允许单一属性定义:

property <data-type> <property-name-1>

以及列表属性方式:

property list <numerical-type> <numerical-type> <property-name>

其中第一个数据类型描述列表元素数量,第二个数据类型描述每个列表元素。

  除了顶点和多边形面两种基本元素外,PLY文件格式允许使用自定义的元素和元素属性,称为Other Element和Other Property。只要遵循文件格式中对元素及元素属性的格式定义,就能够被正常的解析,这也是PLY格式所具备的灵活性特色。

典型的.ply文件(由MVE生成)如下:

plyformat binary_little_endian 1.0comment Export generated by libmveelement vertex 570204property float xproperty float yproperty float zproperty uchar redproperty uchar greenproperty uchar blueproperty float confidenceproperty float valueelement face 1103868property list uchar int vertex_indicesend_header后跟二进制数值例如x y z red green blue confidence value0.0  0.1  0.2   255 255 255  1.0  1.0...........570204...............list_count  本面的顶点个数 uchar类型vertex_indices 到对应顶点的索引 int类型 从0开始4 1 2 3 4...........1103868...............

其中value字段是MVE特有的,用于定义the scale of the samples比例

ply支持如下数据类型:

name type bytes int8 character 1 uint8 unsigned character 1 int16 short integer 2 uint16 unsigned short integer 2 int32 integer 4 uint32 unsigned integer 4 float32 single-precision float 4 float64 double-precision float 8

Loader编写

   鉴于ply文件允许使用自定义的元素和元素属性,允许动态列表长度,故其Loader需要构建一个动态的树状数据结构,并允许动态类型。
ply文件头给出了文件格式和大小端信息后,后面即开始了对于数据结构的说明。
树状结构如下:

Element 名称1 数量    property 类型 名称1    property 类型 名称2        ........Element 名称2 数量    property 类型 名称1    property 类型 名称2        ........Element 名称3 数量    property list uchar 类型 名称1    property list uchar 类型 名称2    //变长列表,由list值决定后面元素的个数

定义ElementFormat类和PropertyFormat类存储以上格式信息

实际数据存储到类

class Element{    std::vector<Property> properties;};
class Property{Union {};};

注意到,实际存储数据时一般都有多个Element,所以理论上还应该有ElementList这种类型

0 0
原创粉丝点击