smpl_core/conversions/
pose_remap.rs

1use super::pose_chunked::PoseChunked;
2use crate::common::{
3    metadata::{smpl_metadata, SmplMetadata},
4    pose::PoseG,
5    types::SmplType,
6};
7use burn::prelude::Backend;
8/// Will remap the pose from a certain model to another one. For example from
9/// smplh to smplx. This is because different models have different number of
10/// joints for each part.
11#[allow(dead_code)]
12pub struct PoseRemap {
13    origin: SmplType,
14    origin_metadata: SmplMetadata,
15    destination: SmplType,
16    dest_metadata: SmplMetadata,
17}
18impl PoseRemap {
19    pub fn new(origin: SmplType, destination: SmplType) -> Self {
20        let origin_metadata = smpl_metadata(&origin);
21        let dest_metadata = smpl_metadata(&destination);
22        Self {
23            origin,
24            origin_metadata,
25            destination,
26            dest_metadata,
27        }
28    }
29    pub fn remap<B: Backend>(&self, pose: &PoseG<B>) -> PoseG<B> {
30        let origin_chunked = PoseChunked::new(pose, &self.origin_metadata);
31        let mut new_pose = origin_chunked.to_pose(&self.dest_metadata, self.destination);
32        new_pose.retargeted = pose.retargeted;
33        new_pose
34    }
35}