스키닝 애니메이션은 3D 캐릭터 모델의 움직임을 자연스럽게 표현하는 기술입니다. 본체의 뼈대와 그 뼈대에 연결된 꼭짓점의 움직임을 조정함으로써, 실제 근육과 피부가 움직이는 것처럼 보이게 구현했습니다.

또한 실시간 렌더링이 가능해야하는 그래픽스 어플리케이션(게임)을 제작하는 것이 목적이어서 GPU 기반 스키닝 방식을 선택하였습니다.

Untitled

이 과정에서 애니메이션 트랙의 가중치를 활용하여, 다양한 애니메이션 트랙들이 동일한 뼈대에 얼마나 영향을 미칠지를 결정하는 기능을 구현하였습니다. 가중치에 따라 변환 행렬을 조정하는 부분은 xmf4x4Transform = Matrix4x4::Add(xmf4x4Transform, Matrix4x4::Scale(xmf4x4TrackTransform, m_pAnimationTracks[curTrack].m_fweight)); 이 부분입니다. 여기서 xmf4x4TrackTransform 즉, 애니메이션 트랙의 변환 행렬을 가중치(m_pAnimationTracks[curTrack].m_fweight)에 따라 조정(scale)하고, 이를 원래의 변환 행렬(xmf4x4Transform)에 더하는 작업을 수행합니다. 이렇게 조정된 변환 행렬은 다시 뼈대 프레임의 부모로의 변환 행렬로 설정됩니다.

Untitled

  1. 스키닝 변환 행렬 계산 : mtxVertexToBoneWorld는 각 꼭짓점에 적용되는 스키닝 변환 행렬입니다. 이 행렬은 꼭짓점이 어떻게 움직일지 결정합니다. 이 행렬은 각 가중치와 연관된 뼈대의 오프셋 변환 행렬과 뼈대의 월드 변환 행렬의 곱셈에 의해 계산됩니다.
  2. 월드 좌표 변환 : 입력 꼭짓점의 위치, 법선, 접선, 비접선은 스키닝 변환 행렬을 통해 월드 좌표계로 변환됩니다.
  3. 투영도 변환 : 월드 좌표계의 위치는 뷰 변환 행렬과 투영 변환 행렬을 통해 화면에 투영되는 3D 좌표로 변환됩니다.
  4. UV 좌표 전달 : 입력 UV 좌표는 그대로 출력으로 전달됩니다.