PLY模型格式详解【3D】

本文介绍PLY 多边形文件格式,这是一种用于存储被描述为多边形集合的图形对象。 PLY文件格式的目标是提供一种简单且易于实现但通用的格式足以适用于各种模型。 PLY有两种子格式:易于入门的 ASCII 表示形式和用于紧凑存储和快速保存和加载的二进制格式。 我们希望这种格式将促进程序之间以及人群之间的图形对象的交换。

在这里插入图片描述
如果需要将gltf、fbx、obj、dae等格式的3D模型转换到PLY格式,可以使用这个在线的 3D模型格式转换 工具。

1、PLY格式概述

任何在计算机图形领域工作过一段时间的人时间知道图形存储格式的令人眼花缭乱的阵列对象。 似乎每个程序员、每个新的编程项目都创建一种新的文件格式。

走出这个泥沼的出路是创建一个足够灵活的单一文件格式预测未来的需求,这很简单,以免被赶走潜在用户。 一旦定义了这样的格式,就会出现一套实用程序可以围绕这个格式编写。 添加到套件中的每个新实用程序都可以利用其他人的成果。

PLY 格式将对象描述为顶点、面和其他元素,以及颜色和法线方向等可以附加到这些元素上的属性。PLY 文件包含恰好是一个对象的以下描述。

此类对象的来源包括:手工数字化对象,来自建模程序的多边形对象、范围数据、行进立方体三角化(体积数据的等值面)、地形数据、光能传递模型等。

可能与对象一起存储的属性包括:颜色、表面法线、纹理坐标、透明度、范围数据置信度,以及多边形正面和背面的不同属性。

PLY 格式并非旨在作为一般场景描述语言、着色语言或包罗万象的建模格式。 这意味着它不包括变换矩阵、对象实例化、建模层次结构或对象子部分。

典型的 PLY 对象定义只是 (x,y,z) 三元组的顶点列表和面列表,由列表中的索引描述顶点。 大多数 PLY 文件都包含此核心信息。 顶点和面是“元素”的两个示例,PLY 文件的大部分内容是其列表元素。 给定文件中的每个元素都有固定数量的“属性”
为每个元素指定。

PLY 文件中的典型信息只包含两个元素,顶点的 (x,y,z) 三元组和每个面的顶点索引。 应用程序可以创建附加到对象元素的新属性。 例如,红色、绿色和蓝色的属性通常与顶点元素相关。 添加新的属性时,旧程序不应被中断,解释不了的可以被丢弃。

此外,还可以创建一个新元素类型并定义与该元素关联的属性。 新元素的例子是边、单元(指向面的指针列表)和材质(环境、漫反射和镜面反射颜色和系数)。 新元素还可以被不理解它们的程序携带或丢弃。

2、PLY文件结构

这是典型 PLY 文件的结构:

  • 标头
  • 顶点列表
  • 面列表
  • 其他元素的列表

标头是一系列以回车符结尾的文本行,描述文件的其余部分。 标头包含每个的描述
元素类型,包括元素的名称(例如 edge),有多少个这样的元素位于对象中,以及关联的各种属性的列表与元素。 标头还表明该文件是二进制文件还是 ASCII 文件。标头后面是每种元素类型的元素列表,按照表头中描述的顺序出现。

以下是一个立方体模型的完整 ASCII 描述。 同一对象的二进制文件的标头
仅仅是用 binary_little_endian或 binary_big_endian 代表单词 ascii。 这
括号中的注释不是文件的一部分,它们是对此示例的注释。 文件中的注释是普通的关键字标识行,以 comment 开头。

ply
format ascii 1.0           { ascii/binary, format version number }
comment made by anonymous  { comments keyword specified, like all lines }
comment this file is a cube
element vertex 8           { define "vertex" element, 8 of them in file }
property float32 x         { vertex contains float "x" coordinate }
property float32 y         { y coordinate is also a vertex property }
property float32 z         { z coordinate, too }
element face 6             { there are 6 "face" elements in the file }
property list uint8 int32 vertex_index { "vertex_indices" is a list of ints }
end_header                 { delimits the end of the header }
0 0 0                      { start of vertex list }
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                  { start of face list }
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和 end_header)也采用这种形式。

字符 ply必须是文件的前四个字符,因为它们是文件的魔力数字。 标题开头之后是关键字 format和ASCII 或二进制格式的规范,后跟版本数字。 接下来是多边形中各个元素的描述,并且在每个元素描述中是规范特性。 通用元素描述具有以下形式:

element <element-name> <number-in-file>
property <data-type> <property-name-1>
property <data-type> <property-name-2>
property <data-type> <property-name-3>
...

element行后面列出的属性定义了属性的数据类型以及该属性在每个元素中出现的顺序。属性可能具有三种数据类型:标量、字符串和列表。 以下是属性可能具有的标量数据类型的列表:

nametypenumber of bytes
int8character1
uint8unsigned character1
int16short integer2
uint16unsigned short integer2
int32integer4
uint32unsigned integer4
float32single-precision float4
float64double-precision float8

这些字节数很重要,并且在不同的实现中不得有所不同以保证这些文件可移植。 有一种特殊形式的属性定义使用列表数据类型:

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

上面的立方体数据集文件中的一个示例:

  property list uint8 int32 vertex_index

这意味着属性 vertex_index 首先包含一个无符号字符标识属性包含多少个索引,后跟一个包含的证书列表。 这个可变长度列表中的每个整数都是一个顶点的索引。

3、PLY文件的另一个例子

这是另一个立方体定义:

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                     { start of vertex color }
property green uint8
property blue uint8
element face 7
property list uint8 int32 vertex_index { number of vertices for each face }
element edge 5                         { five edges in object }
property int32 vertex1                 { index to first vertex of edge }
property int32 vertex2                 { index to second vertex }
property uint8 red                     { start of edge color }
property uint8 green
property uint8 blue
end_header
0 0 0 255 0 0                          { start of vertex list }
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                           { start of face list, begin with a triangle }
3 0 2 3                           { another triangle }
4 7 6 5 4                         { now some quadrilaterals }
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                   { start of edge list, begin with white edge }
1 2 255 255 255
2 3 255 255 255
3 0 255 255 255
2 0 0 0 0                         { end with a single black line }

该文件为每个顶点指定红色、绿色和蓝色值。 为说明 vertex_index 的可变长度性质,对象的前两个面是三角形而不是正方形。 这意味着对象的面数为 7。

该对象还包含一个边的列表。 每条边都包含两个指向边的顶点的指针。 每个边也有一种颜色。 上面定义的五个边突出显示文件中的两个三角形。 前4条边是白色的,它们围绕着两个三角形。 最终的边是黑色,它是分隔三角形的边。

4、PLY自定义元素

上面的例子展示了三个元素的使用:顶点、面和边。 PLY 格式还允许用户定义自己的元素。

定义新元素的格式与定义顶点、边和面完全相同。 这是定义材质属性的标头:

element material 6
property ambient_red uint8               { ambient color }
property ambient_green uint8
property ambient_blue uint8
property ambient_coeff float32
property diffuse_red uint8               { diffuse color }
property diffuse_green uint8
property diffuse_blue uint8
property diffuse_coeff float32
property specular_red uint8              { specular color }
property specular_green uint8
property specular_blue uint8
property specular_coeff float32
property specular_power float32          { Phong power }

这些行将直接出现在标题中的顶点、面和边的规范之后。 如果我们希望每个顶点都有一个材质,我们可以将此行添加到顶点属性的末尾:

property material_index int32

这个整数是文件中包含的材质列表的索引。对于一个新应用程序的作者来说,发明几个要存储在 PLY 文件中的元素可能很吸引人。这种做法应该保持克制。 更好的方法是尝试调整常见元素(顶点、面、边、材质)到新用途,以便其他理解这些的程序elements 可能有助于操作这些元素。

例如,一个将分子描述为球体和柱体集合的应用程序, 为PLY增加包含分子的 球体和圆柱体元素的定义是很诱人的。 但是,如果我们使用顶点和边为此目的的元素(为每个元素添加半径属性),我们可以继续这些旧的程序。 显然不应为三角形和四边形创建特殊元素,而是使用face 元素。


原文链接:原文链接 — BimAnt

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

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

相关文章

【FastColoredTextBox】C# 开源文本编辑控件

主界面截图 使用Demos演示 FastColoredTextBox 是一个用于在 C# 程序中实现高亮语法着色、代码编辑和文本显示的自定义控件。它提供了许多功能&#xff0c;包括&#xff1a; 语法高亮&#xff1a;FastColoredTextBox 支持多种语言的语法高亮&#xff0c;可以根据语法规则将不同…

vite4+vue3+electron23.3+ts桌面应用bs端开发 打包windows、linux、max三个系统的安装包

vite4vue3electron23.3ts桌面应用bs端开发 打包windows、linux、max三个系统的安装包 主要包依赖 "electron-store": "^8.1.0", //全局数据状态管理&#xff0c;可选择性安装"electron": "23.3.8","electron-builder": &q…

网页显示摄像头数据的方法---基于web video server

1. 背景&#xff1a; 在ros系统中有发布摄像头的相关驱动rgb数据&#xff0c;需求端需要将rgb数据可以直接在网页上去显示。 问题解决&#xff1a; web_video_server功能包&#xff0c;相关链接&#xff1a; web_video_server - ROS Wiki 2. 下载&#xff0c;安装和编译&a…

Ubuntu20 ctrl+alt+T无法打开终端

事情是这样的&#xff0c;某天改了下python版本&#xff0c;发现linux默认打开终端的快捷键ctrlaltT寄了&#xff0c;网上给出的都是修改快捷键不出意外肯定没用 但是幸好我们是会分析的&#xff0c;我看到&#xff0c;很多回答说新增一个快捷键运行的命令是gnome-terminal&…

21、stm32使用LTDC驱动LCD

注&#xff1a;本文基于stm32使用FMC驱动SDRAM(IS42S32800G-6BLI)工程继续开发 本例使用安富莱的H743XIH板子驱动LTDC点亮7寸LCD 硬件接线&#xff1a;RGB888 一、cubemx配置 1、LTDC配置 注意此引脚应于上面的硬件接线图一致 2、配置DMA2D 3、背光引脚和触摸引脚 4、时钟…

在 IntelliJ IDEA 中使用 Docker 开发指南

目录 一、IDEA安装Docker插件 二、IDEA连接Docker 1、Docker for Windows 连接 2、SSH 连接 3、Connection successful 连接成功 三、查看Docker面板 四、使用插件生成镜像 一、IDEA安装Docker插件 打开 IntelliJ IDEA&#xff0c;点击菜单栏中的 "File" -&g…

LeetCode 778. Swim in Rising Water【最小瓶颈路;二分+BFS或DFS;计数排序+并查集;最小生成树】2096

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

cs231n assignment 3 Q2 Image Captioning with Vanilla RNNs

文章目录 嫌啰嗦直接看代码Q2 Image Captioning with Vanilla RNNs一个给的工具代码里的bug问题展示问题解决思路解决办法 rnn_step_forward题面解析代码输出 rnn_step_backward题面解析代码输出 rnn_forward题面解析代码输出 rnn_backward题面解析代码输出 word_embedding_for…

使用 BERT 进行文本分类 (02/3)

​ 一、说明 在使用BERT&#xff08;1&#xff09;进行文本分类中&#xff0c;我向您展示了一个BERT如何标记文本的示例。在下面的文章中&#xff0c;让我们更深入地研究是否可以使用 BERT 来预测文本是使用 PyTorch 传达积极还是消极的情绪。首先&#xff0c;我们需要准备数据…

3.1 Qt样式选择器

本期内容 3.1 样式选择器 3.1.1 Universal Selector (通用选择器) 3.1.2 Type Selector (类型选择器) 3.1.3 Property Selector (属性选择器) 3.1.4 Class Selector (类选择器) 3.1.5 ID Selector (ID选择器) 3.1.6 Descendant Selector (后裔选择器) 3.1.7 Chil…

前端跨域的原因以及解决方案(vue),一文让你真正理解跨域

跨域这个问题,可以说是前端的必需了解的,但是多少人是知其然不知所以然呢&#xff1f; 下面我们来梳理一下vue解决跨域的思路。 什么情况会跨域&#xff1f; ​ 跨域的本质就是浏览器基于同源策略的一种安全手段。所谓同源就是必须有以下三个相同点&#xff1a;协议相同、域名…

WinCC V7.5 中的C脚本对话框不可见,将编辑窗口移动到可见区域的具体方法

WinCC V7.5 中的C脚本对话框不可见&#xff0c;将编辑窗口移动到可见区域的具体方法 由于 Windows 系统更新或使用不同的显示器&#xff0c;在配置C动作时&#xff0c;有可能会出现C脚本编辑窗口被移动到不可见区域的现象。 由于该窗口无法被关闭&#xff0c;故无法进行进一步…

KafkaStream:Springboot中集成

1、在kafka-demo中创建配置类 配置kafka参数 package com.heima.kafkademo.config;import lombok.Data; import org.apache.kafka.common.serialization.Serdes; import org.apache.kafka.streams.StreamsConfig; import org.springframework.boot.context.properties.Configu…

8月11日上课内容 nginx的多实例和动静分离

多实例部署 在一台服务器上有多个tomcat的服务。 配置多实例之前&#xff0c;看单个实例是否访问正常。 1.安装好 jdk 2.安装 tomcat cd /opt tar zxvf apache-tomcat-9.0.16.tar.gz mkdir /usr/local/tomcat mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1 cp -a /u…

Linux系统管理:虚拟机ESXi安装

目录 一、理论 1.VMware Workstation 2.VMware vSphere Client 3.ESXi 二、实验 1.ESXi 7安装 一、理论 1.VMware Workstation 它是一款专业的虚拟机软件&#xff0c;可以在一台物理机上运行多个操作系统&#xff0c;支持Windows、Linux等操作系统&#xff0c;可以模拟…

使用selenium如何实现自动登录

回顾使用requests如何实现自动登录一文中&#xff0c;提到好多网站在我们登录过后&#xff0c;在之后的某段时间内访问该网页时&#xff0c;不会给出请登录的提示&#xff0c;时间到期后就会提示请登录&#xff01;这样在使用爬虫访问网页时还要登录&#xff0c;打乱我们的节奏…

item_get_sales-获取商品销量详情

一、接口参数说明&#xff1a; item_get_sales-获取商品销量详情&#xff0c;点击更多API调试&#xff0c;请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_get_sales 名称类型必须描述keyString是调用key&#xff08…

Spring的三种异常处理方式

1.SpringMVC 异常的处理流程 异常分为编译时异常和运行时异常&#xff0c;编译时异常我们 try-cache 进行捕获&#xff0c;捕获后自行处理&#xff0c;而运行时异常是不 可预期的&#xff0c;就需要规范编码来避免&#xff0c;在SpringMVC 中&#xff0c;不管是编译异常还是运行…

java:JDBC

文章目录 什么是JDBCJDBC使用步骤详解各个对象DriverManagerConnectionStatementResultSetPreparedStatement JDBC控制事务操作步骤示例 什么是JDBC 我们知道&#xff0c;数据库有很多种&#xff0c;比如 mysql&#xff0c;Oracle&#xff0c;DB2等等&#xff0c;如果每一种数…

C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】

wpf iconfont 外部图标引入&#xff0c;无法正常显示问题。 1. 检查资源路径和引入格式是否正确2. 检查资源是否包含在程序集中 1. 检查资源路径和引入格式是否正确 正确的格式&#xff0c;注意字体文件 “xxxx.ttf” 应写为 “#xxxx” <TextBlock Text"&#xe7ae;…