
게임 엔진에서 유체를 시뮬레이션한다는 것
수영장에 손을 넣고 휘저으면 물결이 퍼지잖아요. 그 움직임을 컴퓨터 안에서 똑같이 만들어내려면 어떻게 해야 할까요? 이걸 다루는 게 바로 Navier-Stokes 방정식이에요. 들어본 적 있으실 거예요. 밀레니엄 7대 난제 중 하나로, 해가 매끄럽게 존재하는지조차 아직 증명 안 된 그 방정식 말이에요. 수학자들에게는 100만 달러짜리 문제지만, 게임 개발자들에게는 "멋진 연기 효과를 어떻게 만들지" 같은 실용적인 도구거든요.
이번에 화제가 된 글은 이 무서워 보이는 방정식을 오픈소스 게임 엔진 Godot 안에서 한 줄 한 줄 풀어내면서 설명한 튜토리얼이에요. Unity나 Unreal이 아니라 Godot라는 점이 흥미로운데, Godot는 가벼우면서도 셰이더와 컴퓨트 기능을 갖춰서 이런 실험에 적합하거든요.
Navier-Stokes를 쉽게 풀어보면
방정식 이름은 무섭지만 의미는 의외로 직관적이에요. 유체의 속도가 어떻게 변하는지를 네 가지 힘으로 설명하거든요. 첫째는 이류(advection). 물이 흐르면서 자기 자신을 운반하는 거예요. 강물에 잉크를 떨어뜨리면 잉크가 물길을 따라 흘러가잖아요. 그게 이류예요. 둘째는 확산(diffusion). 점도(viscosity) 때문에 빠른 부분이 느린 부분을 끌고 가고, 느린 부분이 빠른 부분을 잡아당기는 거죠. 꿀이 물보다 끈적한 이유가 점도가 높아서예요. 셋째는 외력(external force), 중력이나 사용자가 마우스로 휘젓는 힘 같은 거고요. 넷째는 압력(pressure) 항. 유체가 한 곳에 쌓이지 않도록 균형을 잡아주는 역할이에요.
이걸 한 프레임마다 순서대로 계산하면 화면 위에 진짜 유체처럼 움직이는 그림이 나와요.
Jos Stam의 '안정된 유체' 트릭
실시간으로 이걸 풀려면 수치적으로 불안정한 문제가 생겨요. 시간 간격(dt)이 조금만 커져도 시뮬레이션이 폭발해버리거든요. 여기서 1999년에 Jos Stam이 SIGGRAPH에 발표한 "Stable Fluids" 논문이 게임 그래픽스의 게임체인저였어요. 이 사람이 제안한 세미-라그랑지안 이류(semi-Lagrangian advection) 방법이 핵심인데, 쉽게 말하면 "지금 이 픽셀의 값은 한 시간 스텝 전에 어디서 왔을까?"를 거꾸로 추적해서 가져오는 방식이에요. 정방향으로 계산하면 폭발하는데, 역방향으로 추적하면 안정적이거든요. 마법 같은 트릭이죠.
튜토리얼은 이 흐름을 Godot의 컴퓨트 셰이더(compute shader)로 구현해요. 컴퓨트 셰이더가 뭐냐면, GPU의 병렬 연산 능력을 그래픽 렌더링이 아닌 일반 계산에 쓰는 도구예요. 격자(grid) 위에서 모든 셀의 속도를 동시에 계산해야 하니까 CPU로는 답이 안 나오거든요. GPU가 수천 개의 셀을 한 번에 처리해줘야 60FPS가 나와요.
압력 투영, 가장 까다로운 부분
네 단계 중에서 가장 까다로운 게 압력 투영(pressure projection)이에요. 비압축성 유체(물처럼 부피가 안 변하는 유체)는 발산(divergence)이 0이어야 하거든요. 쉽게 말해서 한 셀로 들어가는 양과 나가는 양이 같아야 한다는 거예요. 그런데 이류와 외력을 적용하고 나면 이 조건이 깨져요. 그래서 푸아송 방정식(Poisson equation)을 풀어서 압력 필드를 구하고, 그걸로 속도를 보정해야 해요. 이 푸아송 방정식 푸는 데 보통 자코비 반복(Jacobi iteration)을 20~50번 정도 돌려요. GPU에서 가장 비용이 큰 부분이고, 시뮬레이션 품질을 좌우하는 지점이죠.
다른 접근들과 비교해보면
게임 업계에서 유체를 다루는 방식은 여러 가지예요. 이번 튜토리얼처럼 격자 기반인 오일러리안(Eulerian) 방식이 있고, 입자 하나하나를 추적하는 라그랑지안(Lagrangian) 방식인 SPH(Smoothed Particle Hydrodynamics)도 있어요. 영화 VFX에서 많이 쓰는 Houdini의 FLIP/PIC 같은 방법은 둘을 섞은 하이브리드고요. NVIDIA의 PhysX, Unity의 VFX Graph도 비슷한 기법을 자기 방식으로 래핑한 거예요. Godot에서 직접 셰이더로 풀어보면 이런 상용 솔루션이 내부에서 뭘 하고 있는지가 보이거든요. 블랙박스가 화이트박스가 되는 거죠.
한국 개발자에게
실무에서 Navier-Stokes를 직접 풀 일이 자주 있지는 않을 거예요. 하지만 이런 시뮬레이션을 한 번 손으로 구현해보면 얻는 게 많아요. GPU 컴퓨트 셰이더 작성법, 수치해석의 안정성 감각, 그리고 "실시간이라는 제약 아래에서 정확도를 어떻게 타협하는가"에 대한 직관 같은 거요. 인디 게임이나 인터랙티브 미디어 아트, WebGL 기반 시각화 작업하시는 분들에게는 직접적인 무기가 될 수도 있고요. 최근에는 LLM 학습에 시뮬레이션 데이터를 쓰는 경우도 늘고 있어서 의외로 쓸모가 넓어요.
특히 Godot는 한국에서도 사용자층이 조금씩 늘고 있는 엔진이라 자료가 귀한 편인데, 이렇게 깊이 있는 튜토리얼이 나왔다는 게 반갑네요.
마무리
수학 시간에 봤던 미분방정식이 화면 위에서 물처럼 출렁이는 걸 직접 보면, 추상적인 수식이 손에 잡히는 감각으로 바뀌어요. 그 경험 자체가 개발자에게 자산이 되거든요.
여러분은 게임 엔진에서 물리 시뮬레이션 직접 만들어본 경험이 있으세요? 격자 기반과 입자 기반 중에 어떤 게 더 직관적이라고 느끼시나요?
🔗 출처: Hacker News
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공