首页 > 解决方案 > 镜像 Mocap 角色动画(骨骼 .bvh)

问题描述

我正在尝试使用 python 代码沿 world-yz 平面镜像 CMU 动作捕捉数据集(.bvh 格式)。

我已经解析了它们并将欧拉角表示转换为四元数表示。

我通过否定 y 和 z 分量找到了镜像的一些答案。qx qy qz qw -> qx -qy -qz qw

但是,这似乎不适用于骨骼动画的所有关节。

我检查了上面的镜像是否适用于 unity3d 引擎中的单个对象旋转。

我用于镜像的步骤与以下相同, 1. 交换左关节局部旋转和右关节局部旋转 2. 对所有关节旋转取反 qy 和 qz 3. 取根轨迹的 x

def mirror_sequence(sequence):
    mirrored_rotations = sequence[:, 1:, :]
    mirrored_trajectory = np.expand_dims(sequence[:, 0, :], axis=1)

    temp = mirrored_rotations

    # Flip left/right joints
    mirrored_rotations[:, joints_left] = temp[:, joints_right]
    mirrored_rotations[:, joints_right] = temp[:, joints_left]

    mirrored_rotations[:, :, [1, 2]] *= -1  
    mirrored_trajectory[:, :, 0] *= -1

    mirrored_sequence = np.concatenate((mirrored_trajectory, mirrored_rotations), axis=1)

    return mirrored_sequence

我的目标是制作一个动画,其骨盆轨迹沿 world-yz 平面镜像,左/右关节动画交换。

谢谢您的帮助!

标签: pythonanimationquaternions

解决方案


答案很简单……

temp = mirrored_rotations

我曾经用 C# 编写代码,并认为和处理 temp 不会改变

mirrored_rotations 中的值...

temp = mirrored_rotations.copy() 效果很好。


推荐阅读