고급컴퓨터그래픽스 8. Animating Human
건국대학교 고급컴퓨터그래픽스 김형석 교수님의 수업을 정리한 내용입니다.
H-Aim
사람은 팔의 길이나 몸통의 길이 등의 디테일만 다를 뿐 구조는 모두 동일하다. 따라서 사람을 구조화하는 최적의 Standard Hierarchical가 정의되어 있고, 이를 H-Aim라고 한다.
- Joint : 관절
- Link : 관절의 연결, Bone라고 하기도 함.
- Skelecton : Joint와 Bone의 집합.
- Rigging : Mesh만 존재하던 Model에 Joint와 Bone을 설정해서 Skelecton 구조를 삽입하는 과정.
- Skinning : Skelecton의 움직임에 따라 Mesh가 따라 움직이도록 연결하는 과정.
Virtual Human
사람의 애니메이션을 상체, 하체, 얼굴로 구분한다. 그저 움직이는것, 다른 물체와 상호작용 하는 등의 애니메이션을 적용할 수 있어야 한다. Virtual Human은 Body와 Behavior를 가지고, 실시간으로 Animating이 가능해야 한다.
Upper Body Motion
크게 다음 동작이 존재한다.
- Reaching (팔을 뻗기)
- Grasping (물체를 잡기)
- Facial (표정 변화)
Reaching
FK로 직접 제어하기는 힘들다. IK로 물체의 위치를 손목쯤에 위치시키면 자연스럽다. 하지만 IK가 가지는 한계점이 존재한다.
- 완전 자연스러운 동작이 나오지는 않음.
- 팔을 뻗거나 굽히는데 장애물을 고려하지 않음.
- 어깨 관절의 회전 범위를 벗어나는 등의 물리적인 제약을 고려하지 않음.
- Jerkiness 문제가 발생 가능. (갑작스럽게 튀는 모션)
- 계산량이 많음.
따라서 다음과 같은 Solution을 적용한다.
- IK로 계산한 경로의 Data를 Smooting하여 Noise (Jerkiness)를 제거한다.
- Linear로 움직이는 경로를 Spline으로 보간하여 자연스럽게 움직이게 한다.
- 관절의 가동 범위 제약 조건을 넣는다. 이후 전체 모션을 최적화 문제로 처리한다.
- Collider 등을 추가하여 물리 연산을 계산한다. (충돌시 팔이 물체를 통과하지 않도록)
- AI로 모션을 만든다.
- FK와 IK를 혼합해서 사용한다. (어깨는 FK로, 손 움직임은 IK로)
Shoulder Movement
어깨는 3 DOF (3차원 자유도)를 가지고 있다. 이는 X, Y, Z축 모든 방향으로 회전을 할 수 있는 Joint를 의미한다.
Grasping
손으로 어떤 물체를 잡기 위해선 다음과 같은 순서로 모션이 일어난다.
- 손을 편다. (Pre-Grasp)
- 손이 물체를 향해 이동한다. (Approach)
- 손가락으로 물체를 잡는다. (Grasp)
- 물체를 잡고 있는다. (Hold)
- 손가락, 손바닥의 압력을 풀어 물체를 놓는다. (Release)
Grasping은 다음과 같은 Type이 있다.
- 정밀한 그립 : 손가락 끝으로 작은 물체를 잡는다.
(연필 쥐기)
- 힘 그립 : 손가락과 손바닥 모두를 사용하여 물건을 강하게 잡는다.
(망치 쥐기)
- 훅 그립 : 손가락 관절만으로 물체를 움직인다.
(손잡이를 잡고 돌리기)
- 팜 그립 : 손바닥 전체로 물체를 잡는다.
(공을 잡기)
구현은 다음과 같은 방법이 있다.
- FK : 손가락 관절의 회전 각도를 일일히 설정.
- 계산이 간단하다.
- 다양한 상황을 커버하기 어렵다.
- IK : 손가락 끝의 목표 위치를 설정함.
- 손이 물체와 정확하게 접촉한다.
- 계산 비용이 높고, IK 특유의 문제를 위해 추가적인 처리가 필요하다.
- 데이터 기반 딥러닝 학습
- 가장 현실적인 동작이 구현된다.
- 학습 데이터가 많이 필요하다.
- 물리 기반 시뮬레이션
- 여러 물체와 자연스러운 상호작용이 가능하다.
- 구현이 어렵고, 계산 비용이 높다.
Lower Body Motion
하체는 걷거나 뛰는 동작이 존재한다.
Walking & Running
걸을때 움직이는 부위는 크게 골반, 무릎, 발목과 발가락이 움직인다.
- Pelvis(골반)
- 옆에서 볼 땐 올라갔다 내려갔다를 반복한다.
- 위에서 볼 땐, 한쪽이 앞으로 가면 반대쪽은 살짝 뒤로 가고, 반대쪽이 앞으로 가면 다른쪽은 뒤로 가는 씰룩임을 반복한다.
- 뒤에서 볼 땐, 한쪽이 올라갔다 다른쪽이 올라갔다를 반복한다.
- Knee(무릎)
- 다리가 앞으로 이동하면 무릎이 굽어지고, 땅에 닿으면 점점 펴진다.
- Ankle-Toe(발목)
- 90도였다가 둔각이었다가를 반복한다.
위 부위들이 하나의 싸이클을 이루고, 싸이클이 Loop되며 걷기 애니메이션, 뛰기 애니메이션을 만든다.
- Pelvis는 빠르게 걸을 수록 움직임의 폭이 좁아진다.
- Hip은 빠르게 걸을수록 앞으로 더 나간다.
- Knee는 빠를수록 덜 굽혀진다.
- Ankle-Toe는 비슷하다.
위 특성을 고려하여 걷기 속도에 따라 움직임 진폭을 맟주면 된다.
Facial Animation
얼굴 움직임은 Bone과 Joint로 구성되지 않은다. 오로지 46개의 근육이 움직이면서 다양한 표정을 만들어낸다. 다음과 같은 것들을 고려하여 자연스러운 얼굴 움직임을 만들어낸다.
- Blend Shapes
- 여러개의 사전 정의된 표정을 혼합하여 다양한 표정 바리에이션을 만들어낸다.
- Lip-sync
- 소리를 분석하여 Phoneme(음소), Viseme(가시적 음소)를 기반으로 입모양을 맞춘다.
- Involuntray Motions
- 무의식적 움직임(눈꺼풀 깜빡임, 눈동자 움직임, 시선 이동) 등을 자연스럽게 처리한다.