首页 > 解决方案 > 如何将 3D 姿势序列转换为 bvh 文件格式?

问题描述

我对动画和渲染软件非常陌生,所以如果我需要提供更多信息,请告诉我。我有一系列人体关节的 3D 位置(基本上是动作捕捉数据),代表不同类型的行走。正如我在这个视频中展示的那样,我已经设法使用 python 可视化序列。我拥有的每个数据都是一个大小为 TxJx3 的 numpy 数组,其中 T 是帧数,J 是关节数(在我的例子中是 21 个),3 代表 3 个坐标值。所以我的问题是,如何将这些 3D 位置转换为 BVH 文件,然后将其加载到搅拌机中?或者将它们转换为任何其他格式,以便我可以在搅拌机中加载这些数据?

标签: numpyblendermo-cap

解决方案


好的,自己找到了解决方案。在这里发帖以防其他人发现这很有用。请原谅没有 LaTeX 渲染,显然,堆栈溢出不支持它(还),而且我在这里太新了,无法附加图像。

因此,在 BVH 格式中,关节之间存在以下关系:

$$pos_j = R_{P(j)}offset_j + pos_{P(j)}$$

其中 $pos_j$ 表示关节 $j$ 的 3D 位置,$P(j)$ 在任何DAG中返回关节 $j$ 的父节点(通常 DAG 从根开始并指向末端 -效应器)$offset_j$ 表示关节 $j$ 相对于其父节点 $P(j)$(也称为连接肢体)的偏移量,$R_{P(j)}$ 是确定应该 $ 多少的 3D 旋转offset_j$ 从初始位姿(通常是 T 位姿)旋转。在 BVH 格式中,对于每个父 $P(j)$,我们需要存储 $R_{P(j)}^{-1}R_j$。

当时我遇到的主要问题是处理有多个孩子的关节,例如根关节,它与双腿和脊柱都有连接。我最终遇到了这个 repo并挖掘了他们forward_kinematics内部的功能skeleton.py,意识到该怎么做。基本上,对于有多个孩子的关节,我必须使用 $offset=0$ 制作副本,并将它们分配为相应链的父级。因此,我制作了 3 个根的副本:一个成为左腿链的父级,一个成为右腿链的父级,一个成为脊柱的父级。对于其他有多个孩子的父母也是如此。是的,可视化效果很好!


推荐阅读