GN⁺: 지형 위 물의 시뮬레이션
(lisyarus.github.io)물의 문제점
- 대부분의 게임은 지형 수정이 불가능하며, 이는 합리적임. 모든 게임이 이를 필요로 하지는 않음.
- 물이 있는 게임에서는 물의 흐름을 어떻게 처리할지 고민해야 함.
- 기존의 간단한 모델들은 만족스럽지 않으며, 더 나은 모델을 찾기 위해 연구가 필요함.
설정
- 시뮬레이션은 그리드에서 작동해야 하며, 지형과 동일한 그리드를 사용하는 것이 바람직함.
- 시뮬레이션의 평균 규모는 약 1미터 정도여야 함.
- 물은 지형 위의 높이 필드로 가정할 수 있으며, 수직으로 흐르지 않음.
- 물은 흐를 수 있어야 하며, 시뮬레이션 오류로 인해 마법처럼 사라지지 않아야 함.
- 시뮬레이션은 제어 가능한 안정성을 가져야 하며, 빠르게 작동해야 함.
비해결책
- Smoothed Particle Hydrodynamics는 매우 인상적인 결과를 제공하지만, 다른 문제를 해결함.
- Jos Stam의 Stable Fluids는 전체 유체 부피를 다루며, 빠르지 않음.
얕은 물 방정식
- 얕은 물 방정식은 수직 방향으로 평균화하여 2D 방정식을 남김.
- "얕은" 부분은 물 기둥의 전형적인 수직 크기가 수평 규모보다 훨씬 작다는 것을 가정함.
격자
- 유체 역학에서는 격자가 중요하며, 일반적으로 staggered grids를 사용함.
- staggered grids는 물 높이/밀도 등을 사각형 셀에 저장하고, 속도는 셀 사이의 가장자리에 저장함.
가상 파이프 방법
- 물 셀은 가상의 파이프로 연결되어 있다고 가정하여 물 흐름을 시뮬레이션함.
- 흐름 가속, 유출 스케일링, 물 기둥 업데이트의 세 단계로 구성됨.
흐름 가속
- 인접한 물 셀의 물 높이 차이에 따라 흐름을 가속함.
- 마찰을 추가하여 시뮬레이션이 안정적인 상태로 수렴하도록 함.
물 기둥 업데이트
- 각 물 셀에 대해 인접한 흐름에 따라 물을 추가하거나 제거함.
유출 스케일링
- 셀의 물 양이 음수가 되지 않도록 유출 흐름을 조정함.
지형 고도
- 물이 지형 위로 이동하도록 지형 고도를 추가함.
경계 조건
- 시뮬레이션의 경계에서 발생하는 일을 고려해야 함.
- 경계 흐름 값을 설정하여 벽, 유입, 유출 등의 조건을 정의함.
점성
- 점성을 추가하여 작은 물 층이 이동하는 데 어려움을 겪도록 함.
전체 시뮬레이션 코드
- 시뮬레이션 코드는 몇 개의 2D 배열에 대한 4개의 for 루프로 구성됨.
모델의 단점
- 관성 및 속도 확산이 없으며, 빠른 물 흐름이 호수로 들어가면 모든 방향으로 퍼짐.
보너스: 육각형/삼각형 격자
- 삼각형 격자를 사용하여 물을 시뮬레이션할 수 있으며, 이는 육각형 격자의 이중으로 볼 수 있음.
Hacker News 의견
-
유체 시뮬레이션에서 물이 축적되어 인접한 셀에 영향을 미치는 문제를 언급함. 이는 절차적으로 생성된 게임에서 병렬화가 어려운 이유 중 하나임
- 절차적 생성은 병렬화에 적합하지만, 무한한 도메인에서는 병렬화가 어려움
- 이 주제에 대한 탐구가 많이 이루어지지 않았음을 지적함
- Nick McD의 작업을 칭찬하며, 그의 작업도 시뮬레이션 설계로 인해 도메인에 제약이 있음을 언급함
- 물 분지 경계를 절차적으로 생성하여 병렬화 및 전체 물 분지를 한 번에 시뮬레이션하는 방법을 제안함
-
유체 시뮬레이션 개발 시 아름다운 결과를 보며 시간을 낭비할 위험이 큼을 언급함
- 2011년에 자신의 GPU 기반 유체 역학 구현 경험을 공유함
- 유체(혈액)가 표면(조직)에서 2D로 시뮬레이션되었고, 중력과 표면 기울기를 고려하여 메쉬에 투영되었음을 설명함
-
Animal Crossing의 자원 수집 방식이 지형 조작 없이 효율적임을 언급함
- 나무를 베어 로그를 얻지만, 일정량 후에는 쿨다운이 필요함
- 지형 조작이 필요 없는 게임에서는 이 방법이 더 나을 수 있음을 제안함
-
Timberborn 게임의 물리학이 게임의 중요한 요소임을 언급하며 추천함
- 물을 막아 엔진과 밭에 사용하는 방법을 찾는 것이 게임 플레이의 필수적인 부분임
-
o3-mini-high를 사용하여 3D로 구현된 알고리즘을 실험한 경험을 공유함
- Perlin noise를 처음부터 구현하여 지형 생성에 사용했음을 언급함
-
교육용 홍수 시뮬레이션을 소개하며, WebGL을 사용하여 인접 셀 기반으로 셀 값을 계산함
- 모델 값을 변경하여 큰 효과를 볼 수 있음을 설명함
-
물 시뮬레이션에서 관성 및 속도 확산이 부족한 문제를 해결하는 방법을 제안함
- 흐름 화살표의 값을 이웃 화살표와 평균화하여 해결할 수 있음을 설명함
-
개인 프로젝트로 시작한 침식 시뮬레이션에 대한 호기심을 공유함
- 침식을 이해하지 못해 프로젝트가 중단되었음을 언급함
-
Creeper World 게임에서 물을 시뮬레이션한 후 폭탄을 투하하는 아이디어를 언급함