Spaces:
Paused
Paused
| import numpy as np | |
| from scipy.spatial.transform import Rotation as R | |
| from vid2rig.motion import MotionClip | |
| from vid2rig.retarget.resample import resample | |
| def _clip(fps, rots, transl): | |
| F, J = rots.shape[0], rots.shape[1] | |
| return MotionClip(fps=fps, num_frames=F, source="smpl", | |
| joint_names=[f"j{i}" for i in range(J)], local_rotations=rots, | |
| root_translation=transl, root_rotation=rots[:, 0], | |
| rest_offsets=np.zeros((J, 3)), parents=[-1] + list(range(J - 1)), source_height_m=1.7) | |
| def test_resample_doubles_frames_and_midpoint(): | |
| q0 = R.from_rotvec([0, 0, 0.0]).as_quat(); q1 = R.from_rotvec([0, 0, np.pi / 2]).as_quat() | |
| rots = np.stack([q0, q1])[:, None, :] # [2,1,4] | |
| transl = np.array([[0, 0, 0.0], [2, 0, 0]]) | |
| out = resample(_clip(30.0, rots, transl), 60.0) | |
| assert out.num_frames == 3 and out.fps == 60.0 | |
| assert np.allclose(out.root_translation[1], [1, 0, 0], atol=1e-6) # lerp midpoint | |
| mid = R.from_quat(out.local_rotations[1, 0]).as_rotvec() | |
| assert np.allclose(np.abs(mid), [0, 0, np.pi / 4], atol=1e-6) # slerp midpoint | |
| assert np.allclose(out.local_rotations[:, 0], out.root_rotation) | |