시작하며
- 계층적인 모델 즉 사람을 시뮬레이션하기 위해서 표준화된 모델을 사용했다.
- 해당 모델은 Joint와 Link로 구성되어있으며, Joint의 이동과 회전을 통해 Animation이 표현된다.
- Animation은 MoCap또는 Key Frame을 통해 제작이 된다. 자연스럽고 빠른 제작을 위해 MoCap이 사용되곤한다.
- 사람의 체형과 캐릭터의 체형의 차이로 인한 부자연스러움을 해결하기 위해서는 Retargeting이 진행된다.
- Animation의 보간과정에서 FK, IK가 있다. FK는 아티스트의 영역. IK는 수학적인 영역이다.
- IK에는 한계가 있다.
- 보기에는 그럴듯해보이지만, 자세히 보면 이런 움직임은 불가능한데? 싶은 부자연스러움이 있다.
- 이런 한계점을 해결해줄 방법은 실제 물리법칙에 기반하여 시뮬레이션(Physics Dynamics)을 해주는것 뿐이다.
Physics?
왜 필요할까?
1. 리타게팅 과정에서 캐릭터의 질량에 따른 움직임이 달라질 수 있다.
2. 장애물이 있을 경우, 피해가는 과정에서 무게중심을 맞춰 이동해야 자연스러운 움직임을 표현할 수 있다.
Dynamics?
왜 필요할까?
- Kinematic이라면, 이동할 때 위치를 반드시 Key-Frame을 통해 잡아야한다.
- 하지만 Dynamics를 이용하면, 물리적인 계산을 통해 key를 잡지않아도 시뮬레이션이 가능하다.
Simulation 되어야하는것
- 힘!
- External Forces(외부 힘): 중력, 바람과 같은 힘 등
- Internal Froces(내부 힘): 땅을 딛는 힘, 앞으로 가능 힘 등
- 공식은 뉴턴의 법칙을 주로 활용한다.(F = ma)
Force, Mass, Acceleration, Velocity, Position
- v로 움직이고 있는 물체에 f의 힘을 주면, 바뀐 v'와 v의 평균으로 움직인다.
- a = f/m
- v' = v+ax시간변화량
- p' = 총 움직인 거리
Gravity
- 중력은 중력계수에 두 물체의 질량을 곱하고 거리의 제곱으로 나눠준다.
- 지구에 대해 계산을 한다면, 지구의 무게, 물체와 지구 중심의 거리가 굉장히 크기 때문에 상수가 되고, 남는것은 상수x물체의 무게 = 중력
Other forces
마찰력
- Static friction: 힘주면 중력에 의해 생기는 마찰력(힘을 줄수록 늘어난다)
- Kinetic friction: 움직이기 시작하면서부터의 마찰력(힘을 줄수록 줄어들다 일정해진다)
- Viscosity: 끈적임을 나타냄. 점성이 있을 경우, 천천히 움직이는것이 더 쉽게 움직일 수 있음.
- Viscosity Shere: Sphere의 반지름에 비례한다.
Spring-damper
말 그대로 Spring
- F = ks(Lcurrent - Lrest) - kd x Vspring
- damping을 곱하면 속도가 커질수록 빨리 줄어들게 함. (IK방식 설명할때도 한번 나왔음)
Momentum
Momentum보존이란?
Collisions
- Elastic: 탄성 충돌
- 변형되지 않음. 에너지의 손실이 없음
- 당구공 모든 공 질량 같으면, 에너지 잃어버리지않음
- 충돌순간, Momentum 보존됨
- Kinetic Energy또한 보존됨.
- Non-elastic: 비탄성 충돌
- 변형되는 경우. 변형에 의해 에너지의 손실이 있음
- 변형으로 인한 에너지 손실에 의해 튕기는 높이가 점점 낮아짐.(농구공)
Angular Physics(각속도)
질량의 중심 구하기
- 전체 지점에 대해서 질량 곱 거리의 평균을 구하여, 가장 최소인 부분이 중앙인것.
Linear vs Angular
- Linear(직선) - Angular(각)
- Position(위치) - Rotation, Orientation(회전, 방향)
- Velocity(속도) - Rotation(angular) velocity(각속도)
- Acceleration(가속도) - Rotation(angular) acceleration(각가속도)
- Mass(질량) - Inertia tensor(질량. 묵직한지..)
- Force(힘) - Torque(회전력)
- Momentum - Angular momentum
- 각속도를 활용하여, 나선형으로 움직이는 것 등의 Animation 표현이 가능
Intra-object Physics
물체 내에서 일어나는 일
- 옷감의 경우, 주름을 만들거나 흩날리는것은 Spring을 통해 표현이 가능하다.
Spring
- Flexible objects를 표현할 때.(옷과 같은)
- Virtual Spring: 폭신한 땅, 이불을 표현할 때, 가상의 Spring을 이용하여 표현한다.
- 압축되었다 늘어났다 하는 재미있는 움직임.
- 정육면체 젤리를 표현한다면 각 꼭짓점에 대해 spring을 추가하고, 중앙을 지나는 대각선에 대해 Spring을 추가한다. 그렇게 되면, 중앙으로 찌그려졌다가 펴지는 형상을 구현할 수 있다.
- Angular Spring: 각을 가지는 Spring으로, Spring이 늘어나면 각이 늘어난다.
- Spring Mesh: 옷을 표현할 때 자주 사용. 한 쪽에 힘이 주어지면, 주변Spring으로 전파된다.
- 따라서 움직이는 물체의 표현: 물체에 Spring을 연결하여 따라 움직이게 하고싶은 물체를 붙여준다.
Particle Physics
Particle?
- 불꽃놀이같은 입자
- 파티클끼리는 부딪힘, 가림, 반사가 되지 않는다.
- 처음에는 밝은빛으로 시작하여, 흐린빛이 되고 수명이 지나면 사라진다.
- 반복되는 파티클을 표현할 때는, 수명이 되어 사라진 후 새로 생성하면 된다.
- 각 파티클에 대해 랜덤으로 온도(속도), 방향을 주곤 한다.
Fluid Animation
왜 필요?
- 유체, 연기를 표현할 때 사용된다. 현실적인 표현을 위해 필요해!
- 모델이 계속해서 변한다는 특징을 가짐. Rigid로 표현 불가
Fluids
- Rigid는 표면 부딪히고, 변화가 일어남 => 표면기반의 계산을 진행하면 됨
- Fluid는 표면이 너무 많이 변하고, 합쳐지고, 찰랑거리고, 빠르고,, 다양함 => 표면기반의 계산이 어려움!
- 표면대신 부피를 따지자
- 연기의 경우, 공간을 Particle이 채워간다. 열, 바람, 힘을 받아 움직
- Fluid를 Particle로 표현할 수 있을 까? => 어렵다. 표면이 부드럽게 반사되기가 어려우니
Fluid types
- Water
- Smoke/Cloud: Particle로 충분히 표현 가능
- Fire: Particle로 어려움
Fluid Modeling
- Ridig는 질량과 Momentum, Kinetic보존을 알면 됨
- Fluid는 밀도, 부피와 이동법칙, 밀도에 부피를 곱한 전체양이 보존됨
- Viscous vs Nonviscous: 끈끈함이 있으면, 표면에 대한 마찰로 인해 손실이 생김. 안으로 모이게됨
- Compressible vs Incompressible: 밀도가 변하거나(속도가 변함) 상수이거나(속도 그대로).
- 변수: Density, Mass, Pressure, Velocity, Heat 등등..
- Larmina flow(균일하게 흐름) vs Turbulent flow(부딪혀서 거품생김) vs Steady state flow(잔잔히 흐름)
Water
특징
- Viscous함(낮긴하지만 표면장력등 약간 있음), Incompressible함(압축안됨)
- Ocean water: 바닷물
- 단순화 쌉가능. 표면만 보여주면됨.
- 반복적인 상하운동으로 표현(sin graph)
- Still water, Small waves: 작은물
- 파도가 일어남. volume이 그대로라는 특성을 이용
- 힘을 받은 부분은 들어가고 주위가 그만큼 올라옴. 또 올라온만큼 주위가 내려가고,, 시간에 대해 시뮬레이션.
- 결과적으로보면, surface만 보여지는것.
- General water
- 해안가라던지, 물을 따른다던지
- 이제는 Dynamics가 필요.
Smoke, Fire
특징
- Nonviscous함(끈적임 없이 잘 확산됨), Compressible(압축가능)
움직임
- Fire는 Heat에 의해 움직임
- Smoke는 Density에 의해 움직임
- 둘다 Particle에 의해 움직임
Fluid Dynamics
- Navier-Stokes Equation: Viscous가 있는경우 가장 유명한 방정식.
- Viscous가 없는경우엔, Particle을 이용.
- 매우 복잡한 계산과정이 있음. 이것을 단순화 하자!
CFD: Computational Fluid Dynamics
- Navior-stroke를 단순화한것.
- 크게 3가지 방법이 존재
- Grid based
- 물의 시뮬레이션에 좋음
- 특정 밀도를 갖는 grid로 나눠서 표현.
- 한곳의 밀도가 높아지면, 낮은곳으로 퍼져나감
- Particle based
- 유체 전체를 파티클의 합으로 보기
- 상수가 높아질수록 간단해짐
- Hybrid
- Notation
- Gradient:
- Divergence: 모든방향으로 나가는 속도, 힘의 합
- CFD를 통해 식이 단순화됨.
- 압이 일정하기 때문에 t만큼 변화할 때, 압력변화를 합으로 나타낼 수 있음
- 이를 통해 유체가 어디로 이동하는지 알 수 있음.
- 정리해보자면, grid로 나누고 각 공간의 밀도의 차이를 이용함. 높은 밀도에서 낮은 밀도로 확산되는 힘을 계산하여 가속도를 알아냄.
Hair Animation
- 참고자료로 Pixar 메리다의 곱슬머리 구현방법을 볼 수 있었다.
- Spring으로 곱슬을 표현하는데, 모양은 곱슬을 유지하되, 흔들릴 때, 변형이 자유로웠으면 했다함
- 그래서 그냥 Spring으로 표현하는것이 아니라 각 Sprig의 빈 공간을 또 다른 Spring으로 채우는 core spring을 개발했다함
- 확실히 모양은 살아있고 자연스러운 움직임이 표현되더라.
- Pixar의 디테일함을 볼 수 있었다.