Skip to main content
SPH 기법을 이용한
2D 물 물리 엔진 개발
김성완
21세기 마법사
(주)젬스푼
소개
김성완 (kaswan)
현 인디 게임 개발자(젬스푼)
현 부산게임아카데미 외래교수
현 동의대학교 게임공학과 외래교수
오즈인터미디어 CTO
미리내소프트웨어 개발이사
- 대표작 -
'썬더' (1992)
'풀메탈자켓' (1996 미리내소프트웨어)
'g-Matrix3D' (소프트웨어 렌더러 2003)
'와들와들 펭귄즈' (2013 젬스푼)
와들와들 펭귄즈 개발기
개발 개요
출시일 : 2013년 6월 12일
총 개발 기간 : 6개월(목표 4개월)
개발인원 : 3명 + alpha
타겟 플랫폼 : iOS 5.0 이상(iPhone, iPad 겸
용)
게임 엔진 : Cocos2d-x 2.0.4
개발 도구 : Xcode, Pixelmator, zwoptex
동영상 편집 도구: iMovie, Motion
개발관리 : Facebook Group, Google Doc
아들
딸
초기 컨셉 삽질기
와들와들 펭귄즈
최종 컨셉 확정
기술, 아이디어, 감성
기술 : 물 물리 엔진
아이디어 : 물을 얼리거나 녹여서 길을 만든
다.
감성 : 가족애
2D 물 물리 엔진 개발
목차
1. 물 물리 엔진 게임
2. 물이란 무엇인가?
3. 유체 시뮬레이션
4. 물을 입자로 다루는 SPH 기법
5. Signed Distance Fields를 이용한 물과의 충돌 처리
6. 얼음이 얼고 녹는 물의 상 변화 처리
모바일용 물 물리 게임들
● Where’s My Water? (Disney 2011)
○ Where’s My Ferry?
○ Where’s My Mickey?
● Sprinkle (2011)
○ Sprinke Junior
○ Sprinkle Island
● Watee (2011)
● Splash !!! (2012)
Where’s My Water? (Swampy)
Sprinkle
Watee
Splash !!!
물이란 무엇인가?
수도물
바다
수증기
물은 유체!
• 유체 流體 Fluid <--> Solid 固體 고체
• 액체와 기체를 합쳐서 부르는 용어
• 액체, 기체, 플라즈마
• 변형이 쉽고, 흐르는 성질이 있으며, 모양이
정해져 있지 않다.
• 점성, 압축성 (액체는 비 압축성)
물은 액체, 기체, 그리고 고체(얼음)
얼음
물의 상변화
구름은 물의 기체 상태?
FLUID SIMULATION
Obama & NSE
Navier-Stokes Equation
나비에 스톡스 방정식
유체(액체 , 기체) 시뮬레이션
연속방정식
물의 운동 = 압력 + 중력 + 점성
나비에-스톡스 방정식
● 점성이 있는 유체의 운동을 기술하는 비선
형 편미분 방정식
● Claude-Louis Navier, George Gabriel
Stokes
● 수치적인 해법으로 푼다.
● 해석적인 해는 아직 미지의 영역
● 클레이 수학 연구소 밀레니엄 7대 난제의
하나, 상금 US $1,000,000
Fluid Dynamics 2003
Jos Stam
Jos Stam
• 1999 Siggraph
• “Stable Fluids”
• 2003 GDC
• “Real-Time Fluid Dynamics for Games”
• http://www.dgp.toronto.edu/~stam/
• Autodesk
Stable Fluids
Stable Fluids
Hellgate: London (2007)
입자 기반의 유체 시뮬레이션
SPH 기법
SPH 기법
Smoothed Particle Hydrodynamics
1970년대 말에 천문학 분야에서 성운이나 은
하계를 시뮬레이션하기 위해 고안된 입자 기
반의 유체 시뮬레이션 기법
21세기에 와서 CG나 게임에서 물을 표현하
는데 활용
SPH 기법은?
일종의 확률 통계적인 근사
Smoothing Kernel 함수가 핵심 역할
은하계를 구성하는 수천억 개의 별을 십만
개로 대신 시뮬레이션 한다.
물은 1g에 약 3.35 x 10^22 개의 어마어마한
수의 물 분자를 수십만 개 심지어 수백 개로
대신 시뮬레이션 한다.
주요 논문
Müller et al, Particle-Based Fluid Simulation
for Interactive Applications, Switzerland,
2003http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.2.7720&r
ep=rep1&type=pdf
Clavet et al, Particle-based Viscoelastic
Fluid Simulation, Canada, 2005
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.59.9379&rep=rep1&
type=pdf
Particle-Based Fluid Simulation for Interactive
Applications
Particle-based Viscoelastic Fluid
Simulation
SPH neighbour interactions
SPH neighbour interactions
SPH 기법의 속살을 잘 보여주는 동영상
가까이 이웃한 입자 간의 상호작용을 처리하기
위해서 입자들의 위치 관계를 빠르게 검색해
야 한다.
이웃한 입자들 간의 상호작용을 적절하게 처리
해야 액체의 점성이나 비압축성등이 표현된다.
http://youtu.be/h2ovz9Cwstc
빠른 이웃 검색을 위한 자료구
조
단순 격자로 구획을 나누어서 처리
상호작용 계산
Smoothing Kernel 함수
커널 함수의 역할
적은 입자 수로 천문학적으로 많은 입자의
연속체 적인 값을 근사할 수 있게 해준다.
시뮬레이션의 품질, 안정성, 속도는 커널 함
수의 선택에 크게 의존한다.
커널 함수를 정하는 것은 어느 정도 시행착
오적인 경험에도 의존한다.
Smoothing Kernels (Müller)
밀도, 압력, 점성
near-density kernel (Clavet)
시뮬레이션 계산은?
중력, 밀도, 압력, 점성, 충돌
1. 중력을 적용
2. 이웃 검색으로 점성 계산
3. 속도에 점성을 적용(일종의 마찰력)
4. 밀도, 압력을 계산
5. 압력을 적용 (일종의 힘)
6. 충돌 처리
7. 반복
물 물리 게임 개발기 검색
Interview: Disney Mobile's Tim FitzRandolph on 'Where's
My Water?'
http://content.usatoday.com/communities/gamehunters/po
st/2011/10/interview-disney-mobiles-tim-fitzrandolph-on-
wheres-my-water/1#.UjCXq2QkJnI
Sprinkle behind the scenes (Game physics bits)
http://tuxedolabs.blogspot.kr/2011/11/sprinkle-behind-
scenes.html
Where’s My Water?
water physics
물입자 갯수 비교
Where’s My Water
200개 (추정)
Sprinkle
600개
Waddle Waddle Penguins
600개
성능 테스트
유체 물리 엔진 개발은 어려운
가?
유튜브에서 유체 시뮬레이션 동영상들을 쉽게 찾을 수 있다.
온전하게 잘 동작하는 모습이 공개되어 있다.
소스까지 공개된 경우도 적지 않다.
학술 논문도 바로 코딩할 수 있을 정도로 상세하게 의사 코
드가 실려있는 것도 있다.
하지만 실제로 유체 물리 엔진을 제대로 만들기는 매우 어렵
다.
물 물리 엔진 초기 테스트
물 물리 엔진 테스트
물 물리 엔진 테스트 동영상
http://youtu.be/KsdDqKLh6pc
이런 건 잘 공개하지 않는 영상
'와들 와들 펭귄즈'를 위한 물 물리 엔진 테스트
동영상
엔진이 불안정 해져서 결국은 폭발한다.
유체 물리 엔진 개발의 어려움
논문의 의사 코드를 실제로 동작하는 코드로 옮겨도 겨우 돌아가기
는 하겠지만 실제적으로 사용하기 위해서는 많은 조정이 필요하
다. 이런 조정을 튜닝이라 한다.
강체 물리 엔진의 경우는 상업적인 엔진이 아닌 공개 엔진이라고 해
도 튜닝이 딱히 필요 없을 정도로 탄탄하게 실행된다. 특별하게 극
단적인 설정만 하지 않는다면 게임에서 물리 엔진에 의한 불안정
함 없이 안심하고 사용할 수 있다.
하지만 유체 물리 엔진의 경우는 아직 범용적으로 막 사용할 수 있
는 엔진은 드물다.
모바일 환경에서는 더 어렵다
최신 쿼드코어 스마트폰이라고 해도 데스크탑
에 비해 성능이 떨어지는 모바일 환경에서는
유체를 시뮬레이션 하기가 벅차다. 저사양 스
마트폰이라면 2D 로도 벅차다.
모바일 환경에서 안정적으로 돌아가는 유체 물
리 엔진을 위해서는 많은 최적화와 튜닝이 필
요하다.
구글링이 가장 좋은 선생
선행 연구자들Tom Madams
Grant Kot
박사 과정 연구도 간접적으로 도움이 되었다
● 지구과학 내 기상학 전공
○ 강우 현상 시뮬레이션
● 화산재 확산 연구 참여
○ 화산재 확산 시뮬레이션
Tom Madams’ Blog
Why my fluids don’t flow
http://imdoingitwrong.wordpress.com/2010/
12/14/why-my-fluids-dont-flow/
Grant Kot
http://grantkot.com/
Box2D 로도 가능한가?
Box2D 로도 가능한가?
강체물리 엔진인 Box2d로 비슷하게라도 유체
를 흉내내려면 입자를 원 모양의 다각형 강체
로 해서 적절한 충돌 계수와 마찰 계수를 주면
된다.
http://<wbr />www.emanueleferonato.com/2012/<wbr />05/16/<wbr />simulating-
mudslime-with-box2d-<wbr />bitmaps-and-filters/
하지만 이 방법으로는 물이 쏟아지거나 튀는 모
습 정도는 엇비슷하게 표현할 수 있어도 점성
이 있는 액체를 제대로 표현할 수는 없다.
SPH vs Box2d 의 속도
SPH : 유체 입자를 단순한 점으로 다룬다.
Box2d : 유체 입자를 원형의 다각형 강체로
처리한다.
충돌이나 마찰 처리 등에 많은 비용이 든다.
결국 같은 입자 수로 구현한다면 SPH에 비
해 Box2d 엔진이 훨씬 느리게 된다.
물의 렌더링은 어떻게?
물의 렌더링
SPH 는 물을 입자로 시뮬레이션 하기 때문
에 그대로는 물처럼 보이지 않는다.
물 입자들이 서로 연속된 덩어리로 보이게
해야 한다.
2D Metaball 렌더링 기법이 이용되었다.
추가적인 굴절 효과 등은 제외했다.
2D 메타볼 렌더링
2D 메타볼 이미지
겹쳐서 렌더링
알파 문턱 값 적용
참고
2D Metaballs in XNA (NullCandy)
http://nullcandy.com/2d-metaballs-in-xna/
SIGNED DISTANCE FIELDS 를 이용
한 충돌처리
PixelJunk Shooter 2 (PS3)
SIGGRAPH talk
Signed Distance Fields 란?
부호 있는 거리 장
일종의 스칼라 장으로 가장 가까운 경계 면
까지 거리 값으로 채워진다.
부호 있는 거리 장은 경계면 내부와 외부를
부호로 구분한다. 실제 8비트(0~255)로 저
장할 경우 128을 경계로 한다.
Signed Distance Fields 장점
자유로운 형태의 지형을 나타낼 수 있다.
지형의 복잡도와 상관없이 충돌 검출에 상수 시간 밖에 걸리지
않는다.
충돌 면에 수직인 법선 벡터를 손 쉽게 구할 수 있다. Signed
Distance Fields는 지형의 경계 면에서 법선 벡터를 손쉽게 구
할 수 있다. 미분 연산으로 입자가 있는 지점의 그레디언트 값
을 구하면 그게 바로 법선 벡터의 성분이 된다.
해상도를 낮추어도 자연스런 충돌 검출과 처리가 가능하다.
Signed Distance Fields 생성
오프라인에서 미리 계산한다.
해상도를 낮추더라도 실시간으로는 생성하
기는 모바일에서는 무리다.
여러가지 알고리즘들이 있지만 게임에 사용
한 건 8SSEDT 이다.
8SSEDT 구현 소스
http://www.codersnotes.com/notes/signed-
distance-fields
논문 :
F. Leymarie and M. D. Levine, A Note on
“Fast Raster Scan Distance Propagation
on the Discrete Rectangular Lattice” 1992,
Canada
http://www.lems.brown.edu/vision/people/ley
marie/Refs/CompVision/DT/DTpaper.pdf
8SSEDT 실행 예