1

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

包含关键帧输入值(例如时间)的访问器的索引。该访问器必须具有组件类型 FLOAT。这些值以秒为单位表示时间,time[0] >= 0.0,并且值严格递增,即 time[n + 1] > time[n]。

但是,从演示仓库的第一个基本示例动画三角形中,我很难理解这一点

具体来说,如果我们从animation.bin中获取动画的相关二进制数据并将其解码为 a 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]

鉴于“严格增加值”,这当然没有意义。

我在这里有什么误解?output为了随着时间的推移更新轮换,这些值是如何使用(与 结合)的?

请注意,animation.bin 是从input采样器引用的视图。换句话说,从gltf

  • 输入 == 访问器 2
  • 访问器 2 == 缓冲区视图 2
  • bufferView 2 == 来自缓冲区 1 的字节(0-100)
  • 缓冲区 1 == 动画.bin
4

1 回答 1

2

你解码得太远了。尽管 bufferView 2 是字节 0 到 100,但访问器 2 不会调用所有这些字节。这是访问器2:

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

注意count: 5里面的。计数定义为:

此访问器引用的属性数,不要与字节数或组件数混淆。

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

[0, 0.25, 0.5, 0.75, 1]

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

解码访问器

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

于 2018-03-23T01:26:49.763 回答