Hyun2and
11. Animation 본문
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
- 캐릭터가 나와야 재미있다
- 캐릭터를 움직이려면? 얼굴, 옷, 팔다리, 표정 …
- 어떻게 애니메이트하나?
- 몸 각각의 파트의 무게, 방향, 힘 등을 고려
- 체중을 어떻게 균형을 이뤄서 서있을것인가?
물리적 법칙?
- 각각의 근육의 형태를 어떻게 움직일지 시뮬레이션한다
- 그 값을 기반으로 몸을 구성한다.
- 근육의 타입에 따라서 몸을 움직인다
- → 그럴듯하지만 시간이 오래걸린다!
- 캐릭터는 게임에서는 물리법칙 쓰기 어렵다! 좀더 단순한 방법!
물리법칙말고 어떻게 애니메이트 할 수 있을까?
- 공 같은건 물리법칙으로 가능하다
- 구름, 캐릭터같은건 물리법칙으로 할 수 없다
어떻게 할까?
- 미리 계산해두고 그 값을 실시간으로 가져다쓰자!
- Explicit methods
- 몸의 모든 부위를 다 저장해놓는다
- 매 프레임의 모든 좌표를 다 저장한다
- 관절은 40,50개 정도로 구성되어 있다. 허리7, 목7 , 발,발목 등등
- 장 : 플레이 시 계산할 필요가 없다. 시작 좌표에서 얼만큼 갔는지만 알면된다
- 단
- 저장할 내용, 좌표가 너무많다. 초당 100번, 5000개의 좌표를 저장해야 한다.
- 장애물 같은 것들이 생겨도 실시간으로 수정할 수 없다.
- 계산을 많이 할 수 없을 때 많이 썼다. 그럴때는 이거밖에 못썼지만 요즘은 계산많이할수있다.
- 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 : 파라매트릭 커브를 쓴다
- 정확하게 특정 지점을 지나가면서, 부드럽고, 자연스러운 .
- 가속도가 연속적으로 변화하는 경로를 만들어준다
- 그 외 … (카르마 필터 … )
- Linear : 두 위치를 직선으로 보간한다 (x= (x1-x0)x+ x0)
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