ply格式相关内容5页_第1页
ply格式相关内容5页_第2页
ply格式相关内容5页_第3页
ply格式相关内容5页_第4页
ply格式相关内容5页_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ply格式总结一、 ply格式简介PLY文件格式是Stanford大学开发的一套三维mesh模型数据格式,图形学领域内很多著名的模型数据,比如Stanford的三维扫描数据库(其中包括很多文章中会见到的Happy Buddha, Dragon, Bunny兔子),Geogia Tech的大型几何模型库,北卡(UNC)的电厂模型等,最初的模型都是基于这个格式的。PLY作为一种多边形模型数据格式,不同于三维引擎中常用的场景图文件格式和脚本文件,每个PLY文件只用于描述一个多边形模型对象(Object),该模型对象可以通过诸如顶点、面等数据进行描述,每一类这样的数据被称作一种元素(Element)。

2、二、 ply格式1、PLY的文件结构简单:文件头加上元素数据列表。其中文件头中以行为单位描述文件类型、格式与版本、元素类型、元素的属性等,然后就根据在文件头中所列出元素类型的顺序及其属性,依次记录各个元素的属性数据。2、典型的PLY文件结构: 头部 顶点列表 面片列表 (其他元素列表)3、举例ply 头部的开始,是文件的识别字符format ascii 1.0 关键词format,特定的ascii或二进制格式(见说明1),版本号comment made by anonymous 关键词comment,要注释的内容。comment this file is a cube 注释内容可有可无elem

3、ent vertex 8 描述一个元素开始:关键词element,元素名,元素在文件中的个数property float32 x 元素属性:关键词property,数据类型(见说明2),属性名property float32 y property float32 z element face 6 第二个元素property list uint8 int32 vertex_index 列表数据类型,见说明3end_header 结尾,与ply呼应以上是 头部 的全部内容顶点列表开始0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 面片列表开始:顶点个

4、数,顶点索引号4 0 1 2 3 4 7 6 5 4 4 0 4 5 1 4 1 5 6 2 4 2 6 7 3 4 3 7 4 0说明:1. 例子中文件使用的是ascii,二进制版本头部的唯一不同是用词“binary_little_endian”或者“binary_big_endian”替换词“ascii”。2. 属性可能具有的标量数据类型列表如下: 名称 类型 字节数 - int8 字符 1 uint8 非负字符 1 int16 短整型 2 uint16 非负短整型 2 int32 整型 4 uint32 非负整型 4 float32 单精度浮点数 4 float64 双精度浮点数 83.

5、 列表数据类型的属性定义有一种特殊的格式: property list 这种格式的一类例子是上面文件中的: property list uint8 int32 vertex_index 这表示属性“vertex_index”首先包含一个非负字符报苏在属性里包含多少索引,接下来是一个列表包含许多整数。在这个边长列表里的每个整数都是一个顶点的索引。三、 ply格式的读写1. 首先是所需数据结构的定义(1)点结构struct Point3dpublic: float X;float Y;float Z; Point3d(float x, float y, float z)this-X=x;this-

6、Y=y;this-Z=z; (2)三角形结构三角形结构按常理理解应该是包含了3个Point3d,不过这里有两种方式来定义这个Triangle结构。 一种是采用点地址:struct Trianglepublic : Point3d* P0; Point3d* P1; Point3d* P2; Triangle(Point3d* p0, Point3d* p1, Point3d* p2) this-P0=p0;this-P1=p1;this-P2=p2; ;第二种是使用索引:struct Trianglepublic : int P0Index; int P1Index; int P2Index;

7、 Triangle(int p0index, int p1index, int p2index) this-P0Index=p0index; this-P1Index=p1index; this-P2Index=p2index; ; (3)mesh结构class Meshpublic: std:vector Vertices; std:vector Faces; Mesh(); Mesh(); void AddVertex(Point3d* toAdd); void AddFace(Triangle* tri);class Meshpublic: std:vector Vertices; st

8、d:vector Faces; Mesh(); Mesh(); void AddVertex(Point3d& toAdd); void AddFace(Triangle& tri);2. 使用这里定义的Mesh类,使用C+语言读写.ply文件的函数如下:(1)ply文件的读void ReadFile(Mesh& mesh,const char* fileName) int vcount=0; int fcount=0; FILE * nfile = fopen(fileName,r); fscanf(nfile,plynformat ascii 1.0ncomment VCGLIB gene

9、ratednelement vertex %dn,&vcount); fscanf(nfile,property float xnproperty float ynproperty float znproperty uchar rednproperty uchar greennproperty uchar bluenelement face %dn,&fcount); fscanf(nfile,property list int int vertex_indicesnend_headern); float v1=0,v2=0,v3=0; int r=0,g=0,b=0; int i1=0,i2

10、=0,i3=0; for(int i=0;ivcount;i+) fscanf(nfile,%f %f %f %d %d %dn,&v1,&v2,&v3,&r,&g,&b); Point3d p3d(v1,v2,v3); mesh.AddVertex(p3d); for(int j=0;jfcount;j+) fscanf(nfile,3 %d %d %dn,&i1,&i2,&i3); Triangle t(i1,i2,i3); mesh.AddFace(t); fclose(nfile); (2)ply文件的写void Output(Mesh& mesh,const char* filena

11、me) FILE * nfile = fopen(filename,wb); fprintf(nfile,plyn); fprintf(nfile,format ascii 1.0n); fprintf(nfile,comment VCGLIB generatedn); fprintf(nfile,element vertex %dn,mesh.Vertices.size(); fprintf(nfile,property float xn); fprintf(nfile,property float yn); fprintf(nfile,property float zn); fprintf

12、(nfile,property uchar redn); fprintf(nfile,property uchar greenn); fprintf(nfile,property uchar bluen); fprintf(nfile,element face %dn,mesh.Faces.size(); fprintf(nfile,property list int int vertex_indicesn); fprintf(nfile,end_headern); for(size_t i=0;imesh.Vertices.size();i+) fprintf(nfile,%.2f %.2f %.2f %d %d %dn,mesh.Verticesi.Data0,mesh.Ver

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论