ply补全为立方体_PLY文件格式

一、PLY简介

PLY文件格式是Stanford大学开发的一套三维mesh模型数据格式,图形学领域内很多著名的模型数据,比如Stanford的三维扫描数据库(其中包括很多文章中会见到的Happy Buddha, Dragon, Bunny兔子),Geogia Tech的大型几何模型库,北卡(UNC)的电厂模型等,最初的模型都是基于这个格式的。

PLY多边形文件格式的开发目标是建立一套针对多边形模型的,结构简单但是能够满足大多数图形应用需要的模型格式,而且它允许以ASCII码格式或二进制形式存储文件。PLY的开发者希望,这样一套既简单又灵活的文件格式,能够帮助开发人员避免重复开发文件格式的问题。然而由于各种各样的原因,在工业领域内,新的文件格式仍然在不断的出现,但是在图形学的研究领域中,PLY还是种常用且重要的文件格式。

PLY作为一种多边形模型数据格式,不同于三维引擎中常用的场景图文件格式和脚本文件,每个PLY文件只用于描述一个多边形模型对象(Object),该模型对象可以通过诸如顶点、面等数据进行描述,每一类这样的数据被称作一种元素(Element)。相比于现代的三维引擎中所用到的各种复杂格式,PLY实在是种简单的不能再简单的文件格式,但是如果仔细研究就会发现,就像设计者所说的,这对于绝大多数的图形应用来说已经是足够用了。

二、PLY结构

PLY的文件结构简单:文件头加上元素数据列表。其中文件头中以行为单位描述文件类型、格式与版本、元素类型、元素的属性等,然后就根据在文件头中所列出元素类型的顺序及其属性,依次记录各个元素的属性数据。

典型的PLY文件结构:

头部

顶点列表

面片列表

(其他元素列表)

头部是一系列以回车结尾的文本行,用来描述文件的剩余部分。头部包含一个对每个元素类型的描述,包括元素名(如“边”),这个元素在工程里有多少,以及一个与这个元素关联的不同属性的列表。头部还说明这个文件是二进制的或者是ASCII的。头部后面的是一个每个元素类型的元素列表,按照在头部中描述的顺序出现。

下面是一个立方体的完整ASCII描述。大括号中的注释不是文件的一部分,它们是这个例子的注解。文件中的注释一般在

“comment”开始的关键词定义行里。

ply

format   ascii   1.0   {   ascii/二进制,格式版本数   }

comment   made   by   anonymous   {   注释关键词说明,像其他行一样   }

comment   this   file   is   a   cube

element   vertex   8   {   定义“vertex”(顶点)元素,在文件中有8个   }

property   float32   x   {   顶点包含浮点坐标“x”}

property   float32   y   {   y   坐标同样是一个顶点属性   }

property   float32   z   {   z   也是坐标   }

element   face   6   {   在文件里有6个“face”(面片)   }

property   list   uint8   int32   vertex_index   {   “vertex_indices”(顶点素引)是一列整数   }

end_header   {   划定头部结尾   }

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   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 

这个例子说明头部的基本组成。头部的每个部分都是一个以关键词开头,以回车结尾的ASCII串。"ply"是文件的头四个字符。

跟在文件头部开头之后的,是关键词“format”和一个特定的ASCII或者二进制的格式,接下来是一个版本号。

再下面是多边形文件中每个元素的描述,在每个元素里还有多属性的说明。一般元素以下面的格式描述:

element    

property    

property    

property    

属性罗列在“element”(元素)行后面定义,既包含属性的数据类型,也包含属性在每个元素中出现的次序。一个属性可以有三种数据类型:标量,字符串和列表。属性可能具有的标量数据类型列表如下:

名称      类型           字节数

-------------------------------

int8        字符                    1

uint8      非负字符           1

int16      短整型               2

uint16    非负短整型       2

int32      整型                   4

uint32    非负整型           4

float32   单精度浮点数   4

float64   双精度浮点数   8

这些字节计数很重要,而且在实现过程中不能修改以使这些文件可移植。

使用列表数据类型的属性定义有一种特殊的格式:property   list       ,这种格式,一个非负字符表示在属性里包含多少索引,接下来是一个列表包含许多整数。在这个边长列表里的每个整数都是一个顶点的索引。

另外一个立方体定义:

ply

format   ascii   1.0

comment   author:   anonymous

comment   object:   another   cube

element   vertex   8

property   float32   x

property   float32   y

property   float32   z

property   red   uint8   {   顶点颜色开始   }

property   green   uint8

property   blue   uint8

element   face   7

property   list   uint8   int32   vertex_index   {   每个面片的顶点个数   }

element   edge   5   {   物体里有5条边   }

property   int32   vertex1   {   边的第一个顶点的索引   }

property   int32   vertex2   {   第二个顶点的索引   }

property   uint8   red   {   边颜色开始   }

property   uint8   green

property   uint8   blue

end_header

0   0   0   255   0   0   {   顶点列表开始   }

0   0   1   255   0   0

0   1   1   255   0   0

0   1   0   255   0   0

1   0   0   0   0   255

1   0   1   0   0   255

1   1   1   0   0   255

1   1   0   0   0   255

3   0   1   2   {   面片列表开始,从一个三角形开始   }

3   0   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

0   1   255   255   255   {   边列表开始,从白边开始   }

1   2   255   255   255

2   3   255   255   255

3   0   255   255   255

2   0   0   0   0   {   以一个黑线结束   }

这个文件为每个顶点指定一个红、绿、蓝值。

为了说明变长vertex_index(顶点索引)的能力,物体的头两个面片是两个三角形而不是一个四边形。这意味着物体的面片数是7。这个物体还包括一个边列表。每条边包括两个指向说明边的顶点的指针。每条边也有一种颜色。上面定义的五条边指定了颜色,使文件里的两个三角形高亮。前四条边白色,它们包围两个三角形。最后一条边是黑的,他是分割三角形的边。

三、用户定义元素

上面的例子显示了顶点、面片和边三种元素的用法。PLY   格式同样允许用户定义它们自己的元素。定义新元素的格式于顶点、面片和边相同。这是头部定义材料属性的部分:

element   material   6

property   ambient_red   uint8   {   环绕颜色   }

property   ambient_green   uint8

property   ambient_blue   uint8

property   ambient_coeff   float32

property   diffuse_red   uint8   {   扩散(diffuse)颜色   }

property   diffuse_green   uint8

property   diffuse_blue   uint8

property   diffuse_coeff   float32

property   specular_red   uint8   {   镜面(specular)颜色   }

property   specular_green   uint8

property   specular_blue   uint8

property   specular_coeff   float32

property   specular_power   float32   {   Phong   指数   }

这些行应该在头部顶点、面片和边的说明后直接出现。如果我们希望每个顶点有一个材质说明,我们可以将这行加在顶点属性末尾:property   material_index   int32

这个整数现在是一个到文件内包含的材质列表的索引。这可能诱使一个新应用的作者编制一些信的元素保存在PLY文件中。

以下是常用的elements 和 properties 原地址 http://www.mathworks.com/matlabcentral/fx_files/5459/1/content/ply.htm

Common Elements and Properties

While the PLY format has the flexibility to define many types of elements and properities, a common set of elements are understood between programs to communicate common 3D data types. Turk suggests elements and

property names that programs should try to make standard.

Element

Property

Data Type

Property Description

vertex

x

y

z

float

float

float

x,y,z coordinates

nx

ny

nz

float

float

float

x,y,z components of normal

red

green

blue

alpha

uchar

uchar

uchar

uchar

vertex color

amount of transparency

material_index

int

index to list of materials

face

vertex_indices

list of int

indices to vertices

back_red

back_green

back_blue

uchar

uchar

uchar

backside color

edge

vertex1

vertex2

int

int

index to vertex

index to other vertex

crease_tag

uchar

crease in subdivision surface

material

red

green

blue

alpha

uchar

uchar

uchar

uchar

material color

amount of transparency

reflect_coeff

refract_coeff

refract_index

extinct_coeff

float

float

float

float

amount of light reflected

amount of light transmitted

index of refraction

extinction coefficient

* - required "core" properties in red

For most applications, the minimum necessary information is vertex and face data. To make it easier for programs to interpret PLY files, the element properties listed in red should always be included. If there is

no face data (as in the case of point-cloud data) the face element could be defined with an element count of zero. The other elements and properties are suggested names for often used information like material parameters and edge information.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 修改存储过程

MySQL 中通过 ALTER PROCEDURE 语句来修改存储过程。 MySQL 中修改存储过程的语法格式如下: ALTER PROCEDURE 存储过程名 [ 特征 ... ]特征指定了存储过程的特性,可能的取值有: CONTAINS SQL 表示子程序包含 SQL 语句,但不包含读…

python 可执行文件打包_使用可执行文件打包Python库

通常,当整个项目适合单个模块文件时,您只将python包作为模块分发.如果您的项目比这更复杂,通常最好将项目构造为包含__init__.py文件的包.这是您的项目看起来像转换为包的内容Project/|-- README|-- requirement.txt|-- setup.py|-- scripts/| |-- driver.py|-- driver/| |-- _…

MySQL 删除存储过程

当 MySQL 数据库中存在废弃的存储过程时&#xff0c;我们需要将它从数据库中删除。 MySQL 中使用 DROP PROCEDURE 语句来删除数据库中已经存在的存储过程。语法格式如下&#xff1a; DROP { PROCEDURE | FUNCTION } [ IF EXISTS ] <过程名>语法说明如下&#xff1a; 过…

java socket 阻塞模式_Java中Socket Read阻塞问题

本人来说并不熟悉JAVA语言&#xff0c;只是近期在分析某个简单的java agent程序时&#xff0c;根据对应的代码写了一个对接的程序&#xff0c;两者之间是典型的C/S socket编程。客户端在向服务端发送相应的指令后&#xff0c;服务端(装agent的主机)执行后会返回执行的数据给客户…

java 窗体 源码_Java制作MDI窗体源代码

由于实际需要做一个MDI窗体&#xff0c;百度里面找到一个不错的源代码给大家分享一下。import javax.swing.*;import java.awt.event.*;import java.awt.*;class JInternalFrame1 extends JFrame implements ActionListener{JDesktopPane desktopPane;int count 1;public JInt…

MySQL 创建触发器

触发器是与 MySQL 数据表有关的数据库对象&#xff0c;在满足定义条件时触发&#xff0c;并执行触发器中定义的语句集合。 基本语法 在 MySQL 5.7 中&#xff0c;可以使用 CREATE TRIGGER 语句创建触发器。 语法格式如下&#xff1a; CREATE <触发器名> < BEFORE …

java通过url获取网页内容_Java语言通过URL读取网页数据并保存到本地文件(代码实例)...

本文主要向大家介绍了Java语言通过URL读取网页数据并保存到本地文件(代码实例)&#xff0c;通过具体的内容向大家展示&#xff0c;希望对大家学习JAVA语言有所帮助。Java通过URL读取网页数据并保存到本地文件(代码实例)import java.io.*;import java.net.MalformedURLException…

MySQL 修改和删除触发器

修改触发器可以通过删除原触发器&#xff0c;再以相同的名称创建新的触发器。 基本语法 与其他 MySQL 数据库对象一样&#xff0c;可以使用 DROP 语句将触发器从数据库中删除。 语法格式如下&#xff1a; DROP TRIGGER [ IF EXISTS ] [数据库名] <触发器名>语法说明如…

java做主成分分析_主成分分析(PCA) Java

导入jar包:Jama-1.0.2.jar//计算类import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.TreeMap;import Jama.Matrix;/**…

idl文件生成java_IDL和生成代码分析

IDL:接口描述语言这里使用thrift-0.8.0-xsb这个版本来介绍IDL的定义以及简单实例分析。1. namespace 定义包名2.struct 结构体&#xff0c;定义服务接口的参数和返回值用到的类结构。基本类型不需要使用struct.3.service 定义接口&#xff1a;demo.thrift1 namespace java com.…

java从控制台读取数据_Java不同版本从控制台读取数据方法及优缺点分析

从JDK 5.0版本开始&#xff0c;能从控制台中输入数据的方法每增加一个版本号&#xff0c;就有一种新增的方法&#xff0c;这也增加了选择的种类&#xff0c;可以依据不同的要求来进行选择。下面和绿茶小编一起来了解一下各个版本从控制台中读取数据的方法以及各自的优缺点。1、…

java类和对象程序_Java类与对象程序设计基础

Java类与对象程序设计基础一、实验目的&#xff1a;通过编制一个独立应用程序&#xff0c;使得学生掌握Java的系统所提供类的引用方法&#xff1b;通过编制一个完整的应用程序&#xff0c;使得学生对Java的应用程序的基本构成和基本算法熟练掌握&#xff0c;同时熟悉Java开发环…

MySQL 修改和删除索引

MySQL 中修改索引可以通过删除原索引&#xff0c;再根据需要创建一个同名的索引&#xff0c;从而实现修改索引的操作。 基本语法 当不再需要索引时&#xff0c;可以使用 DROP INDEX 语句或 ALTER TABLE 语句来对索引进行删除。 1 使用 DROP INDEX 语句 语法格式&#xff1a;…

java记事本保存_JAVA记事本关于保存

为什么运行这个程序后点击保存&#xff0c;然后打开时不是按行输出的啊?哪里有问题&#xff1f;publicclassJSBJSB{publicstaticvoidmain(String[]args){FirstWindowwinnewFirstWindow("记事本");}}classF...为什么运行这个程序后点击保存&#xff0c;然后打开时不是…

MySQL 创建用户

在对 MySQL 的日常管理和实际操作中&#xff0c;为了避免用户恶意冒名使用 root 账号控制数据库&#xff0c;通常需要创建一系列具备适当权限的账号&#xff0c;应该尽可能地不用或少用 root 账号登录系统&#xff0c;以此来确保数据的安全访问。 创建用户 可以使用 CREATE U…

acm用java怎么写_用java来写ACM

前言从去年10月份开始就一直都在九度oj平台写acm&#xff0c;到今天在九度oj的总排名已经到了第6名&#xff0c;收获很多特别是算法和数据结构方面的提高&#xff0c;这种提高直接反映在我找工作的顺利中但是人总要学会拥抱变化&#xff0c;特别是我即将加入阿里系&#xff0c;…

MySQL 修改用户

修改用户账号 可以使用 RENAME USER 语句修改一个或多个已经存在的 MySQL 用户账号。 语法格式&#xff1a; RENAME USER <旧用户> TO <新用户>语法说明如下&#xff1a; <旧用户>&#xff1a;系统中已经存在的 MySQL 用户账号。<新用户>&#xff1…

MySQL 删除用户

MySQL 数据库中可以使用 DROP USER 语句来删除一个或多个用户账号以及相关的权限。 语法格式&#xff1a; DROP USER <用户名1> [ , <用户名2> ]…使用 DROP USER 语句应该注意以下几点&#xff1a; DROP USER 语句可用于删除一个或多个 MySQL 账户&#xff0c;并…

python模块使用相对路径还是绝对路径、哪种更好_python学习的第十八天模块之包、相对搜索路径和绝对搜索路径...

一、包1、什么是包包是一种通过使用‘.模块名’来组织python模块名称空间的方式。具体就是一个包含有__init__.py文件的文件夹&#xff0c;所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来PS&#xff1a;(1)在pyhton3中没有__init__不会报错&#xff0c;但在pyth…

python的pygame库使用方法_[宜配屋]听图阁

使用python pygame库实现一个双人弹球小游戏&#xff0c;两人分别控制一个左右移动的挡板用来拦截小球&#xff0c;小球会在两板间不停弹跳&#xff0c;拦截失败的一方输掉游戏&#xff0c;规则类似于简化版的乒乓球。因为是第一次用pygame写python小游戏并且只用了两三个小时&…