File size: 1,817 Bytes
ec9a6bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import numpy as np
import torch
import trimesh

import AnimatableGaussians.config as config


def _initialize_hands(self):
    smplx_lhand_to_mano_rhand_data = np.load(config.PROJ_DIR + '/smpl_files/mano/smplx_lhand_to_mano_rhand.npz', allow_pickle = True)
    smplx_rhand_to_mano_rhand_data = np.load(config.PROJ_DIR + '/smpl_files/mano/smplx_rhand_to_mano_rhand.npz', allow_pickle = True)
    smpl_lhand_vert_id = np.copy(smplx_lhand_to_mano_rhand_data['smpl_vert_id_to_mano'])
    smpl_rhand_vert_id = np.copy(smplx_rhand_to_mano_rhand_data['smpl_vert_id_to_mano'])
    self.smpl_lhand_vert_id = torch.from_numpy(smpl_lhand_vert_id)
    self.smpl_rhand_vert_id = torch.from_numpy(smpl_rhand_vert_id)
    self.smpl_hands_vert_id = torch.cat([self.smpl_lhand_vert_id, self.smpl_rhand_vert_id], 0)
    mano_face_closed = np.loadtxt(config.PROJ_DIR + '/smpl_files/mano/mano_face_close.txt').astype(np.int64)
    self.mano_face_closed = torch.from_numpy(mano_face_closed)
    self.mano_face_closed_turned = self.mano_face_closed[:, [2, 1, 0]]
    self.mano_face_closed_2hand = torch.cat([self.mano_face_closed[:, [2, 1, 0]], self.mano_face_closed + self.smpl_lhand_vert_id.shape[0]], 0)


def generate_two_manos(self, smplx_verts: torch.Tensor):
    left_mano_v = smplx_verts[self.smpl_lhand_vert_id].cpu().numpy()
    left_mano_trimesh = trimesh.Trimesh(left_mano_v, self.mano_face_closed_turned, process = False)
    left_mano_n = left_mano_trimesh.vertex_normals.astype(np.float32)

    right_mano_v = smplx_verts[self.smpl_rhand_vert_id].cpu().numpy()
    right_mano_trimesh = trimesh.Trimesh(right_mano_v, self.mano_face_closed, process = False)
    right_mano_n = right_mano_trimesh.vertex_normals.astype(np.float32)

    return left_mano_v, left_mano_n, right_mano_v, right_mano_n