응애맘마조
스키닝 애니메이션 본문
주의 : 해당 게시물에서 작성될 내용은 과제를 해결하기 위해 출처의 내용을 그대로 작성한 부분이 많으며 일절 광고나 수익 창출 목적으로 쓰인 것이 아님을 밝힙니다.
스키닝은 피부를 붙이는 작업이며 Mesh를 애니메이션 할 때 접합부위를 자연스럽게 이어 붙이기 위한 기술입니다. 3D는 2D와 다르게 Mesh에서 관절과 관절 사이가 끊김 현상이 발생할 수 있는데 이를 막는 방법 스키닝이라고 합니다. '단일 Mesh + 가중치 사용'의 방법이 가장 이상적인 형태로 A의 애니메이션 행렬 Ma와 B의 애니메이션 행렬 Mb가 각각 가중치 Wa와 Wb값에 의해 결합되어 최종값을 만드는 것을 알 수 있습니다.
먼저 스키닝은 스킨을 이루는 단일 Mesh와 뼈대(bone)로 이루어진 구조를 갖고 있습니다. 이 뼈대는 캐릭터 애니메이션을 위한 계층 구조를 제공하는데 이 뼈대가 움직일 때 스킨 Mesh가 따라 움직이면서 자연스럽고 신축성 있는 움직임을 보여주게 됩니다.
그럼 스키닝 애니메이션 구현에 필요한 것들을 설명하겠습니다.
먼저 Assimp를 사용하여 정점 데이터를 불러와야 합니다. 이 데이터를 불러오면 Assimp에서는 노드로 나누어져 있고 각 노드에 해당하는 Mesh가 있습니다. 해당 Mesh에 접근해서 정점 데이터를 수정할 때 Mesh에서 오프셋 행렬과 가중치 값을 가지고 있는 뼈대 정보에 접근할 수 있습니다.
여기서 오프셋 행렬은 뼈대의 로컬 좌표계로 이동시켜 주는 행렬로 기존의 월드 공간에 있는 정점들을 뼈대 공간으로 이동시킵니다. 실제로 Mesh 스키닝을 하지 않고 불러오게 되면 T자로 서 있게 되는 모습을 하게 됩니다.
이 상태에서 오프셋 행렬을 하게 되면 뼈대 공간으로 이동하는 데 원점으로 이동하게 됩니다.
결국 뼈대마다 영향을 주는 정점이 있고 해당 정점에 가중치만큼 행렬을 곱해줘야 하기 때문에 뼈대의 정보를 저장할 필요가 있습니다.
스키닝은 소프트웨어, 하드웨어 스키닝의 2가지 방법이 있습니다.
소프트웨어 스키닝은 각 정점의 위치를 CPU를 사용해서 계산 결과를 임시 Mesh에 저장하고 렌더 합니다. 간단하고 직관적이지만 하드웨어 스키닝보다 속도가 느리다는 단점이 있습니다.
하드웨어 스키닝은 정점의 위치 계산을 GPU에게 맡깁니다. 그림자나 피킹 등의 작업이 가능하지만 소프트웨어 스키닝보다 많은 시간과 노력이 필요하고 정점에 영향을 미치는 뼈의 수, 1개의 Mesh에 있는 캐릭터가 가질 수 있는 뼈의 수에 제한이 있지만 속도는 빠른 장점이 있습니다.
나머지는 강의를 듣고 따로 정리하겠습니다.
읽어주셔서 감사합니다.
'공부 > 3D과제' 카테고리의 다른 글
obj 파일 로드하기 (0) | 2023.06.26 |
---|---|
노멀 매핑, 탄젠트 스페이스 (0) | 2023.06.23 |
Assimp 로드 (0) | 2023.06.21 |
SIMD (0) | 2023.06.19 |
맵 안에서 캐릭터 움직이기2 (0) | 2023.06.15 |