1) SMPL-X 살펴보기
SMPL-X의 JOINT는 총 55개이다.
blender에 import했을 때 나타나는 hierarchy 구조로 살펴보면 아래와 같고,
smpl-x 파일의 pose parameter 순서에 맞게 joint들을 나열해보면 아래와 같다. 아래의 list를 보면 알 수 있듯이 body joint는 22개, jaw에 해당하는 joint가 1개, eye에 해당하는 joint가 2개, hand에 해당하는 joint가 30개로 총 55개의 joint가 존재한다.
SMPLX_JOINT_LIST =
[ # body joint
'pelvis', 'left_hip', 'right_hip', 'spine1', 'left_knee', 'right_knee', 'spine2', 'left_ankle', 'right_ankle', 'spine3', 'left_foot', 'right_foot', 'neck', 'left_collar', 'right_collar', 'head', 'left_shoulder', 'right_shoulder', 'left_elbow', 'right_elbow', 'left_wrist', 'right_wrist',
# jaw joint
'jaw',
# eye joint
'left_eye_smplhf', 'right_eye_smplhf',
# left hand joint
'left_index1', 'left_index2', 'left_index3', 'left_middle1', 'left_middle2', 'left_middle3', 'left_pinky1', 'left_pinky2', 'left_pinky3', 'left_ring1', 'left_ring2', 'left_ring3', 'left_thumb1', 'left_thumb2', 'left_thumb3',
# right hand joint
'right_index1', 'right_index2', 'right_index3', 'right_middle1', 'right_middle2', 'right_middle3', 'right_pinky1', 'right_pinky2', 'right_pinky3', 'right_ring1', 'right_ring2', 'right_ring3', 'right_thumb1', 'right_thumb2', 'right_thumb3']
2) SMPL-X to SMPL+H
SMPL-X와는 호환이 안되고 SMPL+H만 호환되는 코드를 사용할 일이 생겼다. 이를 위해 내가 가지고 있는 SMPL-X format 파일을 SMPL+H format으로 수정해야했다.
(SMPL-X는 손, 얼굴, 몸의 모션을 전부 표현하는 format이고, SMPL+H는 손과 몸의 모션만 표현하는 format이다.)
skeleton 구조가 어떻게 다른지 살펴보니, SMPL+H는 SMPL-X보다 joint가 3개가 작았다. 정확히는 SMPL-X의 joint에서 jaw joint, left_eye_smplhf, right_eye_smplhf가 빠졌고 나머지는 동일하다.
이 정보를 바탕으로 SMPL-X의 data를 SMPL+H로 변환하는 코드를 아래와 같이 작성해보았다. (파일을 로드하고, 파일을 저장하는 부분은 코드에서 넣지 않았다. SMPL-X 정보를 어떤식으로 수정하면 SMPL+H와 호환되는지만 살펴보면 될 것 같다.)
def smplx2smplh(smplx):
smplh = {
'trans': np.array(smplx['trans']),
'poses': np.zeros((frame_num, 156)),
'betas': np.zeros((16)), # 나의 경우 사용하지 않음
'gender': "female",
'mocap_framerate': 30
}
smplh['poses'][:, :3] = smplx['poses'][:, :3] # pelvis orientation
smplh['poses'][:, 3:3+63] = smplx['poses'][:,3:3+63] # pelvis를 제외 joint orientation
smplh['poses'][:, 66:66+90] = smplx['poses'][:, 75:75+90]
return smplh
smplx 파일에서 face expression과 관련된 정보는 smplh에 넣어주지 않았고(smplh는 face expression을 사용하지 않으므로), smplx 파일의 poses 항목에서 jaw와 eyeball joint와 관련된 내용을 제외하였다. (smplx['poses'][66:75]에 해당되는 내용)
위와 같이 smpl파일을 수정하여 저장하고, smplh만 호환되는 코드에 파일을 로드하였을 때 정상적으로 잘 동작하는 것을 확인할 수 있었다.
'연구 > 컴퓨터 그래픽스' 카테고리의 다른 글
CharacterAnimationTools 사용후기 (1) | 2024.01.30 |
---|---|
Motion-X dataset 관련 내용 정리 (1) | 2023.12.27 |
6D Rotational representation 설명 및 구현 (0) | 2023.08.03 |
blender에서 한 model의 facial motion을 다른 model에 적용하기 (0) | 2023.06.26 |
angular velocity 구하는 방법 (0) | 2023.02.24 |