Graphics/DirectX

Direct X - 애니메이션 기법

MOLOKINI 2014. 9. 3. 19:56

애니메이션 기법

지금까지 3D 표현에 있어서 많은걸 공부했다.
이제는 캐릭터에 영혼을 불어넣는 캐릭터 표현을 다루어볼 차례다.
캐릭터 표현 기술은 모든 3D 기술중에서 가장 고난이도의 기술을 요구하며, 
무엇보다도 3D 이론에 대한 정확한 이해가 필! 쑤! 적인 요소이다.


캐릭터 애니메이션
캐릭터를 표현하는 방법은 결국 애니메이션 기법과 밀접하게 연관되어 있다.
우리는 예술가가 아니기 때문에, 예술적, 미적 관점은 약간(쵸큼)줄이고..
요런 메시들의 집합을 어떤 애니메이션 방식과 결합시킬것이냐에 따라서 캐릭터의 표현방식과 한계가 정해지게 된다.

캐릭터 애니메이션 방식 (대략적 다섯개만)
1. 정점 애니메이션
2. 계층적 애니메이션
3. 뼈대 애니메이션
4. 스키닝
5. 역기구학



이제, 이것들에 대해 알아보자


정점 애니메이션
최초의 애니메이션 기술은 정점 애니메이션 방식이었다.
이 방식은 일종의 몰핑(morphing)으로, 이 방식을 사용한 게임의 예로는 퀘이크 시리즈가 있다.
또한, 이 방식은 각 정점의 애니메이션 된 위치를 매 프레임마다 저장하고있다가 이것을 선형보간 또는 그외의 보간에 의해 출력하는것으로 원리와 구성 자체가 간단하기 때문에 구현하기가 매우 쉬우며, 자동으로 스키닝이 된다는 장점이 있다. 하지만 데이터량이 너무많다ㅠㅠ,
구현자체가 간단하다는 장점덕분에 아직도 많이 사용되는 방식이다.
기본적으로 Morphing기법으로 구현되기 때문에, 키프레임 방식으로는 도저히 표현이 불가능한 것도 표현이 가능하다
- 예를들면, 터미네이터에서 T-1000을 표현하는데에는 정점애니메이션 말고는 없다고 봐도 과언이 아니다


계층적 애니메이션
인간을 비롯한 대부분의 관절을 가진 오브젝트는 계층 구조로 구성되어 있다.
인간의 경우 허리를 뿌리노드로 해서 상체와 하체가 붙어있고, 상체에 목, 어깨 가슴 등이 붙어있는 구조다
즉, 캐릭터를 여러개의 메시로 나누어 각 메시를 부모-자식 관계로 상속시키고, 메시마다 이동, 축소, 회전을 포함한 매트릭스를 매 프레임 또는 변화되는 프레임마다 저장하여 사용하는 것으로... 해본적이있지요?

M은 행렬, V는 정점
Mtransform = Mlocal * Manimation * Mparent
Vword = Vlocal * Mtransform

철권 1, 2가 이런 방식의 애니메이션 기법이었다.
관절과 관절사이가 자연스럽지 못하다는 단점이 있으나 이런 한계점은 뼈대 애니메이션과 스키닝 기법으로 극복됐다.
현존하는 3D애니메이션 캐릭터 표현시에 가장 밑바닥에 깔린 기술적 토대가 바로 계층적 애니메이션이다.


뼈대 애니메이션
뼈대 애니메이션은 계층적 애니메이션 방식을 좀 더 범용적으로 발전시킨것으로, 인간의 몸속에 뼈가 있듯이 3차원적으로 구성된 뼈대를 만들고, 이 뼈대에 메시를 자식으로 붙이는 방식이다.

기본적인 뼈대가 있는데, 이 뼈대들은 메시가 아니기 때문에 렌더링되지 않는다.
애니메이션 연산식은 동일하다.

Mbone_transform = Mbone_local * Mbone_animation * Mbone_parent
Vworld = Vlocal * Mmesh_local * Mbone_transform

이 방식 역시 관절과 관절사이를 봉합하지 못하는 단점이 여전히 있으나, 동일한 뼈대 구조를 가진 오브젝트는 메시만 바꿔치기하는것으로 똑같은 애니메이션이 가능하기 때문에 메모리의 절약과 함께 다양한 응용이 가능하다.


스키닝
스키닝이란 계층적 애니메이션과 뼈대 애니메이션방식의 단점인 관절부위의 문제를 해결하기위한 방식을 말한다.
스키닝을 구현하는 방법은 매우 다양하지만, 주로 뼈대의 가중치 기법이 가장 많이 사용된다. 메시를 구성하는 각각의 정점이 뼈대로부터 얼마만큼의 힘을 받는가 하는 가중치값을 포함하고 있는 것이다.

연산식은 아래와 같다

Vworld = Vlocal * M0 * W0 + Vlocal * M1 * W1 + Vlocal * M2 * W2 + Vlocal * M3 * W3
(단, W3 = 1.0 - (W0 + W1 + W2)이며, Vlocal은 정점의 지역좌표, M[index(n)]은 정점에 영향을 미치는 뼈대의 애니메이션 행렬이다.)

이 수식은 정점에 영향을 미치는 뼈대가 4개밖에 없다고 가정한 경우다. 더 많아질 경우, 같은 방식으로 수식을 확장시키면 된다.

구현 방법 역시 다양하다.

첫째, 직접적으로 루프를 돌면서 정점, 가중치, 행렬을 연산하는 방법이 있다. 이론에 입각한 가장 정석적인 방법이지만 하드웨어 가속을 전혀 지원받지 못한다. 하지만 어떤 시스템이라도 확실하게 작동한다는건 보장할 수 있다.

둘째, Direct3D 8.0부터 지원하는 매트릭스 팔레트를 사용하는 것이다.
가중치를 사용하는 정점을 생성하고, 256개의 매트릭스 팔레트에 적절하게 애니메이션 매트릭스를 입력한 뒤 메시를 그리기만하면 가중치 연산을 가속기가 해준다.
- 이 방식은 일부 그래픽 카드가 지원하지 못한다.

연산식은 아래와 같다
Vworld = Vlocal * M[index0] * W0 + Vlocal * M[index1] * W1 + 
             Vlocal * M[index2] * W2 + Vlocal * M[index3] * W3

셋째, 정점 셰이더를 사용하는 것이다.
DX 8.x까지만 해도 어셈블리 방식으로 되어있어서, 개발하는데 상당한 불편을 겪었지만, DX 9.0에서는 고급 셰이딩 언어를 사용할 수 잇어서 한결 개발이 편리해졌다.
최종 목표는 그래픽카드의 GPU에 프로그램을 작성해서 넣는것이다, 복잡한 가중치 연산을 정점셰이더를 사용해서 GPU의 가속기능을 이용하는 것이므로, 사용자의 GPU가 정점셰이더 가속을 지원하기만 하면 상당한 가속효과를 볼 수 있다.
그러나, 뼈대의 개수에 따라서 셰이더를 따로 작성해야하고, 프로그램 가능한 크기도 대단히 제한적이다


역기구학
역기구학은 최근들어 중요시되는 분야인데...
넝마인형등을 사용한 자연스러운 캐릭터 애니메이션 표현을 위해 기계공학이나 물리학에서 사용하는 역학이론을 채용한 것이다.
Inverse Kinematics, Dynamics 라고도 하는데 이것 하나만으로도 책이 몇권씩이나 나올 정도로 방대한 양이다.
나중에... 공부해볼게요~ (사실 잘 모르겠어요ㅌㅌ)


'Graphics > DirectX' 카테고리의 다른 글

Direct X - 계층구조  (0) 2014.09.16
Direct X - 스크립트와 XML파서  (0) 2014.09.05
Direct X - 균열 방지  (0) 2014.08.27
Direct X - LOD (Level Of Detail)  (2) 2014.08.21
Direct X - 쿼드트리 컬링  (0) 2014.08.16