본문 바로가기
그래픽스ㆍDirectX

[KUOCW] 13. 캐릭터 애니메이션 - 1. 관절체 애니메이션

by imagineer_jinny 2022. 6. 4.

본 내용은 <한정현 컴퓨터그래픽스(13장 -캐릭터 애니메이션)> 강의를 토대로 작성하였습니다.

 

Skeleton

캐릭터를 움직일 때는 기본적으로 골격을 사용함

골격은 뼈로 구성이 된건데 이 뼈들은 개별적으로 움직임

이것을 articulated body, 관절체라고 함

 

이렇게 스켈레톤을 이용해서 캐릭터 애니메이션을 하려면 리깅 작업을 거쳐야 함

 

Rigging

 

폴리곤 매쉬(a)에 스켈레톤을 맞춰 넣는 것(f)

기본적인 폴리곤 매쉬 자세 = default pose = dress pose

 

드레스 포즈로 폴리곤 매쉬가 만들어지면 그 안에 뼈(스켈레톤)를 박아야 하는데 

3dsMax는 바이패드라고 하는, 기본적인 스켈레톤을 제공 

 

 

* 바이패드를 구성하는 뼈의 개수가 많을 수도 있다.

근데 우리가 간단한, 특히 핸드폰에서 실시간 캐릭터 애니메이션을 하려면 뼈의 개수는 적을 수록 좋다.

그래서 몸통에 뼈들을 합치는 (b->c) 에디팅 과정을 거침

 

* 에디팅이 끝나면 스켈레톤 안에다가 집어넣음.

물론 폴리곤 매쉬 키랑 바이패드 키가 다를테니 스케일도 해야하고 여러 작업들 해줘야함

그 다음에 뼈들을 움직여서 예를 들어 팔을 움직여서 맞추고 이런 과정들을 수작업으로 진행해야함

 

* 이후 폴리곤 매쉬의 꼭지점들이 어느 뼈의 움직임에 영향을 받는가 이런 것들을 지정을 해야함

즉, 각각의 정점들이 어느 뼈의 움직임에 영향을 받는지 설정 해줘야 함

왜? 각각의 뼈가 독립적으로 움직이는 관절체이기 때문

디폴트 포즈에 뼈가 맞춰지면 각 뼈마다 행렬이 하나 계산이 됨(나중에 나올 Mip)

 

 

스켈레톤 뼈들은 모두 부모 자식 관계를 가지고 있음

골반(pelvis)가 root

root 연결된 뼈는 spine(척추), 그 다음에 thigh 등등.. 구조

 

 

관절체 운동이 왜 어렵나?

- 각각의 뼈는 독자적으로 움직임

- 한 뼈의 움직임은 그 뼈의 부모, 자식들 등등에게 영향을 미치니까. 손목 하나만 움직였다고 손목만 움직인게 아니라 손목의 부모인 아랫팔, 윗팔 등이 같이 움직인 것

 

 

뼈와 축

뼈들은 독자적으로 움직이기 때문에 자신의 오브젝트 공간을 정의할 수 있음

기본적으로 캐릭터 애니메이션은 뼈와 같은 방향으로 x축을 설정

그럼 뼈(x축)와 직각이 되게 y축이 있을거고 두개 다 직각이 되게 z축이 있음

위팔, 아래팔, 손 각각의 좌표계가 있다

왼쪽 그림에서 vf는 아래팔의 움직임에 의해 따라 움직이는 정점임

이렇게 특정한 뼈에 속한 정점은 그 뼈와 같이 움직여야 함

이걸 달성할 수 있는 가장 직접적인 방안은 정점을 뼈의 오브젝트 공간으로 정의를 하는 것이다.

 

즉, vf를 forearm의 오브젝트 공간으로 옮겨야 관절체 운동이 가능해진다

 

 

캐릭터의 모든 정점은 맨 처음 캐릭터의 오브젝트 공간에서 정의가 되어 있던 것이다.

이게 무슨 말이냐면 위 그림의 사람 모형의 pelvis쪽에 하나의 x, y, z축이 있는 걸 알 수 있는데

이게 이 캐릭터의 오브젝트 공간임. 앞으로 이걸 캐릭터 스페이스라고 하겠음.

마찬가지로 뼈의 오브젝트 공간본 스페이스라고 하겠음.

 

문제는, 관절체 운동을 위해서는 단일한 캐릭터의 오브젝트 공간에서 정의되어있던 정점을 각 뼈의 오브젝트 공간으로 바꿔야 되어야 함!

 

 

목표: 캐릭터 공간에서 정의된 정점을 자기가 속한 뼈 공간으로 바꾸기

 

왼쪽 그림에서 vu, vf, vh 점들은 원래 캐릭터의 폴리곤 매시를 구성하는 정점들이였음.

즉 이게 단일한 캐릭터 스페이스에서 정의가 된 점들.

 

근데 관절체 운동을 위해서는 뭐다?

vu, vf, vh 점들이 각각 upperarm의 bone space, forearm의 bonespace, hand의 bonespace로 옮겨와야 한다는 것

 

 

오른쪽 2차원 그리드 그림을 보면

vu(3,0), vf(2,0), vh(1,0) 얘네가 각각 bone space로 트랜스폼된 좌표

우리 목표는 이런 상황을 만드는 것

각각의 정점은 자기가 속한 뼈 공간으로 변환이 되어야 하니까!

 

 

근데 우리는 거꾸로 하려고 함.

각각의 정점이  bone space에서 정의되어있다고 가정하고 얘를 캐릭터 공간으로 옮기려고 함

왜?

인버스만 취하면 우리 원래 목표를 달성하니까

 

 

To - parent transform (Space Change)

vf(2,0)는 forearm 기준으로는 2,0이지만 upperarm 기준으로는 6,0임.

 

이런 변환을 일단 만들어보자!

그럼 이 6,0 은 자기 부모의 공간으로 간 변환임

 

어떻게 forearm에서 정의된 좌표가 upperarm 공간으로 갈까?

translation 행렬을 만들면 그 행렬이 forearm을 변화시킴

 

이런식으로 예를 들어 hand를 forearm으로, upperarm으로, 부모의 끝, 조상은 pelvis임

즉, 한 뼈에 속한 정점은 자기 조상 어디든 도달할 수 있음. 

어떻게? 뼈와 뼈 사이에 transform을 계속 적용하면 됨

 

이걸 이용해서 Bone Space에서 Character Space로 보내보자

 

일단 중요하게 전제되는 것.

드레스 포즈가 정해지면, 뼈와 뼈 사이에 parent transform은 확정이 된다. 

움직이지 않고 가만히 있으니까 서로 연결이 된 뼈와 뼈 사이에는 고정된 부모 변환이 계산이 됨

 

다시 돌아와서 우리는 모든 본 스페이스마다 정의된 점들을 캐릭터 스페이스로 보낼 것이다.

 

캐릭터 스페이스는 기본적으로 pelvis의 뼈 공간이랑 같음

pelvis의 뼈 공간 = 캐릭터 공간

 

근데 pelvis까지 갈 것도 없이 자기 부모한테만 가면 부모는 캐릭터 스페이스로 가는 길을 알고 있음. 표 참고!

 

 

top-down traversal

근데 우리 목표는 캐릭터 스페이스에서 본 스페이스로 가는거였으니까

저 식에서 역행렬을 해주면 됨

 

* 요약 * 

default pose(dress pose)가 정해지자마자 Mip는 모든 인접한 뼈들 간에 계산이 됨

 

1단계 목표: 캐릭터 스페이스에서 정의된 정점을 각각 자기가 속한 뼈 공간으로 보내는 것

해결: top - down traversal을 통해 계산

 


근데 이거 왜 했다고?

관절체 애니메이션이니까!

 

관절체 애니메이션이 뭐라고?

각 뼈들이 독자적으로 움직이는거

 

뼈들이 독자적으로 움직일 때 각각의 정점은 자기가 속한 뼈 공간으로 가야지 그 뼈가 움직일 때 뼈 공간이 같이 움직이는 거니까 뼈 공간에서 정의된 정점은 같이 또 움직일 것임.

 

 

[KUOCW] 한정현 컴퓨터그래픽스 (13장 - 캐릭터 애니메이션) - YouTube

00:00 ~ 37:40

이렇게 귀한 강의를.. 유튜브에 풀어주셔서 감사하다!!!!!

이거 보고 오픈지엘도 복습해야지.. 

댓글