Hyun2and

11. Animation 본문

공부엔 끝이없다/이것저것

11. Animation

혀니앤 2023. 3. 20. 23:02
728x90

지금까지

  • 게임 엔진
  • 게임 구조
  • 디자인 패턴
  • 인풋, 인터랙션
  • 충돌검사
  • AI
  • 이제는 애니메이션!
  • 이후엔 Visualization, Network

AI

  • Individual Controller : 하나의 에이전트
  • Abstract Controller : 전체적인 전략
  • sensor, memory, resoning core(FSM, rule), action system
  • actionAI, Tactical AI
  • 이러한 엔피씨들의 액션이 정해지면 그래피컬하게 보여줘야 한다! → 애니메이션

 


Animation

  • 사전적 의미 : 움직이는 것처럼 착각을 주는 과정
    • drawing, model, inanimate objects (점토 애니메이션)
  • 어떤 것을 움직이나?
    • 공 : 실제 물리법칙을 써서 표현할 수 있다
    • 구름

Character Animation

  • 캐릭터가 나와야 재미있다
  • 캐릭터를 움직이려면? 얼굴, 옷, 팔다리, 표정 …
  • 어떻게 애니메이트하나?
    • 몸 각각의 파트의 무게, 방향, 힘 등을 고려
    • 체중을 어떻게 균형을 이뤄서 서있을것인가?

 

물리적 법칙?

  • 각각의 근육의 형태를 어떻게 움직일지 시뮬레이션한다
  • 그 값을 기반으로 몸을 구성한다.
  • 근육의 타입에 따라서 몸을 움직인다
  • → 그럴듯하지만 시간이 오래걸린다!
  • 캐릭터는 게임에서는 물리법칙 쓰기 어렵다! 좀더 단순한 방법!

 

물리법칙말고 어떻게 애니메이트 할 수 있을까?

  • 공 같은건 물리법칙으로 가능하다
  • 구름, 캐릭터같은건 물리법칙으로 할 수 없다

 

어떻게 할까?

  • 미리 계산해두고 그 값을 실시간으로 가져다쓰자!
  1. Explicit methods
    • 몸의 모든 부위를 다 저장해놓는다
    • 매 프레임의 모든 좌표를 다 저장한다
    • 관절은 40,50개 정도로 구성되어 있다. 허리7, 목7 , 발,발목 등등
    • 장 : 플레이 시 계산할 필요가 없다. 시작 좌표에서 얼만큼 갔는지만 알면된다
      • 저장할 내용, 좌표가 너무많다. 초당 100번, 5000개의 좌표를 저장해야 한다.
      • 장애물 같은 것들이 생겨도 실시간으로 수정할 수 없다.
    • 계산을 많이 할 수 없을 때 많이 썼다. 그럴때는 이거밖에 못썼지만 요즘은 계산많이할수있다.
  2. implicit methods
    • 조금 적게 저장해보자!
    • 팔을 들 때 모든 좌표를 저장하지 말고 손을 움직이기 위한 값을 계산한다
      • skeletal animation : 뼈의 움직임, 중요한 곳만 저장하고 나머지는 계산한다. 뼈가 움직였을 때 피부가 어떻게 부풀고, 근육이 어떻게 움직이는지를 계산으로 해결한다
    • 장 :
      • 저장할 내용이 적다.
      • 실시간으로 변경할 수 있다. 장애물에 맞게 허리만 조금 움직인다!
    • 단 : 실시간 계산할 양이 많다

→ 1,2 를 적절히 조합해서 쓴다. 비교적 implicit를 많이쓴다

  • 캐릭터에서 많이쓰긴하지만 차, 공 같은 다른 곳에서도 쓸수있다

 


애니메이션 기법

Frame Animation

  • 가장 단순한 애니메이션 기법
    • 전통적인 애니메이션 방식을 쓴다. 원화 작가들이 중요 장면을 그린다. 애니메이터들이 중간 장면을 잇는다.
    • 매 프레임마다의 모든 정점들의 위치를 다 저장한다. (Explicit)

 

문제점

  • 저장할 데이터가 너무 많다 datasize 가 너무 크다
    • 정점 위치, 정점의 법선벡터
    • 정점 색상, Texture coordinate
    → 엄청나게 많은 양을 저장해야 한다
  • Frame time
    • 미리 계산된 계산 프레임과 실제 수행 프레임간의 차이가 있을 수 있다.
    • 컴퓨터마다 다른 프레임 시간. 어떤 컴퓨터에서는 너무 빠르고, 어떤 게임에서는 너무 느리다. 뚝뚝 끊기거나 너무 빠르게 흘러간다

 

Interpolation

  • 문제를 해결하기 위한 방법
  • 두 점사이를 보간한다
  • 프레임타임이 런타임과 일치하지 않는 문제를 해결할 수 있다
    • 플레이 타임이 너무 빠를 때, 중간부분을 메꿔서 자연스럽게 만들 수 있다
  • 데이터를 모두 저장할 필요가 없어진다
  • 종류
    • Linear : 두 위치를 직선으로 보간한다 (x= (x1-x0)x+ x0)
      • 장 : 중간을 빠르고 잘 계산할 수 있다
      • 단 : 급격히 값이 바뀌는 경우가 생긴다
    • Polynomial : y=ax^2+bx+c 라는 함수 찾기.
      • 가끔 정확한 2차곡선을 찾지 못하는. 근처를 지나는 함수일 수 있다
      • 장 : 더 부드럽게 연결할 수 있다. 식이 만들어지면 그리는것도 간단하다
      • 단 : 선형보단 계산량이 많다(그렇게 많진않다)
    • Spline : 파라매트릭 커브를 쓴다
      • 정확하게 특정 지점을 지나가면서, 부드럽고, 자연스러운 .
      • 가속도가 연속적으로 변화하는 경로를 만들어준다
    • 그 외 … (카르마 필터 … )
    → 초창기에는 선형만 썼지만, 스플라인도 많이 쓴다

 

 

Keyframe Animation

  • 보간을 통해 프레임이 100개가 있을 때, 50개만 만들고 사이사이는 보간할 수 있다는걸 알게되었다!
  • 중요한 프레임, 키프레임만 만들고 중간은 다 보간하자!
  • 가장 중요한 키프레이밍 key-framing 단계!
    • 원래의 사람이 걷는 모션에서 , 중요한 모션을 뽑아내는 과정이다
    • 이게잘돼야 중간중간을 기계적으로 잘 채워넣을 수 있다

 

키프레임의 보간

  • 키프레임을 얼마나 잘 뽑았는지 → 어떻게 보간할지 정해야 한다
  • 얼마나 많은 키프레임을 뽑을까?
  • 선형
    • 키프레임이 많이 필요하다.
    • 팔의 움직임을 곡선이 바뀔때마다 키프레임을 다 잡아야 한다
  • 커브 보간
    • x축에 대해서 몇차원 커브를 써야하고, 어디서 잘라야할지 계산이 복잡해진다
    • 몇개를 써야할지 어렵다
  • Analytic way 해석적인 방법
    • 일단 촘촘하게 많은 프레임을 만든다
    • 각 프레임들을 확인하면서 보간을 쓸 수 있다면 줄여나간다
    • 프레임간의 연관관계를 비교한다 → 키프레임 개수가 정해진다

 


Skeletal Animation

  • implicit 하게 만들어보자
    • 사람에 대해 뼈의 계층구조를 . 허리를 root로 잡아서 다른 관절들의 움직임을 파악한다.
    • 애니메이션은 뼈의 관절관절의 각도를 사용한다.
    • 피부를 그 이후에 뼈 위에 붙인다. 뼈에 맞게 그 위 매시를 deform해준다
  • 관절, 관절각도만 저장하면 된다!
  • 캐릭터 애니메이션에서 가장 많이 사용된다!

 

 

Segmented Animation

  • 각 뼈와 관련된, 뼈를 따라서 움직이는 좌표들을 표현한다
  • 뼈는 Rigid segments와 관련되어 있다. 각 세그먼트들을 transform 움직여서 변형할 수 있다
  • 장 : 매우 편하다. 초창기엔 많이 쓰였다
  • 단 : 겹치는 부분. 불필요한 점들이 많다.

 

Skinned Animation

  • 하나가 굽혀지면 다른 하나는 원래 위치보다 좀더 바깥쪽으로 나가게 된다.
  • 모든 점은 모든 뼈에 대해서 얼만큼 변하는지 표현할 수 있다
  • wegiht, 방향에 따라 몸의 각 파트가 움직이도록 한다.
  • 각 점은 관련된 뼈에 대해 상대적인 weights를 가진다. 뼈가움직였을 때 이 점이 얼마나 움직이는지!
  • 스키닝에 있어서 스키닝 파라미터를 찾는 것이 어렵다.
    • 요즘은 근육이 있다면→ 어떻게 영향을 주는지 자동적으로 제공된다
  • 자연스럽긴하지만 매우 자연스럽진않다. → 애니메이터의 손이 필요하다

 

Motion Captures

  • 키프레임에서는 어떤 키프레임을 선택하고, 모션을 어떻게 만들어낼지가 어렵다.
  • 직접 키프레임을 그리면 너무 힘들다!
  • 실제 사람의 움직임을 캡쳐→키프레임을 생성→그것을 기반으로 스켈레탈 애니메이션을 수행한다
  • 실제 사람의 몸에 마커를 붙이고 마커들의 움직임을 카메라들이 찍어서 3차원 위치를 표현한다. 그것을 기반으로 사람의 뼈의 위치를 역으로 계산.
  • 장점
    • 매우 자연스럽다
    • 실시간으로 모션 캡쳐들이 보인다
  • 단점
    • 준비과정이 오래걸렸다 : 캡쳐하는 과정이 예전엔 어려웠다. 마커들이 몸에 정확하게 붙어있지 않으면 뼈의 위치 계산이 어렵다. (자로 재기까지했다)
      • 요즘은 마커 안붙여도 적절히 잘 뽑아낼 수 있다
    • 실제 캡처가 완벽하진 못하므로 후처리 과정도 필요하다
    • 이후 계산이 필요하다
      • 캐릭터를 다른크기에 적용할 때. 키가 훨씬크거나 팔이 길거나 …
      • 약간 다른 모션을 만들고자 할 때
      • → Motion Retargetting
      • 실제 게임에서 장애물이나 동적인 경우에서 민감하게 변경할 수 없다
      • → Motion Control (Implict 방법에서 많이 쓰인다)

 

각 모션을 보간하기

  • 이제 각 프레임들을 다 저장했다
  • 뛰면서 손흔들기 처럼 서로 조합하려면 어떻게 할까?
    • 하체는 걷는 부분을 플레이하고, 상체는 손흔드는부분을 튼다
  • 각각의 모션에 있어 중요한 부분을 저장하게 된다
  • 우선순위, 태그들을 둬서 실시간으로 combine, blending 한다

 


Implicit Methods

  • 지금까지 Explict 에대해 배웠다. 키프레임을 사용한다
  • 좀더 빨리가거나 이런 부분들을 제어하려면 어떻게 할까?
    • 특정 지점으로 이동한다 : 동적인 장애물의 위치를 파악하여 움직인다
    • 물건을 집는다 : 집는 물건의 위치, 무게 등에 맞춰 플레이한다

Forward Kinematics

  • 각 노드의 위치를 지정해준다
  • 장점
    • 직접 근육을 제어할 때에는 좋다
    • 원하는 물체를 이동시키기 위해 손쉽게 위치를 지정할 수 있다
  • 단점 : 정확하게 어떤 위치로 움직이고 싶을 땐 정확한 값을 알기엔 어렵다

Inverse Kinematics (IK)

  • 손 끝의 위치만 정한다
  • 손 끝이 특정 지점에 가기 위해서는 중간 관절의 위치를 계산해낸다
  • Kinematics 는 관절을 제어하지만, IK는 끝점을 기반으로 역으로 계산한다
  • 장점 : 컨트롤이 쉽다. 끝점만 정해주면 된다
  • 단점 : 자연스럽지는 않다
  • → 모션캡쳐로 forward kinematic 을 구하고, IK로 수정한다
  • Analytic IK
    • 끝점을 어디에 두겠다는 계산이 있다면 관절의 각 끝점의 좌표를 수식으로 표현한다. e1’=L1*Ry . . . e3’ 를 계산한다
    • 최종위치가 e3’이므로 그떄의 좌표를 대입해서 위의 식을 계산해서 구할 수 있다
    • 해가 한 개가 아닐 수도 있고, 알고 있는 정보가 너무 적다.
  • Cylic Coordinate Descent
    • 가장 긴축부터 돌려보기
    • 그 다음거 순서대로 돌리면서 점점 가까이 다가간다
  • Gradient method
    • 위치 미분해서 가장 가까운 방향을 찾는다 (고컴그에서 자세하게 배우기)

Dynamics

  • Forward Dynamics
    • f=ma 식을 계산한다
  • Inverse Dynaics
    • 최종위치를 가지고 어떻게 가야할지 물리법칙으로 계산한다
    • 계산이 많지만 결과물이 좋다

 

요즘 트렌드

  • 모션 캡쳐하고
  • 그걸 간략하게 IK 푸는정도, 파라미터 바꾸는 정도로만 motion control 하고
  • motion retargetting 으로 다른 캐릭터에 맞춘다

 


 

기타 애니메이션

Facial Animation

  • 실제 피부의 파트가 어떻게 움직이는지를 파라미터화 한다
  • Facial action unit 을 쓰고, 요즘은 blendshape 를 쓴다
    • 약 50~1000 개의 기본 base를 만든다.
  • 얼굴 영역을 나눠서 얼만큼 변형됐는지를 캐릭터에 입힌다

Hair Animation

  • 엄청많은 폴리곤, 선으로 이루어져 있다
  • 서로 부딛히고 몸과 부딛히는 것을 계산해야한다
  • 단순화해서 배워야한다

Fur Animation

  • 동물의 털
  • 스켈레탈 못쓴다

Cloth Animation

  • skeletal 못쓴다
  • 스프링처럼 늘어나고 줄어드는 모습 계산
  • 계산이 복잡해서 게임에서는 어렵고 대략적으로 단순하게 계산한다

Crowd Animation

  • boid 처럼 복잡한 군중을 어떻게 계산할지에 대한 부분

 

 

 

728x90

'공부엔 끝이없다 > 이것저것' 카테고리의 다른 글

10. Tactical AI  (0) 2023.03.20
9. AI Part 2  (0) 2023.03.20
Euler vs Quaternion  (1) 2023.03.20
Comments