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

格式介绍

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

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

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

property <data-type> 

以及列表属性方式:

property list   

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

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

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

ply
format binary_little_endian 1.0
comment Export generated by libmve
element vertex 570204
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
property float confidence
property float value
element face 1103868
property list uchar int vertex_indices
end_header
后跟二进制数值
例如
x y z red green blue confidence value
0.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 properties;

};
class Property
{
Union 
{


};



};

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

你可能感兴趣的:(图形学与游戏引擎,PLY,模型格式)