3

我在自主机器人领域工作。我经常会在没有可视化的情况下模拟机器人,将位置和旋转数据以大约 30 fps 的速度导出到文件中,然后稍后再播放该文件。目前,我将动画数据保存在自定义格式的 JSON 文件中,并使用 three.js 制作动画。

我想知道是否有更好的方法来导出这些数据?

我不精通动画,但我怀疑我可以导出到 COLLADA 或 glTF 之类的东西,并获得使用许多系统已经设置为导入的格式的好处。

我有几个问题(一些具体和一些一般性):

  1. 动画通常如何以这些格式导出?似乎它们中的大多数都与骨架或变形有关,但是这两个概念似乎都不适用于我的情况。(我能得到一个指向一般动画概念概述的指针吗?)

  2. 我真的不需要关键帧。在不需要插值的情况下将关键帧设置为 30 到 60 fps 是否合理?

  3. 是否有任何标准动画格式以不采用某种插值形式的格式保存数据?

  4. 我错过了什么吗?我确信我在该领域的知识缺乏隐藏了一些对动画师来说显而易见的东西。

4

2 回答 2

2

您描述的动画类型通常称为“烘焙”动画,其中一些计算已被采样,可能以 30 ~ 60 fps 的速度进行,关键帧以高采样率保存。对于这样的动画,通常应用线性插值。例如,在 Blender 中,有一种方法可以运行 Blender 游戏引擎并将物理模拟记录到(密集)关键帧。

至于插值,这里有一个思想实验:考虑一下基于多边形的渲染引擎想要渲染一个圆,但必须只使用直线。围绕圆的边缘计算一些有限数量的点,并用数十或数百条小线段填充点之间的间隙。有足够的密度,或者相机足够远,它看起来是圆形的,但线段确保在可能的圆形中没有泄漏或间隙。相同的概念(在时间上而不是在空间上)适用于烘焙的关键帧。样本密度很高,并且直线(线性插值)填补了空白。如果您以超慢动作播放它,您可能能够在到达新的关键帧时检测到速度的细微变化。但在正常速度下,它看起来很正常,并且帧率没有'

我建议在此处阅读有关 glTF 2.0 动画的部分(免责声明,我是 glTF 贡献者和工作组成员)。特别是,请查看使用线性插值的基于节点的动画的描述。

对于机器人技术,您需要避开皮肤和基于骨骼的动画。无论如何,这些东西并不总是与基于节点的动画兼容(我们最近遇到了问题)。基于节点的动画更适用于具有关节关节等的非变形机器人。

于 2017-12-14T14:57:11.797 回答
2

你特别提到了自主机器人,特别是位置和旋转。所以我假设机器人本身就是应该存储在这里的粒度级别。(只是为了将其与关节机器人区分开来 - 基本上是一个机械手(“手臂”),具有多个可能具有不同角度的旋转或平移关节)

对于这种情况,关于如何将其存储在 glTF (*)中的非常简短的高级描述:

您可以将机器人(或每个机器人)存储为nodeglTF 资产之一。每个节点都可以包含一个translationrotation属性(作为 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其属性将被新的翻译填充和旋转值随着时间的推移。

关于插值:

在您的情况下,从模拟中以高速率对输出进行采样,基本上每一帧都是一个“关键帧”,并且不需要存储关于关键帧或插值方案的明确信息。只需声明动画插值应该是该类型LINEARSTEP对于此用例应该足够。

(将其声明为LINEAR插值的选项主要与播放相关。假设您在 0.15 秒后停止播放:然后它应该显示机器人在时间戳 0.1 处的状态还是在时间戳 0.2 处的状态,或者一个是线性插值的?但是,这主要适用于标准查看器,不一定适用于自定义播放)


(*)附注:在概念层面上,glTF 和 COLLADA 中表示信息的方式是相似的。粗略地说,COLLADA 是一种用于创作应用程序的交换格式,而 glTF 是一种可以高效传输和渲染的传输格式。因此,尽管到目前为止的答案都是关于 glTF,但您也应该考虑 COLLADA,这取决于您的优先级、用例或您提到的“回放”应该如何实现。

免责声明:我也是 glTF 的贡献者。我还创建了glTF 教程部分,展示了一个简单的动画,并解释了 glTF 中的一些动画概念。您可能会发现它们很有用,但它们显然是建立在前面部分中解释的一些概念之上的。

于 2017-12-15T23:57:36.773 回答