Real Face Skin Deformation
Real Skin Deformation
- 피부의 표현에 물리적 반응을 넣어서 충돌에 Dynamic하게 반응하도록 했습니다.
- 높은 퀄리티의 물리적인 반응 및 시뮬레이션이 가능합니다.
- 게임에 적용한다면 조금 더 퀄리티 높은 action sequence를 만들수 있습니다.
- AAA게임들을 보면 정말 화려한 액션과 연출로 게임에 재미를 추가해 줍니다.
- 하지만 피부 표현은 정말 고퀄리티지만 정작 피부의 물리적인 충돌은 표현되어 있지 않습니다.
- 저는 여기서 Reality skin physics를 만들어 보고 싶어서 시작하게 되었습니다.
-
Detailed Rigid Body Simulation with Extended Position Based Dynamics
https://matthias-research.github.io/pages/publications/PBDBodies.pdf -
A Constraint-based Formulation of Stable Neo-Hookean Materials
https://matthias-research.github.io/pages/publications/neohookean.pdf
- 캐릭터들은 보통 bone이 정해져 있고 거기에 mesh(skin)가 따라옵니다.
- 피부가 접히는 부분에 preprocessing을 통해 조금 더 리얼하게 표현이 가능합니다.
- Preprocessing과 다르게 따로 처리를 해주지 않습니다.
- Real time으로 mesh안의 particle끼리의 충돌을 계산하여 처리합니다.
- Real time으로 mesh안의 particle끼리의 충돌을 계산하여 처리합니다.
- Preprocessing으로 했을 때 하나하나 다 처리해줘야 하는 불편함과 Real time으로 했을 때 texture가 깨지는 현상을 모두 해결할 수 있습니다.
- Skin deformation을 위해서는
XPBBD가 들어갑니다. - XPBD는 기존의 PBD를 논문에서 바꾼 것으로 skin deformation을 하기 위한 조금 더 효율적인 알고리즘입니다.
- XPBD의 Solve과정에서는 skin을 soft하게 만들어 주기 위해서
Distant와Volume Constraint작업을 진행합니다. Constraint는 mesh의 particle이 원래 위치에서 벗어나면 다시 원래 위치로 돌아가게끔 해주는 힘입니다.Distant는 particle사이의 edge거리에 따른 Constraint이고Volume은 4개의 particle로 이루어진 사면체의 volume 크기에 따른 Constraint입니다.
Paper mesh VS Unreal mesh
Tetrahedral Mesh: Tet mesh라고 불리며 보통 논문에서 simulation을 할 때 많이 사용합니다.- 속이 꽉 차 있어서 particle간의 simulation에 용이합니다.
Static Mesh: 보통 Tri mesh를 많이 사용합니다.- 속이 비어있는 mesh로 게임에서 많이 사용합니다(계산이 쉽고 간편합니다).
Paper Mesh To Unreal Mesh
- Unreal Mesh를 Paper Mesh로 바꾸려고 blender의
BlenderTetPlugin을 Unreal에 가져와서 적용했습니다. https://github.com/matthias-research/pages/blob/master/tenMinutePhysics/BlenderTetPlugin.py - 하지만 왜인지 잘 안되었습니다...
- 그래서 어쩔 수 없이 Unreal mesh에서 논문의 기술을 사용하도록 논문 코드를 변형했습니다.
- Volume Constraint부분에서 Tet mesh는 particle이 안까지 꽉 차있기 때문에 particle간의 volume constraint가 잘 일어납니다. 하지만 Unreal mesh는 mesh안이 비어있기 때문에 Volume Constraint가 거의 일어나지 않습니다.
- 따라서 Vlume constraint부분을 수정하여 face constraint로 수정하였습니다.
- Mesh Deformation을 Real time으로 실행해봤습니다.
- Mesh가 계획한 대로 탄력있게 튀어오르는 결과가 나왔습니다.
- 하지만 Real skin으로 보기에는 너무 결과가 Dynamic해서 조금 static하게 optimization을 해줘야 합니다.
- Skin과 Bone을 설정해서 늘어날 때는 skin보다 늘어나지 못하고, 줄어들 때는 bone보다 줄어들지 못하게 preprocessing을 진행했습니다.
Optimization Result
Demo video https://youtu.be/kvyevt88Fio








