Character Animation

CuriHuS·2024년 6월 8일

Game Graphics

목록 보기
9/9
post-thumbnail

Skeletal animationLocal motions

bone의 역할

  • Local motions
    • 각 뼈는 자체 local motion을 가짐(own 좌표계에서 정의)
    • 각 뼈의 움직임은 회전으로 제한됨
      • 이 제한은 높은 수준의 유연성 제공하면서 애니메이션 프로세스를 간단화함
  • Casading Effect(폭포 효과)
    • 뼈는 부모-자식 관계로 구성되어 있어, 모든 자식 뼈들이 부모의 영향을 받음
    • upper arm(팔 상안부)를 회전하면 자동으로 forearm, wrist, hand가 회전한다. 연결된 모든 부분이 움직이는 것을 보장함.

Space Transform

  • Mi,dM_i,_d 는 i번째 bone이 Character space로 가기 위한 matrix를 의미
  • Character to bone space: Mi1,dM_i^{-1},_d

Forward Kinematics

  • animated vertex를 계산하기 위해서 FK 기술이 필요함
    • root bone에서 출발하여 end effector까지 진행되는 계층 구조에서 각 관절의 회전과 변환에 기반을 두고 있는 캐릭터 뼈의 위치를 FK가 계산함
  • 뼈를 애니메이팅 하기 위해 FK을 사용한 이후 animated vertex는 다시 캐릭터 space로 돌아가야 함.
  • 각 뼈는 local joint를 기준으로 회전하는데, 이를 local transform이라고 함.
    • forearm에서의 local transform은 M5,lM_5,_l로 표현하며 v5v_5에 영향을 줌

업로드중..

  • M4,aM_4,_a 는 upper arm에서의 vertex를 애니메이팅 하고 character space로 변환하는 matrix를 의미함.

업로드중..

  • character space에서 bone space로 Mi1,dM_i^{-1},_d 로 이동하고 Mi,aM_i,_a를 계산해서 다시 animated vertex 계산 동시에 character space로 되돌아옴.

정리
Mi,dM_i,_d : i번째 bone space에서 character space로 가는 matrix
Mi1,dM_i^{-1},_d : character space -> i번째 bone space
Mi,lM_i,_l : i번째 bone space에서 local transform 수행
viv_i에 영향을 준다
Mi,aM_i,_a : i번째 bone space에서 animated된 viv_icharacter space로 변환

default pose -> animated pose

  • 기본 vvMi,aM_i,_aMi1,dM_i^{-1},_d를 곱해주어 animated vertex 계산 후 character space로 복귀시킴

Skinning

skin : 캐릭터 애니메이션에서 skeleton에 붙이는 polygon mesh를 의미함

Skin

업로드중..

  • 뼈에 vertex가 속한다고 가정하면 움직였을 때 부자연스러움

업로드중..

  • 여러 뼈가 vertex에 영향을 줄 수 있게 하고 뼈에 vertex를 묶는 대신 blending을 하여 결과를 내면 위의 현상이 완화됨.(alleviate)

업로드중..

  • character space에서의 점 vv가 forearm과 hand에 영향을 받는다고 가정
    • 각 뼈에 영향 받는 가중치 w5,w6w_5, w_6를 계산함.

구현

업로드중..

  • 게임 같은 실시간 3D 앱에서는 프로그래밍 효율을 위해 vertex에 영향을 주는 뼈의 수(mm)을 4개로 제한한다.
  • vertex shader에 의해 sknning 알고리즘 구현됨
  • 캐릭터가 뼈 20개를 가진다면, 각 프레임에서 MiM_i의 20개 인스턴스를 업데이트 해야한다.
  • 이 인스턴스들은 matrix palette 테이블에 저장되고 균일한 변수로서 제공된다
  • 반면에 palette index들과 blend weight는 vertex array에 저장된다

Keyframe Animation

  • Mi,aM_i,_aMi1,dM_i^{-1},_d는 매 프레임마다 계산됨
    • Mi1,dM_i^{-1},_d은 한번 계산되고 고정된 상태로 있으나, Mi,aM_i,_a는 keyframe에서 Mi,aM_i,_a을 보간하여 프레임 사이마다 업데이트 됨
  • Mi,aM_i,_aMi1,aM_{i-1},_a Mi,lM_i,_l Mi,pM_i,_p 로 정의됨
    • Mi,lM_i,_l은 사실상 회전
    • Mi,pM_i,_p는 이동과 회전으로 구성된 공간 변환 matrix

Let Mi,p,lM_i,_p,_l denote Mi,p Mi,l. It is in [R|t].

profile
공부 노트

0개의 댓글