본문 바로가기
공부/컴퓨터 그래픽스

OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문 Chapter 13 캐릭터 애니메이션

by bokob 2024. 7. 19.

13.1 캐릭터 골격과 공간 이전

실시간 캐릭터 애니메이션을 위해서는 대체로 캐릭터의 골격(skeleton)을 이용한다.

캐릭터의 골격은 뼈(bone)로 구성된 관절체(articulated body)이다.

13.1.1 골격(Skeleton)

(a) 캐릭터의 기본 자세를 드레스 포즈(dress pose)라 한다. 참고) 'default pose' 가 공식적인 이름이고, 드레스 포즈는 국내에서 많이 부른다.

(b) 3ds Max에서 제공하는 바이페드(biped)라는 기본 골격이다. 참고) 3ds Max에서만 제공

(c) 이는 편집가능하다. $\to$ 사진을 보면, 골격은 바이페드의 척추 뼈 네 개를 하나로 합쳤다.

(d) 골격은 폴리곤 메시로 옮겨진다.

(e) 캐릭터의 드레스 포즈에 맞게 수작업으로 맞춰진다. 각 정점은 근처의 뼈에 할당되고 뼈가 움직일 때 정점도 그에 따라 움직인다.

 

13.1.2 뼈와 공간 이전

골격을 구성하는 뼈들은 계층적으로 부모-자식(parent-child) 관계를 형성한다.

교재에서 사용하는 캐릭터의 골격 계층 구조

캐릭터 애니메이션에서는 관례적으로 골반(pelvis)을 루트 노드로 정한다.

 

관절체 애니메이션 특징

  • 각 뼈에는 일반적으로 회전으로 제한되는 자체 로컬(독자적인) 모션이 있다.
  • 로컬 동작은 거의 항상 동시에 이루어진다.
  • 뼈의 움직임은 모든 자손에 영향을 미친다.

뼈 사이의 공간 이전

뼈는 관절로 연결되어 있고, 뼈의 관절을 원점으로 하여 뼈별로 오브젝트 공간을 정의할 수 있다.

위 사진에서 $v_u$, $v_f$, $v_h$는 각각 위팔(상완), 아래팔(전완), 손에 속한다.

한 뼈가 움직이면, 그 뼈에 속한 정점도 움직인다.

예를 들어, 아래팔이 움직이면 $v_f$도 따라 움직여야 하는데 이를 위해서 $v_f$를 오브젝트 공간에 정의해야 한다.

 

캐릭터 메시의 모든 정점이 정의되어 있는 공간을 캐릭터의 오브젝트 공간이라고 하는데, 뼈의 오브젝트 공간과 혼동하지 않기 위해 캐릭터 공간이라 부르자.

드레스 포즈에 골격이 맞춰지면, 캐릭터 공간의 각 정점은 자신이 속한 뼈의 오브젝트공간으로 변환되어야 하는데, 캐릭터의 오브젝트 공간과 혼동하지 않기 위해 뼈 공간이라 부르자.

 

드레스 포즈 메시의 모든 캐릭터 공간 정점은 뼈 공간으로 변환되어야 한다. 왜냐하면 그 뼈의 로컬 모션에 의해 움직이기 때문이다. 예를 들어, 위 사진에서 $v_f$는 원래 캐릭터 공간에서 정의되었지만, 아래팔의 뼈 공간으로 변환되어 $\left(2,0 \right)$의 좌표를 가진다.

캐릭터 공간에서 뼈 공간으로의 변환을 위해 거꾸로 뼈 공간에서 캐릭터 공간으로의 변환을 계산할 것이다. 역(inverse)를 취하면 바로 얻을 수 있기 때문이다.

 

드레스 포즈에 골격이 맞춰지면, 부모와 자식 뼈 사이의 상대적인 위치와 방향이 결정된다.

한 뼈에 속한 정점을 그 부모의 뼈 공간으로 변환하는 것을 부모 변환(to-parent transform)이라 부른다.

위에서 설명한 아래팔에서 아래팔의 부모인 위팔로의 변환을 $M_{f,p}$로 표기한다. (f는 forearm을 p는 parent를 의미)

아래팔에서 위팔로의 공간 이전을(space change)의미하는 $M_{f,p}$는 위팔 좌표계를 아래팔 좌표계에 포개는 행렬과 같다. (뷰 변환과 비슷)

 

골격을 구성하는 각 뼈는 고유한 길이를 가지며, 자신의 뼈 공간의 $x$축을 따라 놓이는 것이 관례다.

아래팔 뼈 공간 -> 위팔 뼈 공간 변환
손 뼈 공간 -> 아래팔 뼈 공간 -> 위팔 뼈 공간

 

한 뼈의 정점이 주어졌을 때, 부모 변환 행렬을 계속 결합하면 골격 계층 구조의 어떤 조상이든지 그것의 뼈 공간으로 정점을 변환할 수 있다.

 

13.1.3 캐릭터 공간에서 뼈 공간으로의 변환

$i$번째 뼈에서의 부모 변환은 $M_{i,p}$로 표기

드레스 포즈의 골격이 주어지면, 각 뼈 공간에서 캐릭터 공간으로의 변환을 결정할 수 있다. 이를 $M_{i, d}$로 표기한다.

여기서 $i$는 뼈 번호, $d$는 드레스 포즈를 의미한다.

골반은 루트 노드이므로, 골반 공간은 캐릭터 공간과 동일하다고 간주하자. 따라서 $M_{i,d}$는 단위 행렬($I$)이다.

부모 변환

 

특정 뼈 공간에서 캐릭터 공간으로의 변환은 다음과 같이 일반화 된다.

 

$M_{i,d} = M_{i-1,d}M_{i,p}$

 

관절체 애니메이션에서 필요한 것은 역변환인 $M_{i,d}^{-1}$이다.

 

$M_{i,d}^{-1} = M_{i,p}^{-1}M_{i-1,d}^{-1}$

 

드레스 포즈 골격이 주어지면, 각 뼈의 부모 변환 행렬 $M_{i,p}$가 즉시 결정된다. 이는 $M_{i,p}^{-1}$이 즉시 결정된다.

$M_{i,p}^{-1}$ 계산을 위해서는 $M_{i-1,d}^{-1}$만 있으면 된다. $M_{i-1,d}^{-1}$을 위해 $M_{i-2,d}^{-1}$이 필요하다.

이런 식으로 골격 계층을 거슬러 올라가 보면 궁극적으로 필요한 것은 루트 노드인 골반의 $M_{1,d}^{-1}$임을 알 수 있다.

$M_{1,d}^{-1}$은 단위 행렬이므로, $M_{1,d}^{-1}$부터 시작해서 골격 계층 구조를 따라 'top-down traveral'로 모든 뼈의 $M_{i,d}^{-1}$을 구할 수 있다.

 

최종 애니메이션 포즈는 GPU 파이프라인을 통해 렌더링된다. 이를 위해 애니메이션의 포즈의 모든 정점은 파이프라인을 따라 월드 공간, 카메라 공간 등으로 추가로 변환될 수 있도록 캐릭터 공간으로 다시 변환되어야 한다.

 

13.2 정기구학(Forward Kinematics)

정기구학, (좌) 드레스 포즈 (우) 애니메이션 포즈

 

위 사진 좌측에서 $v_5$는 원래 캐릭터 공간에 정의되었지만, $M_{5,d}^{-1}$에 의해 변환되어 아래팔 공간에서 (2, 0)의 좌표를 가지게 되었다.

각 정점은 자신이 속한 뼈에 의해 움직이는데, 위 사진의 우측에서는 아래팔이 회전함에 따라 $v_5$도 회전했다.

애니메이션이 완료된 정점을 렌더링에 사용하기 위해서는 이를 다시 캐릭터 공간으로 변환해야 한다.

따라서 위 전체 사진에서 (1) $v_5$에 애니메이션을 적용하고, (2) 결과를 캐릭터 공간으로 옮기는 변환이 필요하다.

이를 $M_{5,a}$라 표기하자. 여기서 a는 animation을 의미한다.

 

위 사진 우측에서 아래팔은 $90^{\circ}$ 회전했다. 이는 아래팔의 뼈 공간의 원점인 팔꿈치(local joint에 해당)를 중심으로 한 회전이다. 이러한 지역적인(local) 특성을 반영하여 이를 지역 변환(local transform)이라 부르자.

아래팔의 지역 변환은 $M_{5,l}$로 표기한다(5는 아래팔의 고유 변호, l은 local 의미)

$v_5$와 $v_5'$를 비교하면, 아래팔과 그 뼈 공간은 하나로 묶여 있으므로, 아래팔이 회전해도 $v_5$는 아래팔 공간에서 (2, 0)이라는 좌표를 그대로 유지한다. 반면, $v_5'$는 '회전되기 전의' 아래팔 공간을 기준으로 하는 좌표이다.

그런데, '회전되기 전의' 아래팔과 위팔 사이의 관계는 $M_{5,p} \left( M_{f,p} \right)$에 의해 정의되었다.

따라서 $v_5'$는 $M_{5,p}$에 의해 위팔 공간으로 변환된다.

 

관절체 애니메이션에서 모든 뼈는 회전 가능하다. 즉, 아래팔뿐 아니라 위팔도 회전할 수 있다.

(1) 위팔에 속한 정점에 애니메이션을 적용하고, (2) 그 결과를 캐릭터 공간으로 옮기는 변환을 $M_{4,a}$라 표기하자.

그러면 $M_{4,a}$와 $M_{5,p}M_{5,l}$을 결합해서 $M_{5,a}$를 정의할 수 있다.

즉 $M_{5,p}M_{5,l}$에 의해 아래팔 공간에서 위팔 공간으로 옮겨진 다음, $M_{4,a}$에 의해 캐릭터 공간으로 변환되는 것

골격의 계층 구조를 생각해보면, 다음과 같이 일반화 될 수 있다.

 

애니메이터가 캐릭터의 애니메이션 포즈를 만들면, 각 뼈의 $M_{i,l}$은 확정된다.

만약 20개의 뼈를 가진 캐릭터라면, 20개의 $M_{i,l}$이 결정된다.

드레스 포즈로부터 $M_{i,p}$도 확정된다. 따라서 $M_{i,a}$ 계산을 위해서는 $M_{i-1,a}$만 있으면 된다.

그런데 $M_{i-1,a}$ 계산을 위해서는 $M_{i-2,a}$가 필요하다.

이런 식으로 골격 계층을 거슬러 올라가 보면 궁극적으로 필요한 것은 루트 노드인 골반의 $M_{1,a}$이다.

$M_{1,a}$는 (1) 골반에 속한 정점에 애니메이션을 적용하고, (2) 그 결과를 캐릭터 공간으로 옮기는 변환으로 정의된다.

  • (1) 골반 애니메이션
    • 월드 공간에서 캐릭터의 위치와 방향을 정하기 위해 월드 변환이 필요하다. 이 월드 변환은 골격의 루트 노드인 골반을 기준으로 정한다. 즉, 골반의 애니메이션은 나중에 캐릭터의 월드 변환으로 대체될 수 있으므로 지금은 불필요하다.
  • (2) 캐릭터 공간으로 옮기는 변환
    • 골반 공간은 캐릭터 공간과 같기 때문에 불필요하다.

따라서 $M_{1,a}$는 단위 행렬이다.

단위 행렬인 $M_{1,a}$부터 시작해 골격 계층 구조를 따라 '위에서 아래로 내려가면서' 각 뼈마다 $M_{i,a}$를 계산하면 된다.

v와 v'는 모두 캐릭터 공간에서 정의되었는데, 매 프레임 v'가 갱신된다.

드레스 포즈 골격이 결정되면, 골격 계층 구조를 따라 '위에서 아래로 내려가면서' 각 뼈마다 $M_{i,d}^{-1}$을 계산한다. 이는 단 한번 계산된다.

애니메이션 포즈가 결정되면, 골격 계층 구조를 따라 '위에서 아래로 내려가면서' 각 뼈마다 $M_{i,a}$를 계산한다. 이는 모든 애니메이션 포즈에서, 즉 애니메이션의 각 프레임마다 반복된다.

드레스 포즈에서 정점의 캐릭터 공간 좌표를 $v$로 표기하자. 이는 우선 $M_{i,d}^{-1}$에 의해 해당 뼈 공간으로 변환된다. 그 이후 $M_{i,a}$에 의해 애니메이션되고 캐릭터 공간으로 변환된다. 이 정점을 $v'$라 표기하면 다음과 같다.

 

$v' = M_{i,a}M_{i,d}^{-1}v$

 

이렇게 얻어진 $v'$들을 모아 렌더링하면 애니메이션 포즈의 캐릭터를 얻게 된다.

 

기구학(kinematics)

  • 질량이나 힘을 고려하지 않고 물체의 움직임을 기술하는 학문 분야

정기구학(forward kinematics 혹은 direct kinematics)

  • 모든 뼈의 변환을 계산하여 관절체 전체의 모습을 결정하는 것

역기구학(inverse kinematics)

  • 관절체의 말단 노드의 위치와 방향이 주어졌을 때 이를 위하여 관절체의 뼈에 어떠한 변환을 적용해야 하는 지 결정하는 것

 

13.3 스키닝(Skinning)

캐릭터의 폴리곤 메시를 피부(skin)라고도 부른다.

13.3.1 정점 블렌딩

(좌) 피부 위의 정점 (우) 블렌딩을 수행하지 않은 경우

위 사진은 팔꿈치에 연결된 위팔과 아래팔을 보여준다. 팔꿈치 주위의 세 정점 a, b, c를 설정한다. 이 중 a는 위팔에 속하고 b와 c는 아래팔에 속한다고 가정한다. 이런 가정 하에 두 팔이 회전했을 때 결과로 나오는 변형된 피부는 부드럽지 않다.

 

(표) 블렌딩 가중치, (그림) 블렌딩 가중치 수행

이전의 변형된 피부가 부드럽지 못한 것은, 한 정점은 오직 하나의 뼈에 속한다는 제약 때문에 이러한 문제가 발생한 것

여러 개의 뺘가 한 정점에 영향을 주도록 하고 그 결과를 블렌딩(blending)하면 이 문제는 상당히 완화될 수 있다.

각 뼈가 한 정점에 얼마나 영향을 주는지 미리 정해줘야 하는데, 이를 블렌딩 가중치(blending weight)라 부른다.

 

드레스 포즈에서, 정점 a는 캐릭터 공간에 정의되었다. 위팔 공간으로 변환되어, 위팔의 움직임에 따라 애니메이션된 후, 다시 캐릭터 공간으로 변환된 것이 $a_{u}'$이다.

이제 블렌딩에 의해 아래팔의 영향도 받는다. a가 아래팔 공간으로 변환되어, 아래팔의 움직임에 따라 애니메이션 된 후, 다시 캐릭터 공간으로 변환된 것이 $a_{f}'$이다.

블렌딩 가중치를 참고해, $a_{u}'$와 $a_{f}'$에 각각 0.7과 0.3의 가중치를 곱해 더한 것이 $a'$이다.

즉, 0.7과 0.3의 가중치를 이용해 $a_{u}'$와 $a_{f}'$를 선형보간한 것이다.

이러한 기법을 스키닝(skinning) 혹은 정점 블렌딩(vertex blending)이라 한다.

 

정점 블렌딩

$v$는 드레스 포즈의 캐릭터 공간에서 정의된 정점이다.

$M_{5,d}^{-1}$에 의해 아래팔 공간으로 변형된 것을 $v_5$로 표기하였다.

아래팔뿐 아니라 손도 $v$에 영향을 준다 가정하면

$M_{6,d}^{-1}$에 의해 아래팔 공간으로 변형된 것을 $v_6$로 표기하였다.

 

아래팔이 $90^{\circ}$ 회전하고 손이 $-90^{\circ}$ 회전하여 (b) 같은 애니메이션 포즈를 얻었다고 가정한다.

그러면 $v_5$와 $v_6$는 각각 $M_{5,a}$와 $M_{6,a}$에 의해 애니메이션되고 캐릭터 공간으로 변환된 후, 미리 정의된 가중치 $w_5$와 $w_6$를 사용해 블렌딩된다.

 

일반적으로 한 정점에 영향을 주는 뼈들과 그 가중치는 애니메이션 과정 전체에 걸쳐 일정하게 유지된다.

m개의 뼈가 한 정점에 영향을 준다고 가정한면(게임과 같은 실시간 그래픽스 응용에서는 대체로 m은 4로 고정된다. m개의 뼈의 가중치 합은 1이다) 다음과 같이 일반화 할 수 있게 된다.

 

스키닝 알고리즘의 입력 및 작동 원리. 팔레트 인덱스와 가중치는 정범별로 고정되어 있다. 스키닝 알고리즘은 드레스 포즈의 v를 애니메이션 포즈의 v'로 변환한다.

위 사진의 캐릭터의 골격은 20개의 뼈를 가진다. 따라서 애니메이션 과정의 매 프레임마다 20개의 $M_i$를 갱신해야 한다.

이는 행렬 팔레트(matrix pallette)라 불리는 테이블에 저장된다.

드레스 포즈의 한 정점 $v$를 보면, $v$에 영향을 미치는 뼈의 인덱스는 0, 2, 7, 18이다. 따라서, $v$는 행렬-정점 곱셈을 의미하는 $mul$ 함수를 이용하여 $M_0$, $M_2$, $M_7$, $M_18$ 네 개의 행렬에 의해 변환되고 그 결과는 각각 0.2, 0.3, 0.4, 0.1의 가중치를 이용해 결합된다. 그 결과는 $v'$이다.

 

일반적으로 스키닝 알고리즘은 정점쉐이더로 구현된다. 정점쉐이더에게 행렬 팔레트는 유니폼으로 제공된다.

반면, 팔레트 인덱스와 블렌딩 가중치는 정점 위치, 노멀, 텍스처 좌표 등과 함께 정점 배열에 저장된다.

모두 정점 쉐이더에게 애트리뷰트로 제공된다.

 

13.3.2 키프레임 애니메이션에서의 스키닝

$M_i = M_{i,a}M_{i,d}^{-1}$는 모든 중간 프레임에 대해 계산된다.

$M_{i,d}$는 드레스 포즈의 골격을 이용해 단 한 번 계산된 후, 모든 애니메이션 프레임에 사용된다.

애니메이션 포즈는 키프레임에서만 정의될 것이므로, 키프레임에서 정의된 $M_{i,a}$를 보간하여 중간 프레임에 사용해야 한다.

 

$M_{i,a}$는 $M_{i-1, a}M_{i,p}M_{i,l}$로 정의된다.

$M_{i,l}$은 특별한 경우가 아니면 회전 행렬로 국한된다(사람의 관절은 회전만 가능하다)

$M_{i,p}$는 회전과 이동이 결합된 공간 이전 행렬이다.

따라서 $M_{i,p}M_{i,l}$은 강체 변환이고 [R|t]로 표기할 수 있다. $\boldsymbol{R}$은 '누적된 회전'을, $\boldsymbol{t}$는 '누적된 이동'을 나타낸다.

키프레임에서 각각의 뺘에는 $\boldsymbol{R}$이 쿼터니언 $\boldsymbol{q}$로 변환되어 저장되고, $\boldsymbol{t}$는 3차원 벡터로 저장된다. 이것이 뼈의 키 데이터를 구성한다.

중간 프레임에서는 골격 계층 구조를 따라 '위에서 아래로 내려가면서' 각 뼈마다 $M_{i,a}$를 계산해야 하는데, 이를 위해 키프레임의 $\boldsymbol{q}$와 $\boldsymbol{t}$를 각각 보간한다.

보간된 $\boldsymbol{q}$는 4 x 4 행렬로 전환된다.

보간된 $\boldsymbol{t}$는 이 행렬의 네 번째 열을 채운다.

이 행렬이 부모 뼈의 $M_{i-1,a}$와 결합되어  $M_{i,a}$를 완성한다.

 

키프레임 기반 스키닝 알고리즘의 수도코드

 

첫 번째 for 루프는 $M_{i,d}^{-1}$를 각 뼈에 할당한다. 이 작업은 한 번만 수행된다.

두 번째 for 루프는 애니메이션 과정의 매 프레임마다 실행되는데, 우선 보간을 사용하여 $M_{i,a}$를 각각의 뼈마다 계산한다. 그 다음. $M_{i,a}$와 $M_{i,d}^{-1}$과 결합하여 $M_i$를 구성한다. 이는 행렬 팔레트에 저장되어 정점 쉐이더에게 넘겨진다.

 

13.4 역기구학

말단 장치(end effector)

  • 로봇 팔의 끝에 부착되어 물체를 잡고 다루는 등의 용도로 쓰이는 기구

정기구학(forward kinematics)은 로봇 팔의 관절 각도를 입력으로 받아 말단 장치의 위치 및 방향을 결정한다. 이러한 작업의 역순을 역기구학(inverse kinematics, IK)이라 한다. 즉, 목표로 하는 말단 장치의 및 방향이 입력으로 주어지면, 이 목표를 달성하기 위해 피룡한 각 관절의 각도를 계산한다.

 

경사로에 맞게 다리가 움직임

로봇 분야에서 개발된 IK는 캐릭터 애니메이션에도 유용하게 사용된다.

실시간으로 IK를 풀어서 캐릭터의 관절 운동을 결정하게 되면, 미리 예측할 수 없는 환경 혹은 동적으로 변화하는 환경에서도 자연스러운 캐릭터 애니메이션을 구현할 수 있다.

 

13.4.1 해석적 기법

자유도(degrees of freedom, DOF)

물체의 상태를 정의하는 독립적인 변수의 개수

위 사진에서 좌측은 로봇 팔꿈치를 보여준다. 로봇 팔꿈치는 기구학적으로 경첩(hinge)과 같아서, 아래팔을 위아래로 움직이는 자유도만 가지고 있으므로, 1자유도 관절이라고 한다.

위 사진에서 우하단에서, 어개는 기구학적으로 볼 조인트(ball joint)와 같다. 위팔이 특정한 방향을 가리키려면 좌우로 한 번 움직이고 위아래로 한 번 움직이면 된다. 여기까지 자유도는 2이다. 추가로 위팔은 스크루 드라이버처럼 회전 가능해서 결국 자유도는 3이다. 즉, 어깨는 3자유도 관절이다.

 

해석적 기법

목표 위치 G와 초기 자세를 입력으로 받아 최종 자세가 출력된다.

위 진과 같은 두 개의 관절을 예로 들자. 문제의 단순화를 위해 말단 장치의 방향은 무시하고 위치만 고려한다.

아래팔의 끝점 $T$가 $G$로 표기된 목표 위치에 닿을 수 있도록 위팔과 아래팔이 회전되어야 한다.

IK는 위팔과 아래팔을 회전시키는데 필요한 어깨와 팔꿈치의 관절각(joint angle)을 계산한다.

 

1자유도 관절인 팔꿈치의 관절각은 위 사진의 우측 식으로 간단히 계산된다.

위팔과 아래의 길이는 각각 $l_u$와 $l_f$로 표기하자. T가 G에 닿았을 때의 팔꿈치 관절각을 $\theta$로 표기하고, 위치가 고정되어 있는 어깨와 목표 지점 $G$사이의 거리를 $l_q$로 표기하자. 여기에 코사인 법칙을 적용하면 다음과 같아진다.

 

팔꿈치 관절각 $\theta$만큼 회전하면 아래와 같은 사진을 얻는다.

이제 위팔을 회전하면 아래팔이 따라서 움직여, $T$가 $G$에 닿을 것이다.

어깨와 $T$를 연결하는 단위 벡터를 $v_1$, 어깨와 G를 연결하는 단위 벡터를 $v_2$라 하면, 만약 $v_1$이 $phi$만큼 회전해서 $v_2$가 된다면 $T$는 $G$에 닿을 것이다.

회전각 $\phi$는 $v_1$과 $v_2$의 내적을 통해 계산된다.

3자유도를 가진 어깨의 경우 회전각 하나로는 충분하지 않다. 회전축이 필요하다. 이는 $v_1$과 $v_2$에 수직이어야 하므로 이들의 벡터곱을 통해 결정된다. 이렇게 구해진 회전축을 중심으로 위팔이 $\phi$만큼 회저하면 $T$는 $G$에 닿게 된다.

$v_1 \cdot v_2 = \left\| v_1 \right\| \left\| v_2 \right\| \cos\phi = \cos\phi$

$\phi = \arccos\left(v_1 \cdot v_2\right)$

 

13.4.2 CCD 알고리즘

간단한 관절체의 경우 해석적 기법을 사용하면 빠르고 정확하게 IK를 해결할 수 있다.

많은 관절을 가진 복잡한 관절체에는 이를 사용하기 어렵다. 따라서 종종 CCD(cyclic coordinate descent) 알고리즘 사용

 

CCD(cyclic coordinate descent) 알고리즘

  • 말단 장치로부터 시작해 계층 구조를 거슬러 올라가면서, 말단 장치와 목표 지점 간 거리가 최소화되도록 관절각을 조정한다.
  • 모든 관절각 조정을 마쳤는데도 말단 장치와 목표 지점 간 거리가 임계값 이상 벌어지면, 말단 장치로부터 시작해 관절각을 조정하는 작업을 반복한다.

CCD 알고리즘. (a) 초기 자세, (b) 손이 회전되었고, 아래팔이 회전할 차례, (c) 아래팔이 회전되었고, 위팔이 회전될 차례, (d) 위팔 회전. T와 G의 거리가 충분히 가깝지 않으므로 다시 손부터 시작하는 회전을 반복할 것이다.

위 사진들은 위팔, 아래팔, 손으로 이루어진 골격을 이용한 CCD 작동 원리를 보여주고 있다.

최종 목표는 $T$와 $G$를 같게 하는 것이다.

(a)는 초기 자세를 보여준다.

CCD는 말단 장치인 손부터 움직이는데, $T$가 $G$를 가리키도록 회전시킨다.

손의 뼈 공간 원점 $O_h$를 보면, $\overrightarrow{O_hT}$는 $O_h$와 손끝 $T$를 연결하는 벡터이다.

$\overrightarrow{O_hG}$는 $O_h$와 $G$를 연결하는 벡터이다.

$\overrightarrow{O_hT}$는 $\overrightarrow{O_hG}$와 겹쳐지기 위해서 $\theta$만큼 회전할 것이다.

또한, 회전축도 필요(사진 상에서 볼 조인트인 것을 볼 수 있다)하다. 회전각과 회전축은 $\overrightarrow{O_hT}$와 $\overrightarrow{O_hG}$를 사용해 각각 내적과 벡터곱으로 구할 수 있다.

 

(b)는 손이 회전된 결과를 보여준다.

$T$와 $G$가 일치하지 않으므로 손의 부모인 아래팔이 회전할 차례이다.

(a)에서 했던 것처럼 회전각과 회전축을 계산하고 회전한다.

 

(c)는 아래팔이 회전된 결과를 보여준다. 마찬가지로 회전각과 회전축을 계산하고 회전한다.

(d)는 위팔이 회전된 결과를 보여준다. $T$와 $G$간 거리가 충분히 가까우면 종료되지만, 아니기 때문에 다시 손부터 시작하는 회전을 반복한다. 이러한 반복은  $T$와 $G$간 거리가 미리 정한 임계값 이하가 되거나 혹은 미리 설정한 최대 반복 횟수에 도달했을 때 중단된다.

 

캐릭터의 머리와 팔이 공을 향하는 데 IK가 사용됨

게임에서는 자연스러운 캐릭터 애니메이션을 위해 IK를 자주 사용한다.

 

출처
[OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문]을 보고 공부하고 정리한 내용