TECH 으로 돌아가기
TECH HACKER NEWS 2주 전 6분 읽기 108 READS

물과 연기는 어떻게 화면 위를 흐를까 — 유체 시뮬레이션의 기본 원리

게임 속 연기와 물, 그 뒤엔 수학이 숨어 있어요

게임이나 영화에서 연기가 스르륵 피어오르고, 물이 찰랑이며 흐르는 장면 본 적 있죠? 처음 보면 "이걸 대체 어떻게 만들지?" 싶거든요. 그런데 이런 유체(fluid, 물·연기·불처럼 흐르는 것들) 표현의 바탕에는 의외로 우리가 학교에서 배운 수준의 수학과, 몇 가지 똑똑한 트릭이 깔려 있어요. 오늘 소개할 건 그 기본 원리를 아주 친절하게 풀어주는 고전적인 설명이에요. 어려운 미분방정식 논문을 안 봐도, '대충 어떤 흐름으로 계산되는구나'를 이해할 수 있게 도와줘요.

유체를 '격자'로 쪼개서 다뤄요

먼저 핵심 아이디어부터요. 컴퓨터는 연속된 물을 그대로 다룰 수 없어요. 그래서 공간을 바둑판처럼 작은 칸(cell)으로 나눠요. 이걸 격자(grid)라고 부르거든요. 그리고 각 칸마다 두 가지 정보를 들고 있어요.

우리가 화면에서 보는 '연기'는 사실 이 밀도 값이에요. 짙은 칸은 진하게, 옅은 칸은 흐리게 그려주면 연기처럼 보이는 거죠. 그리고 그 연기를 실어 나르는 게 속도 필드(field, 칸마다 값이 퍼져 있는 판)예요.

세 단계만 반복하면 돼요: 확산 → 이류 → 투영

시뮬레이션은 매 프레임마다 이 세 단계를 반복해요.

1) 확산(diffuse) — 잉크 한 방울이 물에 퍼지듯, 진한 칸의 값이 주변 칸으로 조금씩 번져나가는 단계예요. 옆 칸들과 값을 평균 내듯 섞어주는 거죠.

2) 이류(advection) — 가장 중요한 부분이에요. 유체가 흐르니까, 속도를 따라 밀도가 실려 이동해야 하거든요. 여기서 똑똑한 트릭이 나와요. "이 칸의 값을 앞으로 밀어내자"가 아니라, "이 칸의 값은 한 스텝 전에 어디서 흘러왔을까?"를 거꾸로 추적해요. 현재 칸에서 속도를 반대로 따라가 과거 위치를 찾고, 그 지점의 값을 가져오는 거죠. 이걸 세미-라그랑지안(semi-Lagrangian) 방식이라고 불러요. 거꾸로 추적하면 계산이 절대 폭발하지 않아서(값이 무한대로 튀지 않아서) 아주 안정적이에요.

3) 투영(projection) — 물 같은 유체는 압축이 안 되거든요(부피가 안 줄어요). 그런데 위 단계들을 거치면 어떤 칸은 물이 몰려들고 어떤 칸은 비는 모순이 생겨요. 그래서 압력을 계산해서, 몰린 곳에서 빈 곳으로 흐름을 보정해줘요. 이 보정 덕분에 소용돌이 같은 자연스러운 움직임이 살아나요.

반복 계산으로 풀어내는 '압력'

확산과 투영 단계에서는 '주변 칸과 균형을 맞추는' 방정식을 풀어야 하는데요, 한 번에 정답을 못 구해요. 그래서 가우스-자이델(Gauss-Seidel) 같은 방법으로 같은 계산을 20번쯤 반복하면서 점점 정답에 가까워지게 만들어요. 이게 뭐냐면, '추측 → 살짝 보정 → 다시 보정'을 여러 번 돌려 수렴시키는 거예요. 정확도와 속도 사이에서 반복 횟수를 조절하는 거죠.

업계 맥락에서 보면

이 방식의 뿌리는 Jos Stam이 1999년에 발표한 Stable Fluids 논문이에요. 그 전까지는 시뮬레이션이 조금만 빨라도 값이 터져버렸는데, '거꾸로 추적' 트릭으로 안정성을 확보하면서 실시간 유체의 길을 열었거든요. 오늘날 Houdini 같은 영화용 VFX 툴, 게임 엔진의 연기·불 이펙트가 다 이 계보 위에 있어요. 물론 더 발전한 방식들도 많아요. 입자 하나하나를 물방울처럼 다루는 SPH/FLIP 방식이라든가, GPU로 수백만 칸을 병렬 계산하는 방식이요. 하지만 격자 기반의 이 기본기를 알면 그 모든 응용이 훨씬 쉽게 와닿아요.

한국 개발자에게 주는 시사점

그래픽스나 게임 쪽이 아니어도 배워둘 가치가 충분해요. 여기 담긴 '연속된 문제를 격자로 쪼개고, 반복 계산으로 수렴시킨다'는 사고방식은 물리 시뮬레이션뿐 아니라 이미지 처리, 머신러닝의 수치 최적화에도 그대로 통하거든요. 셰이더나 WebGL로 작은 유체 데모를 직접 만들어보면, 평소 추상적으로만 느껴지던 미분방정식이 손에 잡히는 경험을 할 수 있어요. 주말 사이드 프로젝트로 딱 좋아요.

마무리

결국 유체 시뮬레이션은 격자에 속도·밀도를 담고, 확산·이류·투영을 반복하는 것으로 요약돼요. 어렵게만 보이던 게 의외로 단계가 명확하죠. 여러분은 '거꾸로 추적해서 안정성을 얻는' 이 아이디어, 어떤 다른 문제에 응용해볼 수 있을 것 같으세요?


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://www.mikeash.com/pyblog/fluid-simulation-for-dummies....
SHARE
처리 중...