你特别提到了自主机器人,特别是位置和旋转。所以我假设机器人本身就是应该存储在这里的粒度级别。(只是为了将其与关节机器人区分开来 - 基本上是一个机械手(“手臂”),具有多个可能具有不同角度的旋转或平移关节)
对于这种情况,关于如何将其存储在 glTF (*)中的非常简短的高级描述:
您可以将机器人(或每个机器人)存储为node
glTF 资产之一。每个节点都可以包含一个translation
和rotation
属性(作为 3D 向量和四元数给出)。然后,这些节点将简单地描述机器人的位置和方向。你可以想象机器人被“附加”到这些节点上。(实际上,您可以将 a 附加mesh
到 glTF 中的这些节点,然后它可能是机器人的视觉表示)。
然后,动画数据本身将描述这些属性(平移和旋转)如何随时间变化。可以将这些信息的存储方式想象为一个表格,您可以在其中将平移和旋转与每个时间戳相关联:
time (s) 0.1 0.2 ... 1.0
translation x 1.2 1.3 ... 2.3
translation y 3.4 3.4 ... 4.3
translation z 4.5 4.6 ... 4.9
rotation x 0.12 0.13 ... 0.42
rotation y 0.32 0.43 ... 0.53
rotation z 0.14 0.13 ... 0.34
rotation w 0.53 0.46 ... 0.45
然后,此信息以二进制形式存储,并由所谓的accessor
对象提供。
然后animation
,glTF 资产的 基本建立此二进制动画数据与受其影响的节点中的属性之间的连接: 每个都animation
引用这样的“数据表”,并且node
其属性将被新的翻译填充和旋转值随着时间的推移。
关于插值:
在您的情况下,从模拟中以高速率对输出进行采样,基本上每一帧都是一个“关键帧”,并且不需要存储关于关键帧或插值方案的明确信息。只需声明动画插值应该是该类型LINEAR
或STEP
对于此用例应该足够。
(将其声明为LINEAR
插值的选项主要与播放相关。假设您在 0.15 秒后停止播放:然后它应该显示机器人在时间戳 0.1 处的状态还是在时间戳 0.2 处的状态,或者一个是线性插值的?但是,这主要适用于标准查看器,不一定适用于自定义播放)
(*)附注:在概念层面上,glTF 和 COLLADA 中表示信息的方式是相似的。粗略地说,COLLADA 是一种用于创作应用程序的交换格式,而 glTF 是一种可以高效传输和渲染的传输格式。因此,尽管到目前为止的答案都是关于 glTF,但您也应该考虑 COLLADA,这取决于您的优先级、用例或您提到的“回放”应该如何实现。
免责声明:我也是 glTF 的贡献者。我还创建了glTF 教程部分,展示了一个简单的动画,并解释了 glTF 中的一些动画概念。您可能会发现它们很有用,但它们显然是建立在前面部分中解释的一些概念之上的。