FFT 바다
공개된 해양학·그래픽스 기법만으로 처음부터 구현한 실시간 바다입니다. 게임이 아니라 기술 실험이고, 풍속을 올리면 파고가 물리 공식대로 따라 올라갑니다.
누구에게 필요한가요
물이 어떻게 그려지는지 궁금하거나, 바다를 직접 만들어 보려는 개발자
주요 기능
- Tessendorf 계열 FFT 파랑과 JONSWAP 스펙트럼
- 스웰·풍파·잔물결 3단 캐스케이드
- 야코비안으로 판정하는 파도 부서짐과 포말
- 선체 메시에서 실측한 프로브 14개로 뜨는 배
- 뒤집혀도 스스로 일어나는 복원 모멘트
- 굴절 패스로 실제로 보이는 수중 지형 — 두께는 가정하지 않고 깊이로 잰다
- 돌고래·상어·열대어. 종마다 해부 구조가 달라 꼬리가 눕고 서는 축까지 다르다
- 돌고래는 수면 위로 뛴다. 물 밖에서는 저을 것이 없어 그냥 포물체다
- 배수 유량에서 유도한 선수 물보라 — 정지하면 0, 파도에 선수가 묻히면 폭증
- 쇄파선은 고정된 원이 아니라 파고로 정해지는 수심 등고선
- 항주 이력에서 복원한 켈빈 V자 항적
- 방위마다 반경이 달라 해변과 절벽이 한 섬에 공존한다
- 배가 섬에 얹힌다. 완만한 해변에는 선수부터, 바위 위에서는 그쪽으로 기운다
- 텍스처가 아니라 함수로 계산하는 하늘과 반사
- 잔잔부터 폭풍까지 프리셋 6종, 품질 4단계
제품 방향
항적과 수중 시점이 없다고 적어 뒀던 것이 이번에 둘 다 들어왔습니다. 굴절 패스를 넣자 해석적으로 칠하던 물 밑이 실제 지형으로 바뀌었고, 그 위에 물고기와 해안 쇄파가 얹혔습니다. 배 속도도 6.5노트에서 18.6노트가 됐습니다 — 전체 저항의 92%를 차지하던 항이 전진까지 묶고 있었습니다. 남은 것은 폭풍 전속에서 선수가 깊이 묻히는 구간과, 저각 태양에서 하늘이 평평해지는 한계입니다.
만들면서 쓴 글
- 배가 6.5노트밖에 못 나가던 이유 — 흔들림을 잡던 항이 전진까지 잡고 있었습니다
파도에서 배가 덜 흔들리게 하려고 넣은 항력이 전체 저항의 92%였습니다. 아래위 흔들림 기준으로 크기를 잡은 값을 전 방향에 똑같이 걸었으니 앞으로 가는 것도 그만큼 막혔습니다. 속도를 풀자 느릴 땐 닿지 않던 결함 둘이 드러났습니다.
- 쇄파선은 해변의 성질이 아니라 바다의 성질입니다
파도가 부서지는 선을 섬 둘레의 고정된 원으로 잡으면 강풍에서 모래 위에 파도가 부서집니다. 파도는 자기 파고에 견줄 만한 수심에서 부서지므로 그 선은 바다가 정합니다. 그리고 배에는 지형 충돌이 아예 없어서 섬을 뚫고 지나가고 있었습니다.
- 물 밑을 상수로 칠하고 있었습니다 — 굴절 패스를 넣자 숨어 있던 것들이 드러났습니다
수면 아래를 노이즈 섞은 상수 색으로 칠하고 있었습니다. 실제 지형을 굴절시켜 비추도록 바꾸자 물이 가려 주던 결함이 둘 나왔습니다. 그리고 흰 면의 원인을 여섯 번 오진하게 만든 건 렌더링이 아니라 제 검증 도구였습니다.
- "\"이게 물고기냐\" — 돌고래가 흰 물고기로 보인 이유 셋"
물고기를 넣었더니 돌고래가 그냥 흰 물고기였습니다. 지느러미가 두께 0이었고, 몸통 만드는 방식이 주둥이 있는 형태를 못 만들었고, 광택이 너무 세서 무늬를 통째로 지우고 있었습니다. 물고기가 오직 물을 통해서만 보인다는 사실이 나머지 설계를 거의 다 정했습니다.
- FFT 바다 안내서 — 슬라이더 하나가 무엇을 바꾸는지
브라우저에서 바다를 띄우고 풍속을 올려 보면 파고가 따라 올라갑니다. 그게 눈속임이 아니라 공식이라는 걸 확인하는 방법과, 화면에 있는 것들이 각각 무슨 뜻인지 정리했습니다.
- 유료 데모의 소스를 뜯는 대신 논문을 읽고 바다를 다시 만들었다
잘 만든 바다 데모를 보고 "이거 어떻게 했지"가 아니라 "이건 무슨 기법이지"에서 시작했습니다. FFT 파랑과 JONSWAP 스펙트럼, 3단 캐스케이드로 처음부터 구현했고, 파고가 물리 공식과 맞는지 픽셀을 읽어 검증했습니다.

현재 상태
실험 공개
- 개발 시작 2026년 7월
- 마지막 작업 2026.08.19
플레이 안내
- WebGL2와 EXT_color_buffer_float가 필요합니다. 데스크톱 브라우저를 권합니다
- 1 궤도 · 2 자유비행 · 3 승선. 승선 중에는 WASD로 조타하고 R로 배를 되돌립니다
- 선체 모델이 11MB라 첫 로딩이 큽니다. 한 번 받으면 브라우저가 캐시합니다
- GPU를 제법 씁니다. 느리면 우측 패널에서 품질을 낮추세요
- 선체 모델은 gogiart의 SS Minnow III(CC BY 4.0)이고 앱 패널에 표기됩니다