如何从 gltf 解析 animations.samplers.input

How to parse animations.samplers.input from gltf

规范将 animations.samplers.input 属性 解释为:

The index of an accessor containing keyframe input values, e.g., time. That accessor must have componentType FLOAT. The values represent time in seconds with time[0] >= 0.0, and strictly increasing values, i.e., time[n + 1] > time[n].

但是,我从演示库的第一个基本示例中理解这一点有点困难,Animated Triangle

具体来说,如果我们从 animation.bin 中获取动画的相关二进制数据并将其解码为 Float32Array,我们将得到以下值列表:

[0, 0.25, 0.5, 0.75, 1, 0, 0, 0, 1, 0, 0, 0.7070000171661377, 0.7070000171661377, 0, 0, 1, 0, 0, 0, 0.7070000171661377, -0.7070000171661377, 0, 0, 0, 1]

根据 "strictly increasing values" 这当然没有意义。

我在这里误解了什么?如何使用这些值(与 output 结合)以随时间更新旋转?

请注意,animation.bin 是从 input 采样器引用的视图。也就是说,从the gltf

你解码过头了。尽管 bufferView 2 是字节 0 到 100,访问器 2 并不调用所有这些字节。这是访问者 2:

{
  "bufferView" : 2,
  "byteOffset" : 0,
  "componentType" : 5126,
  "count" : 5,
  "type" : "SCALAR",
  "max" : [ 1.0 ],
  "min" : [ 0.0 ]
},

请注意其中的 count: 5。计数定义为:

The number of attributes referenced by this accessor, not to be confused with the number of bytes or number of components.

因此,访问器 2 是 bufferView 2 中偏移量 0 的前五个 SCALAR 值,即上面解码输出的前五个数字:

[0, 0.25, 0.5, 0.75, 1]

FWIW,有一些工具可以帮助调查 glTF 二进制文件。这是来自 VSCode 的 glTF 扩展的 "Peek Definition" 函数:

(免责声明,我是这个扩展的作者之一,虽然我没有自己编写这个解码功能)。