연기 유체 시뮬레이터베타
드래그로 색 연기를 뿌려 소용돌이치는 실시간 유체를 실험
이 도구는 아직 안정화 중인 베타 버전입니다. 결과가 예상과 다르면 알려주세요.
화면을 드래그하면 그 방향으로 유체를 밀면서 색 연기를 뿌립니다. 매 프레임 Jos Stam의 Stable Fluids 방법으로 속도장을 확산(점성)·이류시키고, 압력을 풀어 발산이 0이 되도록 투영해 소용돌이가 자연스럽게 생깁니다. 뿌린 연기는 뜨거워서 부력으로 떠오르고, 식으면서 천천히 멈춥니다. 소용돌이 보존(와도 보정)은 격자 때문에 뭉개지는 작은 소용돌이를 되살려 연기 가장자리가 말려 올라가게 합니다. 점성을 높이면 꿀처럼 끈적해지고, 소멸 속도를 0으로 두면 연기가 사라지지 않습니다.
처리 중…
0.0
멈춘 것이 아닙니다. 계산이 끝나면 결과가 표시됩니다.
연기 유체 시뮬레이터 소개
이 도구는 조스 스탬(Jos Stam)이 1999년 SIGGRAPH에서 발표한 Stable Fluids 방법을 그대로 따른다. 정사각형 격자(64², 128², 192² 중 선택) 위에 속도장과 빨강·초록·파랑 세 가지 염료 농도를 저장하고, 매 프레임 속도를 확산(점성) → 투영 → 이류 → 투영 순서로, 염료를 확산 → 이류 → 소멸 순서로 갱신한다. 화면을 끌면 손가락 위치에 가우스 모양으로 속도와 염료를 더한다.
이름처럼 연기답게 움직이도록 온도와 부력을 넣었다. 뿌린 연기는 뜨거워서 위로 뜨는 힘(부력)을 받고, 흐름을 따라 옮겨지면서 초당 약 45%씩 식어 차츰 덜 뜬다(Fedkiw 등 2001의 방식). 색 염료 자체는 흐름을 밀지 않는 추적자다. 부력 슬라이더를 0으로 내리면 연기가 피어오르지 않고 내가 밀어 준 운동만 퍼지고 줄어든다. 사방은 닫힌 벽이다.
“stable”이 뜻하는 것
이전의 명시적 방법은 한 프레임 동안 유체가 한 칸 넘게 움직이면 값이 폭발했다. 스탬의 방법은 두 가지로 이 제한을 없앴다. 첫째, 이류를 “이 칸의 값은 한 프레임 전 어디서 왔나”를 거꾸로 추적해 그 자리를 보간해 가져오는 반(半)라그랑주 방식으로 푼다. 보간값은 주변 값 사이에 있으므로 새로운 극값이 생기지 않는다. 둘째, 점성 확산을 암시적으로 풀어 계수가 커져도 발산하지 않는다.
대가는 정확도다. 보간을 할 때마다 작은 소용돌이가 조금씩 뭉개지는 수치 점성이 생긴다. 점성 슬라이더를 0에 두어도 소용돌이가 서서히 약해지는 것은 이 때문이다. 해상도를 64²로 낮추면 그 효과가 더 커져 소용돌이가 빨리 사라지고, 192²로 올리면 가는 줄무늬가 더 오래 남는다. 2001년 페드키우·스탬·옌센은 이렇게 사라진 회전을 되살리는 “소용돌이 보존(vorticity confinement)” 항을 추가했는데, 이 도구에도 「소용돌이 보존」 슬라이더로 그 항을 넣었다. 올리면 연기 가장자리가 잘게 말려 올라가고, 너무 올리면 흐름이 거칠게 요동친다.
투영: 소용돌이가 저절로 생기는 이유
물이나 느린 공기는 거의 압축되지 않는다. 격자로 말하면 각 칸에 들어오는 양과 나가는 양이 같아야(발산 0) 한다. 투영 단계는 속도장에서 발산이 생긴 부분을 압력으로 해석해 빼낸다. 이를 위해 푸아송 방정식을 과이완(SOR, ω = 1.8) 가우스–자이델 반복으로 푼다. 격자가 클수록 수렴이 느려지므로 반복 횟수를 해상도에 맞춰 늘린다(64²·128²는 20회, 192²는 30회).
화면을 한 방향으로 곧게 그어 보면 그 차이가 드러난다. 앞으로 밀린 유체는 갈 곳이 없어 양옆으로 비켜서고, 뒤쪽은 비어 버린 자리를 옆에서 채운다. 그 결과 붓 자국 끝 양쪽에 반대 방향으로 도는 소용돌이 한 쌍이 생긴다. 사람이 소용돌이를 그린 것이 아니라, 부피를 지키라는 조건 하나가 만들어 낸 모양이다. 반복 횟수가 정해져 있어 발산이 완전히 0이 되지는 않지만, 예전의 20회 가우스–자이델은 192²에서 발산이 속도 기울기의 약 17%나 남았던 것을 지금은 약 2%로 줄였다.
슬라이더가 실제로 바꾸는 값
- 점성: 슬라이더 값 × 10⁻⁴이 운동 점성계수(영역 폭 = 1 기준)가 된다. 최대 10이면 10⁻³이다. 128² 격자에서 한 프레임(1/60초)의 확산 계수 a = dt·ν·N² ≈ 0.27로, 붓 자국이 몇 초 안에 뭉개지는 꿀 같은 흐름이 된다.
- 연기 번짐: 염료만 확산시킨다(슬라이더 × 10⁻⁵). 흐름은 그대로이고 색 경계만 흐려진다.
- 소멸 속도 k: 매 프레임 염료에 e^(−k·dt)를 곱한다. 기본값 0.3이면 반감기가 ln2 ÷ 0.3 ≈ 2.3초, 3이면 0.23초다. 0이면 염료는 수치 오차 말고는 줄지 않는다.
게임과 영화가 이 방법을 쓴 이유
Stable Fluids는 물리적으로 가장 정확한 방법이 아니라, 어떤 시간 간격에서도 터지지 않는 방법이다. 매 프레임 정해진 시간 안에 결과가 나와야 하는 실시간 그래픽에서는 이 성질이 정확도보다 중요했다. 스탬은 2003년 게임 개발자 회의에서 이 알고리즘을 100줄 남짓의 C 코드로 공개했고, 이후 수많은 웹 데모와 게임 효과의 출발점이 되었다. 공학 해석용 유체 코드는 반대로 정확도를 위해 작은 시간 간격과 고차 이류 기법을 쓴다.
예시
연기가 얼마나 오래 남나
- 입력
소멸 속도 0.3 /s, 처음 농도 1- 결과
2.3초 뒤 0.5, 10초 뒤 약 0.05
e^(−0.3×10) = e^(−3) ≈ 0.050. 화면에서는 1 − e^(−x) 톤 매핑을 거치므로 농도가 반으로 줄어도 밝기는 반보다 덜 줄어 보인다.
점성을 최대로 올렸을 때
- 입력
ν = 10⁻³, 해상도 128², dt = 1/60 s- 결과
프레임당 확산 계수 a ≈ 0.27
a = (1/60) × 10⁻³ × 128² = 0.273. 폭 10칸(영역의 약 8%)짜리 소용돌이가 퍼지는 시간은 L²/ν ≈ 0.078² ÷ 10⁻³ ≈ 6초 정도다.
해상도 비교
- 입력
같은 붓질을 64²와 192²에서- 결과
64²에서는 소용돌이가 몇 번 돌기 전에 사라지고, 192²에서는 가는 띠가 여러 겹 감긴다
반라그랑주 보간의 수치 점성은 칸 크기에 비례해 줄어든다. 칸 수가 3배면 한 칸 크기는 1/3이다.
사용 방법
- 화면을 짧고 빠르게 한 번 그어 붓 자국 끝에 생기는 소용돌이 한 쌍을 본다.
- 점성과 해상도를 바꿔 같은 붓질이 얼마나 오래 남는지 비교한다.
- 소멸 속도를 0으로 두고 여러 색을 섞어 경계가 말려 들어가는 모습을 관찰한다.
자주 묻는 질문
연기는 왜 위로 올라가나요?
뿌린 연기에 온도를 주고, 온도에 비례하는 위쪽 힘(부력)을 속도에 더하기 때문이다. 연기는 식으면서 덜 뜨므로 한참 오르다 퍼진다. 부력 슬라이더를 0으로 두면 염료는 색이 있는 추적자일 뿐이라 떠오르지 않는다.
점성이 0인데도 소용돌이가 멈추는 이유는?
반라그랑주 이류가 보간할 때마다 값을 평균 내며 작은 구조를 깎는 수치 점성이 있기 때문이다. 해상도를 높이면 줄어든다.
이것으로 실제 유체 문제를 풀 수 있나요?
정성적인 모습(투영이 만드는 소용돌이 쌍, 점성의 효과)은 맞지만, 수치 점성과 제한된 반복 횟수 때문에 정량 예측에는 맞지 않는다. 스탬도 원 논문에서 이 방법을 애니메이션용으로 제안했다.
Stable Fluids와 격자 볼츠만은 무엇이 다른가요?
Stable Fluids는 나비에–스토크스 방정식을 속도와 압력으로 직접 푼다. 격자 볼츠만(이 사이트의 카르만 와열·3D 풍동)은 입자 분포의 충돌과 이동을 계산해 그 평균이 유체처럼 움직이게 한다.
관련 가이드
출처
- J. Stam, Stable Fluids, SIGGRAPH 99 Proceedings, 121–128 (1999)
- J. Stam, publications page (Stable Fluids, Real-Time Fluid Dynamics for Games)
- R. Fedkiw, J. Stam, H. W. Jensen, Visual Simulation of Smoke, SIGGRAPH 2001
기준일: