2017년 11월 8일 수요일

Skinning Animation

스키닝 애니메이션(Skinning Animation)

내가 요새 제일 관심있는 분야는 3D 엔진을 만들어 보는 것이다.
그중에서 제일 해보고 싶은 것이 애니메이션 구조를 만드는 것이다.

캐릭터를 띄우고 그것을 움직이게 하는 일을 해야 하는데 그 개념에 대해 이곳에서 정리해 보기로 한다.

DirectX SDK (June 2010) 의 Sample Browser 를 보면 Skinned Mesh라는 예제가 있는데 여기에 있는 내용을 분석해 보겠다.

스키닝의 기본적인 개념을 설명하자면 연결점을 가진 Mesh들은 특별한 설정이 없을 시 애니메이션을 설정하면 각 연결점은 떨어져 있게 되있다. 그 떨어져 있는 부분의 어색함을 없애기 위해 스키닝이라는 개념이 나오게 되었다.

스키닝을 처리하는 방법은 Software 방식과 Hardware 방식으로 나눌 수 있는데 software 방식은 CPU에서 처리하고 Hardware 방식은 GPU처리를 할 수 있다.
GPU처리는 Vertex Shader 를 통해 처리하기때문에 Software 방식보다 빠른 처리가 된다.

스키닝 애니메이션에서 중요한 개념
1. 하나의 vertex는 4개까지의 가중치를 가진다. 이말은 하나의 vertex에 영향을 주는 bone 행렬이 4개까지 가능하다는 이야기다.
2. 본 행렬을 각 버텍스마다 가지고 있는것이 아니라 매트릭스 팔레트라는 곳에 행렬 정보를 가지고 있고 영향을 주는 본 행렬에 인덱스를 가지고 매트릭스 팔레트에 접근하여 사용할 수 있다.
3. vertex가 본 행렬에 의해 영향을 받기 때문에 월드에 있는 vertex를 본의 Local 영역으로 이동시켜서 계산해야 된다.
그러므로 Vworld = Vlocal * TM(본의 월드 행렬) -> Vlocal = Vworld * InvTM(본의 월드의 역행렬)을 곱해서 Bone의 Local 영역으로 이동시킨 후 Vworld(본에 로컬에서 월드로) = Vlocal * LocalTM(본의 로컬 행렬) * AniTM(애니메이션 시키는 행렬) * ParentTM(부모 본의 행렬) 로 애니메이션을 시켜야 한다.
여기서 계산해야 되는 것은 vertex 뿐만 아니라 해당 vertex에 있는 normal 값도 똑같이 계산해 줘야 한다.

댓글 없음:

댓글 쓰기