XPD 文件规格

 
 
 

概述

XGen 使用 XPD 文件进行按基本体的数据烘焙。此格式专门用于数以千计(如果不是数百个)基本体需要存储值的情况。该格式会为空间节省带来压力,但可提高读取性能。尽管写入文件的速度很慢,但性能肯定调整为最佳的读取性能。

设计

XPD 文件分成四个主要部分:标头、面、块和基本体。标头包含描述文件内容的数据。它的布局方式如下所示:

magic
4 个字节 - 写入常量 XPD3 来标识文件类型(和主要版本)。
fileVersion
无符号字符 - 标头数据的版本,用以允许向后兼容性(如果将附加数据添加到标头)。可以将其视为次要版本号 (3.x)。
primType
枚举 - 文件中基本体的类型。有效值包括 Point、Spline、Card、Sphere、Archive 或 CustomPT。该枚举经过定义以便有足够的空间来添加新值(如有必要)。
primVersion
无符号字符 - 文件中每个基本体包含的数据的版本。此版本可供读取器使用,以便在较旧 XPD 文件中进行读取并正确展开数据。这样便可在以后进行修改时无需使所有 XPD 文件失效。
time
浮点型 - 写入数据时的帧编号或当前时间。
numCVs
无符号整数 - 每个基本体的 CV 数。这意味着并强制所有基本体都具有相同数量的 CV。
coordSpace
枚举 - 文件中各点的坐标空间。有效值包括 World、Object、Local、Micro 和 CustomCS。对象空间是 XGen 的默认空间。局部空间是指基本体的空间,表示曲面坐标帧空间。如果这些值相对于坐标帧放置在基本体的每个 CV 处,则使用微空间。该枚举经过定义,有足够的空间用来添加新值(如有必要)。
numBlocks
无符号整数 - 每个面的命名数据块数。
blockSize
无符号整数 - 所有块名的总字符数(包括每个块的字符串末尾字符)。
blockNames
字符 * - 块的名称。名称排序还定义每个面中的数据排序。
primSize
无符号整数 - 表示每个块中单个基本体大小的值形成的数组。这意味着并强制每个基本体都必须为恒定大小。
numKeys
无符号整数 - 文件中存储的关键帧数。由于所有存储的数据的类型为浮点型,因此要保存的所有字符串数据(如 CV 属性名称)都必须使用此关键帧机制保存。系统将关键帧存储在标头中,然后将关键帧的索引保存在数据中。
keySize
无符号整数 - 所有关键帧名的总字符数(包括每个关键帧的字符串末尾字符)。
keyNames
字符 * - 关键帧的名称。名称排序还为应在任何引用中使用的每个关键帧定义索引。
numFaces
无符号整数 - 文件中包含的面数。并不是全部都有数据。
faceid
整数 - 文件中每个面的 faceid 形成的数组。此数组的顺序也是文件中面的顺序。
numPrims
无符号整数 - 包含每个面中基本体数的数组。值通过索引与 faceid 数组匹配。
blockPosition
无符号长整数 - 每个面中每个块的跳跃表。此表包含面中块起点的绝对偏移,可用于直接跳转到块及其第一个基本体。

数据布局

紧随在标头之后的是基本体数据。数据按面顺序分布(正如标头所定义)。在每个面中,数据按块顺序分布(正如标头所定义)。每个块必须按正确的顺序显示在每个面中。基本体放置在块中。基本体本身只是一个浮点型向量。写入器提供该向量,它知道数据的顺序以及如何将其展开。读取器一次读取一个基本体,然后使用基本体版本了解如何展开数据。每个面或每个块没有标头。实际上,在文件标头后,文件是恒定的基本体数据流。

读取文件时,您必须找到所需的面和块,然后按顺序读取基本体。读取所需的所有基本体后,可以查找下一个块并读取与前一个块匹配的基本体数据。块结构允许应用程序(如 Paint3d)从一个块(例如,Location)中导出 XGen 所需的数据,然后将所需的数据导出到其自己的块(例如,PointCloud)中。然后,XGen 可以只读取所需的数据,轻松地跳过其他数据。此外,两个应用程序都可以拥有各自的数据格式,不必彼此进行协商。

附件

有几个程序可用来帮助使用 XPD 文件。其中一个是 xpd2txt。该程序会将 XPD 文件中的二进制数据转化为易于读取的文本格式。它还可用于将数据转换为随后可由生产脚本进行解析和使用的格式(例如,将数据转换为 Inventor 格式,或将其读入到 Maya 中)。另一个程序是 xpdcmp,它可以比较两个 XPD 文件以验证它们是否相同。该程序会比较文件的内容,其中包含面数、块数、关键帧数、基本体数等,但是不比较实际的基本体值。因此,它可用于验证文件彼此是否“兼容”,但不能用来查看文件是否完全相同。

示例

以 XGen 源代码的形式提供了两个示例,演示如何读取和写入保存“点”(Point)类型的基本体的 XPD 文件。这种文件也称为 XUV 文件。通常,此类型的文件在 Paint3d 中创建,用于驱动基本体位置(例如,使用 PointGenerator)或束位置(即,通过成束 FX 模块)。在 wxuv.cpprxuv.cpp 中可找到相关示例。

另一种特殊类型的 XPD 文件是针对 Paint3d 消耗的曲线/导向文件。这是一种较轻的文件,包含每个基本体的 ID、U、V 和 CV,但不包含 Paint3d 不需要的其他任何 XGen 烘焙信息。这种较轻的格式允许 Paint3d 使用无需担心对 XGen 的烘焙格式进行更改即可加载的格式。通过检查块并查找一个称为“Paint3d”的块可以检测到此格式。