首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有纹理坐标的PLY文件规范

带有纹理坐标的PLY文件规范
EN

Stack Overflow用户
提问于 2015-02-11 23:54:13
回答 2查看 10.9K关注 0票数 5

出于某种目的,我需要读取带有嵌入纹理的PLY文件(Stanford Triangle格式)。我看到了几个PLY文件的规范,但没有找到指定纹理映射语法的单一来源。似乎有太多的库可以读取PLY文件,但它们中的大多数似乎不支持纹理(它们只是崩溃了;我尝试了其中的2-3个)。以下是带有纹理的ply文件的标题:

代码语言:javascript
运行
复制
ply
format binary_little_endian 1.0
comment TextureFile Parameterization.png
element vertex 50383               
property float x
property float y
property float z
property float nx
property float ny
property float nz
element face 99994               
property list uint8 int32 vertex_index
property list uint8 float texcoord
end_header

我不明白的是property list uint8 float texcoord这一行。此外,对应于面孔的列表是

代码语言:javascript
运行
复制
3 1247 1257 1279 6 0.09163 0.565323 0.109197 0.565733 0.10888 0.602539 6 9 0.992157 0.992157 0.992157 0.992157 0.992157 0.992157 0.992157 0.992157 0.992157`. 

这个列表是什么?格式是什么?虽然我理解PLY让你有机会为元素定义你自己的属性,但处理纹理似乎是相当标准的,相当多的应用程序(如流行的Meshlab)似乎使用上述语法打开带纹理的PLY文件。

我想知道读取带纹理的PLY文件所遵循的标准语法,如果可能的话,还想知道这些信息的来源。

EN

回答 2

Stack Overflow用户

发布于 2015-03-27 11:20:25

在PLY文件中,faces通常包含值列表,这些列表的大小可能会有所不同。如果它是一个三角形的面,则需要三个值,一个四边形=4,以此类推,直到任意n边形。列表在如下所示的行中声明:

代码语言:javascript
运行
复制
property list uint8 int32 vertex_index

这是一个名为'vertex_index‘的列表。它将始终由一个大小为N的8位无符号整数(即uint8)组成,后跟N个32位整数(即int32)。

在示例行中,这一点立即显示出来:

代码语言:javascript
运行
复制
3 1247 1257 1279

这意味着,这里有3个值,然后它给出了这3个值。

现在第二个列表是纹理坐标应该在的位置:

代码语言:javascript
运行
复制
property list uint8 float texcoord

它就像第一个列表一样,大小在前(作为无符号字节),但这一次它后面将是一系列32位浮点数而不是整数(对于纹理坐标来说是有意义的)。简单的解释是,vertex_index中列出的每个顶点都有一个纹理坐标。如果我们假设这些只是2d纹理坐标(一个非常安全的假设),我们应该会看到数字6后面跟着6个浮点值……我们做到了:

代码语言:javascript
运行
复制
6 0.09163 0.565323 0.109197 0.565733 0.10888 0.602539

这些是与已列出的三个顶点相对应的纹理坐标。

现在,对于一张脸来说,应该就是这样。我不知道剩下的线上有什么东西。根据你的标题,文件的其余部分应该是二进制的,所以我不知道你是如何得到它作为一行ascii文本的,但该行上的额外数据不应该在那里(也根据标题,它完全定义了一张脸)。

票数 6
EN

Stack Overflow用户

发布于 2020-09-12 17:51:12

让我在@OllieBrown的回复中补充一下,任何遇到这种情况的人都可以进一步了解,上面的格式使用了每个面的纹理坐标,也称为楔形UV。这意味着,如果要共享顶点,则共享顶点(基本上是在多个相邻三角形中使用的顶点索引)可能会基于其所参与的三角形而具有不同的UV。当顶点位于UV接缝上或UV与纹理边界相交时,通常会发生这种情况。通常,这意味着复制顶点,因为GPU需要每个顶点的属性。因此,共享顶点最终为在空间中重叠的X顶点(其中X是共享它们的三角形的数量),但根据它们所参与的三角形具有不同的UV。将这样的数据保存在磁盘上的一个优点是,由于这是一种文本格式,它减少了所需的文本量,从而减少了磁盘大小。OBJ也有这一点,尽管它保留了一个平面UV数组,并使用索引到该数组中,而不管它是逐顶点UV还是每面UV。

我也不知道6 9 <9*0.992157>部分是什么(虽然9部分看起来像3个vector3s,对于所有3个轴都有相同的值),但是Paul Bourke的代码here对setup_other_props函数有这样的描述:

代码语言:javascript
运行
复制
/******************************************************************************
Make ready for "other" properties of an element-- those properties that
the user has not explicitly asked for, but that are to be stashed away
in a special structure to be carried along with the element's other
information.

Entry:
  plyfile - file identifier
  elem    - element for which we want to save away other properties
******************************************************************************/

void setup_other_props(PlyFile *plyfile, PlyElement *elem)

据我所知,可以在每个元素中保留不属于头部的数据。这些数据应该被保留和存储,但并不是为了在每个应用程序中使用而解释。Bourke对格式的描述谈到了与旧软件的向后兼容性,所以这可能是一个只有一些应用程序才能理解的自定义格式的情况,但额外的信息不应该阻碍不需要它们的旧应用程序理解和/或呈现内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28458673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档