我从事自主机器人工作。我经常会模拟一个没有可视化的机器人,将位置和旋转数据以约30 fps的速度导出到文件中,然后在以后播放该文件。目前,我将动画数据保存在自定义格式的JSON文件中,并使用three.js进行动画处理。
我想知道是否有更好的方法来导出此数据?
我不太熟悉动画,但是我怀疑我可以将其导出为COLLADA或glTF之类的东西,并获得使用许多系统已经设置要导入的格式的好处。
我有几个问题(一些具体的和一般的):
通常如何以这些格式导出动画?似乎它们中的大多数与骨骼或变形有关,但是这两个概念似乎都不适用于我的情况。(我能否获得一般动画概念概述的指针?)
我真的不需要关键帧。在没有插值的情况下将关键帧设为30至60 fps是否合理?
是否有任何标准动画格式将数据保存为不采用某种插值形式的格式?
我想念什么吗?我确信我对这一领域的知识不足掩盖了动画师显而易见的东西。
您特别提到了自主机器人,尤其是位置和旋转。因此,我假设机器人本身就是应该存储在此处的粒度级别。(只是将其与多关节机器人区分开来-基本上是带有多个旋转或平移关节的机械手(“手臂”),这些关节可能具有不同的角度)
对于这种情况,一个很了解这项可以存储在glTF短,高层次的描述(*) :
您会将机器人(或每个机器人)存储为node
glTF资产之一。每个节点都可以包含translation
和rotation
属性(作为3D向量和四元数给出)。然后,这些节点将仅描述您的机器人的位置和方向。您可以想象机器人被“附加”到这些节点上。(实际上,您可以mesh
在glTF中将a附加到这些节点,然后可以是机械手的视觉表示)。
动画数据本身将成为有关这些属性(平移和旋转)如何随时间变化的描述。可以将这种信息的存储方式想象为一个表格,您可以在其中将平移和旋转与每个时间戳相关联:
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中动画的一些概念。您可能会发现它们很有用,但是它们显然是建立在前面几节中介绍的一些概念的基础上的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句