github
https://github.com/GbLeem/Unreal_MPM
프로젝트 결과 영상
https://youtu.be/Ec28TGyPb-g
주제 선정
진행 과정
- 논문의 코드는 MLS-MPM 은 Taichi라는 라이브러리를 이용하여 구현되어 있었다. 그래서 이 라이브러리를 Unreal에 이용하고자 여러 자료들을 찾아보았지만, 좋은 방법이 없어서 이 방법을 사용하지 않게 되었다.
- Unity에 구현된 코드 (https://nialltl.neocities.org/articles/mpm_guide) 를 많이 참고하였다. 기본적인 Unreal C++코드의 틀을 만드는데 참고하였고, 2D로 구현되어 있는 코드에 z축을 추가하여 3D로 만들어서 구현하였다.
- MPM 관련 이론과 파라메터값들에 대해 공부하면서는 MPM course와 MPM snow 논문을 많이 참고했다.
어려웠던 점
- 파라메터 값 설정이 어려웠다. 여러 수식에 있어서 approximation 한 경우 변수가 아니라 그냥 상수를 곱해서 값을 맞춘 경우가 많았고 이 값 대신, Unreal 엔진에서 맞는 값 (파라메터들을 Unreal 물리 환경에 맞추는 작업)을 찾기가 어려워서 많은 시도가 필요했다.
- 또한 행렬 연산에 있어서 계산 결과를 확인하기 어려운 점도 존재했다. 계산 결과를 확인하기 위해
UE_LOG()
를 사용해서 확인했었다. 이럴 때 어떤 방식으로 디버깅하면 좋을지도 앞으로 생각해 봐야할 것 같다. 또한 Matrix를 위해 사용하는 타입에 PMatrix 라는 타입이 있는 것을 모르고, FMatrix를 사용했는데 3x3 matrix 가 존재하지 않아서 직접 연산자와 함수를 만들어서 연산했는데, 제대로 된 결과가 나오지 않았다. 그래서 검색을 하던 도중 Chaos system에 존재하는 PMatrix라는 타입을 찾게 되었고, template 형태로 구현되어 있어서(PMatrix<float, 3, 3>
) 유용하게 사용할 수 있었다.
- 성능을 높이는 것이 쉽지 않았다. CPU만 쓰다보니 3차원의 경우 파티클의 수를 늘리는데 한계가 존재해서 실제 시뮬레이션과 유사한 갯수까지는 구현하지는 못했다.
CUDA
중간에 성능을 높이고자, 그리고 새로운 기술을 접해보자는 생각으로 CUDA를 시작했다. static library를 만들어서 Unreal과 연동하는데 까지는 성공했지만, 시간이 부족하다고 생각이 들어서 실제 연산에까지는 적용하지 못했다. 이번 방학 동안에는 CUDA를 공부하고, CUDA를 해당 Unreal 프로젝트에 적용해서 성능을 높여볼 생각이다.
더 보기 좋게
게임에서는 보기 좋게 만드는 것이 중요하다. 어떤 방식으로 랜더링을 할지 (아니면 텍스쳐링?) 고민이 필요할 것 같다. 파티클 시뮬레이션에서는 어떤 방식을 써서 랜더링 하는지를 좀 찾아보고 적용해보면 좋을 것 같다.
결과
가장 마음에 드는 씬 두 개이다. 아직 텍스쳐링이나 파티클의 수가 너무 적어서 실제 물리 현상과 비슷하다고는 할 수 없지만, MPM 의 파이프라인을 구현해보고 예상한 결과가 나왔다는 생각이 들어서 만족하는 결과물이다.
앞으로
- 가장 먼저 CUDA 공부를 좀 해 볼 생각이다. GPU를 다뤄보았다는 것이 나의 장점이 될 것이라는 생각이 들고, 요즘은 특히 딥러닝 쪽에서도 연산 속도를 위해 CUDA를 쓰기 때문에 공부가 필요하다고 느껴졌다.
- CUDA를 통해 파티클 수를 늘려서 시뮬레이션하고, 시각적으로 보기 좋게 만들 것이다. 원래 목표는 눈, 물, 모래 시뮬레이션이었기 때문에 랜더링이나 텍스쳐링 (어떤 방법을 쓸지는 잘 모르겠다 공부가 필요할 듯)을 적용하여 기존 프로젝트를 좀 더 업그레이드 해서 논문에 내용을 추가할 것이다. 또한 블루프린트와 C++를 연동해서 파라메터 값들을 바꾸기 쉽게 만들어서 시뮬레이션 결과를 좀더 쉽게 확인해 볼 수 있도록 편리성을 추가해 볼 생각이다.