镜像动作捕捉角色动画(骨骼.bvh)



我正在尝试镜像CMU运动捕捉数据集(.bvh格式) 沿着 World-YZ 平面与 Python 代码。

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

我通过否定 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

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

感谢您的帮助!

答案很简单...

温度 = mirrored_rotations

我习惯用 C# 编码,并认为和处理临时不会改变

mirrored_rotations中的值...

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

也许这有点矫枉过正,但我最近遇到了这个问题,即使使用上述方法,对我来说解决也并非易事。对于其他正在研究这个问题的人来说,一个很棒的动作捕捉库可以做到这一点是 PyMo。

在这个库中,你可以镜像到一个特定的轴(在本例中是X)上,以及做其他有趣的事情:

from pymo.parsers import BVHParser
from pymo.writers import BVHWriter
from pymo.preprocessing import *
p = BVHParser()
dat = []
for f in bvh_files:
data_all.append(p.parse(f))
data_pipe = Pipeline([
('dwnsampl', DownSampler(tgt_fps=fps,  keep_all=False)),
('root', RootTransformer('hip_centric')),
('mir', Mirror(axis='X', append=False)),      # <-- the relevant line
('jtsel', JointSelector(['Spine','Spine1','Spine2','Spine3','Neck','Neck1','Head','RightShoulder', 'RightArm', 'RightForeArm', 'RightHand', 'LeftShoulder', 'LeftArm', 'LeftForeArm', 'LeftHand'], include_root=True)),
('exp', MocapParameterizer('expmap')),
('cnst', ConstantsRemover()),
('np', Numpyfier())
])
out_data = data_pipe.fit_transform(data_all)

# and then to write your transformed files out: 
inv_data = data_pipeline.inverse_transform(out_data)
writer = BVHWriter()
for i in range(0, out_data.shape[0]):
with open(bvh_files[i], "w") as f:
writer.write(inv_data[i], f, framerate=fps)

请注意,库经常更改,但即使它更改了裸骨以对bvh数据进行许多有用的转换,也存在并且非常可靠。

最新更新