"""Unified interface for converting motion features to joint positions.""" import numpy as np from visualization.HumanML3D263.recovery import recover_joint_positions as recover_joint_positions_263 from visualization.HumanML3D263.recovery import StreamJointRecovery as StreamJointRecovery263 from visualization.MotionStreamer272.recovery import recover_joint_positions as recover_joint_positions_272 from visualization.MotionStreamer272.recovery import StreamJointRecovery as StreamJointRecovery272 from visualization.MEI138.recovery import recover_joint_positions as recover_joint_positions_138 from visualization.MEI138.recovery import StreamJointRecovery as StreamJointRecovery138 def get_stream_joint_recovery(dim: int, **kwargs): """Create a StreamJointRecovery instance for the given feature dimension. Args: dim: feature dimension (263 or 138) **kwargs: passed to the constructor (joints_num, smoothing_alpha, ...) Returns: StreamJointRecovery instance """ if dim == 263: return StreamJointRecovery263(**kwargs) elif dim == 138: return StreamJointRecovery138(**kwargs) elif dim == 272: return StreamJointRecovery272(**kwargs) else: raise ValueError(f"No StreamJointRecovery for dim={dim}. Supported: [263, 138, 272]") def convert_motion_to_joints( motion_data: np.ndarray, dim: int, mean: np.ndarray = None, std: np.ndarray = None, ): """Convert motion features to 22-joint positions. Args: motion_data: (K, dim) motion features. dim: feature dimension (263, 272, or 138). mean, std: normalization statistics (optional). Returns: joints: (K, 22, 3) joint positions. """ if mean is not None and std is not None: motion_data = motion_data * std + mean if dim == 263: return recover_joint_positions_263(motion_data) elif dim == 272: return recover_joint_positions_272(motion_data) elif dim == 138: return recover_joint_positions_138(motion_data) else: raise ValueError(f"Unsupported motion data dimension: {dim}. Supported: [263, 272, 138]")