跳到主要内容

第 4 章:META 区段

规范状态: Draft
Directory Tag: META
作用范围: 全局区段,chunkId 必须为 -1
必须性: 必须存在且仅存在一次
允许 Codec: RAW8

META 定义资产的基础解释信息:逻辑网格尺寸、Chunk 尺寸、坐标约定、体素统计、资产锚点与当前权威 Source Hash。读取器必须先成功解析 META,才能安全解释 CHIXVOX0


4.1 作用

META 是资产级元数据,不保存任一具体体素的颜色或存在性。它回答的是“这个资产以什么空间、尺寸和分块规则被解释”;VOX0 回答的才是“每个位置有什么体素”。

META 必须用于:

  • 限定资产逻辑网格的最大坐标范围;
  • 确定所有 Chunk 的标准尺寸;
  • 声明 VFP 固定的右手坐标语义;
  • 提供非空体素总数和 Chunk 数量等快速统计;
  • 保存由权威数据计算得到的 Source Hash;
  • 提供资产根锚点,供默认展示和实例放置使用。

META 不得保存会覆盖 PAL0CHIXVOX0 内容的冗余真值。若 META 的统计信息与权威区段不一致,文件无效;不得以 META 中的统计数反向修正体素数据。

4.2 Binary Layout

4.2.1 META Payload

VFP 1.3 的 META Payload 固定为 128 字节,Directory Entry 必须使用 codec = RAW8rawLength = 128length = 128

OffsetSizeTypeFieldDescription
02uint16metaVersionMETA 版本;必须为 1
22uint16metaSizePayload 固定长度;必须为 128
44uint32metaFlags元数据标志;VFP 1.3 必须为 0
81uint8coordinateSystem坐标系;必须为 1(右手系,+Y 上,+Z 前)
91uint8voxelUnit体素单位;必须为 1(一个网格单位)
101uint8chunkSizeX标准 Chunk 的 X 尺寸
111uint8chunkSizeY标准 Chunk 的 Y 尺寸
121uint8chunkSizeZ标准 Chunk 的 Z 尺寸
131uint8reserved0必须为 0
142uint16reserved1必须为 0
161uint8gridSizeX逻辑网格 X 尺寸,范围 1..255
171uint8gridSizeY逻辑网格 Y 尺寸,范围 1..255
181uint8gridSizeZ逻辑网格 Z 尺寸,范围 1..255
191uint8reserved2必须为 0
204uint32voxelCount全资产非空体素总数
244uint32chunkCountCHIX 中的 Chunk 数量
284uint32paletteEntryCountPAL0 中非空颜色条目数量
324float32anchorX资产根锚点 X
364float32anchorY资产根锚点 Y
404float32anchorZ资产根锚点 Z
444float32pivotX默认旋转中心 X
484float32pivotY默认旋转中心 Y
524float32pivotZ默认旋转中心 Z
564uint32sourceRevision权威内容修订号;首次编译为 1
604uint32reserved3必须为 0
6432uint8[32]sourceHash当前权威数据的 SHA-256 Source Hash
9616uint8[16]generatorUuid生成器或创作会话 UUID;全零表示未指定
11216uint8[16]reserved4必须为全零

4.2.2 结构定义

META_V1 = struct.Struct("<HHIBBBBBBHBBBBIIIffffffII32s16s16s")
assert META_V1.size == 128

实现应以字段级读取方式处理该结构,不得依赖语言默认结构体对齐。

4.3 字段定义

4.3.1 空间与尺寸字段

coordinateSystem = 1 固定表示右手坐标系:+X 向右、+Y 向上、+Z 向前。voxelUnit = 1 固定表示一个体素边长为一个逻辑单位。

gridSizeX/Y/Z 定义全资产有效体素坐标范围:

0 <= x < gridSizeX
0 <= y < gridSizeY
0 <= z < gridSizeZ

chunkSizeX/Y/Z 定义规则 Chunk 的标称尺寸。边缘 Chunk 可以小于该尺寸,但不得大于它。VFP 1.3 推荐使用 16, 16, 16;写入器可以使用其他 1..255 的尺寸,前提是 CHIXVOX0 与所有缓存保持一致。

4.3.2 统计字段

voxelCount 必须等于所有 VOX0 解码后非零 Palette Index 的总数。chunkCount 必须等于 CHIX 的 Entry 数量。paletteEntryCount 必须等于 PAL0 中索引 1..255 范围内已定义且可引用的颜色条目数量。

这些字段用于快速查询和预分配,不取代完整验证。读取器可在普通加载时延迟验证统计值,但验证器必须重新计算并比较。

4.3.3 锚点与枢轴

anchorX/Y/Z 是资产在外部场景或资源系统中放置时的推荐根锚点。pivotX/Y/Z 是默认旋转中心。二者均以资产局部网格坐标表示,可为小数和负数,但必须是有限 float32

它们仅影响默认放置和表现,不改变任一体素坐标。缺少专门展示信息时,读取器可使用它们;SCNE 存在时,SCNE 的展示变换优先。

4.3.4 修订与身份字段

sourceRevision 是单调递增的逻辑修订号。当权威数据发生变化时,写入器必须至少将它增加 1,并重新计算 sourceHash。仅改变缓存、Directory 排列、文件 UUID 或填充字节时不得增加该值。

generatorUuid 可用于识别生成器、创作会话或资产管线来源,不是安全凭证,也不参与 Source Hash。

4.4 验证规则

合规验证器必须检查:

  1. Directory Entry 为全局 METAchunkId = -1codec = RAW8,且 length = rawLength = 128
  2. metaVersion = 1metaSize = 128metaFlags = 0
  3. 所有保留字段均为 0
  4. coordinateSystem = 1voxelUnit = 1
  5. gridSizeX/Y/ZchunkSizeX/Y/Z 均在 1..255 范围内;
  6. chunkSize 不得大于对应 gridSize
  7. voxelCount 不得超过 gridSizeX × gridSizeY × gridSizeZ
  8. anchorpivot 全部为有限 float32
  9. chunkCountpaletteEntryCount 分别与 CHIXPAL0 的实际内容一致;
  10. voxelCount 与所有 VOX0 的实际非空体素数一致;
  11. sourceHash 与第 16 章规定的规范化权威输入重新计算结果一致。

任一验证失败均属于权威数据错误,读取器必须拒绝资产。


本章总结

META 为整个资产提供稳定的空间、尺寸、统计和 Source Hash 基础。它不直接存储体素,但决定了 PAL0CHIXVOX0 应如何被安全解释。