如何从 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
- 输入 == 存取器 2
- 访问器 2 == 缓冲区视图 2
- bufferView 2 == 来自缓冲区 1 的字节 (0-100)
- 缓冲区 1 == animation.bin
你解码过头了。尽管 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" 函数:
(免责声明,我是这个扩展的作者之一,虽然我没有自己编写这个解码功能)。
规范将 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
- 输入 == 存取器 2
- 访问器 2 == 缓冲区视图 2
- bufferView 2 == 来自缓冲区 1 的字节 (0-100)
- 缓冲区 1 == animation.bin
你解码过头了。尽管 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" 函数:
(免责声明,我是这个扩展的作者之一,虽然我没有自己编写这个解码功能)。