스키닝 애니메이션(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 값도 똑같이 계산해 줘야 한다.
댓글 없음:
댓글 쓰기