Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags more
Archives
Today
Total
관리 메뉴

테드옹의 VFX

FLIP Solver 본문

Houdini

FLIP Solver

Tedd_Kim 2023. 2. 22. 17:43

FLIP 시뮬레이션은  파티클 + 볼륨을 섞어서 궁극적으로 파티클의 포지션을 업데이트하는 것이다.

 

따라서, 볼륨만을 이용해서 움직임을 나타내는 pyro 시뮬레이션과는 달리

FLIP시뮬레이션은 아웃풋 오브젝트가 파티클이고, 후에 이것을 mesh로 변환하여 렌더링을 하는 것.

 

Solver안을 들어가보면 파티클과 볼륨을 둘 다 쓰기 때문에 굉장히 복잡하다.

특히 pyro에선 고려하지 않는 surface tension, air compresibilty 등등 내부 force계산이 많기 때문에 보통 아웃풋을 내는 데 smoke 시뮬레이션보다 더 복잡하고 오래 걸림. 그냥 차치하고 Pyro solver내부와 FLIP solver내부를 비교해보면 FLIP이 훨씬 복잡한 연산이 들어가는 것을 알 수 있다.

 

파티클 방식의 좋은 점은, 그저 움직이지 않고 공간을 점유하고 있을 뿐인 볼륨의 복셀과는 달리, 파티클은 어트리뷰트가 직접 붙어있기 때문에 소실되는 데이터가 없이 직접 움직인다는 점이다. 근데 볼륨을 왜 쓰느냐? pressure연산과 비압축유동을 만들기에 빠르고 적합하기 때문이다.

 

 

FLIP, PIC, APIC 모두 파티클과 볼륨을 섞은 하이브리드 시뮬레이션이다.

SideFX의 가이드 상으로 FLIP은 대규모의 splash씬, APIC은 회전이 들어간 그리고 표면에 노이즈가 적어야하는 소규모씬에서 사용한다고 한다. velocity를 어떻게 전달할지에 대해서 두 모델에 차이가 있는 모양

 

Pyro-solver에 비해 미친듯이 방대하고, 이해하기가 어렵지만 일단 솔버의 순서는 이렇다.

 

 

1. 파티클에 초기값을 설정(포지션, 벨로시티 등등), 연산을 해야하는 볼륨 필드들 초기화

2. v값을 외부의 힘과(gravity, wind etc.) 내부의 힘(viscosity, surface tension etc.)으로 업데이트 한 후, 볼륨 그리드로 샘플링

3. 충돌과 바운드 계산

4. vel field의 발산(divergence) 값을 없애기 위하여 pressure projection 진행

5. 최종 합산된 정보를 파티클 v값으로 카피

6. v값을 기반으로 위치 변경(semi-lagrangian 방식)

 

볼륨 필드(vel, pressure etc)들은 매 타임스텝마다 초기화된다. 지속해서 유지되는 건 파티클의 어트리뷰트들 뿐이다.

그리고 이건 SideFX에서도 설명이 없어서 구글과 챗GPT를 이용해서 알아낸 정보인데, 그래서 정확하지 않음

 

- 각 복셀의 velocity가 발산값이 0인지 아닌지를 판단하는 방법은 Finite difference approximation방법을 사용해서 인접 복셀들의 vel값들의 변화율(도함수, 영어로 derivative라고 함)을 고려하고 근사값을 구해낸다.

- 이게 0이 아니면 적절히 pressure(Possion 방정식을 통해 pressure gradient를 만듦)나 velocity를 조절하여 해당 복셀의 발산값을 0으로 만든다

 

pyro solver에서는 테스트만 Modified Maccormack, Forward Euler방식을 써서 빨리빨리 모션을 보고

어느 순간부터는 BFECC와 MK2 혹은 MK4로 바꾸는데 FLIP은 건들지 말라고 SideFX에서 아예 파라미터를 숨겨놨으니까, 괜히 뭐 해보겠다고 솔버 까는 짓은 안해야겠다고 판단이 선다.

 

FLIP의 장점이자 어려운점은 POP force와 Field force를 둘 다 쓸 수 있음