삼체 문제 — 카오스를 시뮬레이션하다
넷플릭스 삼체 시리즈를 보고 흥미로워진 삼체 문제를 웹에서 직접 시뮬레이션해 본 이야기 — 수치 적분, 에너지 보존, 나비효과 시각화
시작 — 영상에서 받은 영감
넷플릭스 삼체 시리즈를 보면서 "세 개의 태양이 만드는 예측 불가능한 궤도"라는 설정이 인상적이었습니다. 수학적으로 풀 수 없다는 300년 난제가, 웹 브라우저에서 실시간으로 돌아가는 시뮬레이션으로 만들 수 있을까? 단순한 호기심으로 자료를 모으기 시작했습니다.
삼체 문제란
뉴턴의 만유인력 법칙으로 두 천체의 궤도는 완벽하게 예측됩니다. 하지만 천체가 셋이 되면 닫힌 형태의 일반 해가 존재하지 않습니다. 1890년 푸앵카레가 이 문제에서 카오스의 존재를 증명한 이후, 삼체 문제는 "결정론적이지만 예측 불가능한" 시스템의 대표적 예가 되었습니다.
자료를 찾아보니 생각보다 구현 가능한 범위였습니다. 핵심은 중력 가속도 계산과 수치 적분, 이 두 가지였습니다.
Velocity Verlet — 에너지가 새지 않는 적분기
가장 먼저 부딪힌 문제는 수치 적분 방법의 선택이었습니다. 단순 오일러 방법(x += v*dt)은 구현이 쉽지만, 시간이 지나면 에너지가 점점 늘어나서 궤도가 실제와 달라집니다. 특히 8자 궤도 같은 정밀한 패턴에서는 금방 궤도가 무너집니다.
Velocity Verlet은 "심플렉틱" 특성을 가져서, 에너지가 장기적으로 보존됩니다.
// 1. 위치 업데이트: x(t+dt) = x(t) + v(t)·dt + ½·a(t)·dt²
newX = x + vx * dt + 0.5 * ax * dt * dt;
// 2. 새 위치에서 가속도 재계산
newAx = computeAccel(newX, ...);
// 3. 속도 업데이트: v(t+dt) = v(t) + ½·(a(t) + a(t+dt))·dt
newVx = vx + 0.5 * (ax + newAx) * dt;
한 프레임당 12~16번의 서브스텝을 돌려서 dt를 잘게 쪼개면, 8자 궤도에서 수천 프레임 동안 에너지 드리프트 0.1% 미만을 유지할 수 있었습니다.
프리셋 궤도 — 수학의 보석들
시뮬레이터를 만들면서 가장 흥미로웠던 부분은 프리셋 초기 조건을 찾는 과정이었습니다.
- 8자 궤도: 1993년 크리스 무어가 컴퓨터로 발견한 궤도. 초기 위치와 속도를 소수점 이하 여러 자리까지 정확히 맞춰야 안정적으로 유지됩니다.
- 라그랑주 삼각형: 정삼각형 배치에 원형 궤도 속도를 정확히 계산해야 합니다.
- 카오스: 비대칭 질량의 근접 배치. 아름다운 혼돈이 펼쳐집니다.
각 프리셋의 초기 조건을 논문에서 가져와 정규화 좌표(-1~1)로 변환하는 작업이 의외로 까다로웠습니다.
나비효과 시각화
"나비효과" 모드는 현재 시뮬레이션 상태를 복제한 뒤, 첫 번째 천체의 x좌표를 0.1%만 바꿔서 두 시뮬레이션을 나란히 보여줍니다. 처음에는 거의 동일해 보이지만, 시간이 지나면 궤적이 완전히 달라지는 것을 눈으로 확인할 수 있습니다.
화면 분할은 Canvas의 clip() API로 구현했습니다. PC에서는 좌/우, 모바일에서는 상/하로 분할됩니다.
사운드스케이프 — 중력을 소리로
천체 간 거리를 주파수와 볼륨에 매핑하는 Web Audio 사운드스케이프를 추가했습니다. 가까운 천체 쌍은 낮고 강한 소리를, 먼 쌍은 높고 약한 소리를 냅니다. 36Hz와 38.5Hz의 비팅 드론이 우주적 분위기를 깔아줍니다.
매 프레임 주파수를 직접 바꾸면 끊김이 생기므로, linearRampToValueAtTime으로 80ms 간격의 부드러운 전환을 적용했습니다.
어려웠던 점
솔직히 삼체 문제의 물리학 자체는 제 전문 분야가 아닙니다. 논문의 초기 조건 값을 옮기면서 좌표계 변환에서 실수하거나, 에너지 드리프트가 왜 큰지 디버깅하는 데 시간이 걸렸습니다.
하지만 그 과정에서 "왜 이 문제가 300년간 풀리지 않았는지"를 체감할 수 있었고, 작은 차이가 거대한 결과 차이를 만드는 카오스의 본질을 직접 눈으로 볼 수 있다는 것이 이 프로젝트의 가장 큰 보람이었습니다.
기술 스택
| 항목 | 내용 |
|---|---|
| 렌더링 | Canvas 2D + DPR/4K 스케일링 |
| 물리 엔진 | Velocity Verlet 적분기 (서브스텝 12회) |
| 오디오 | Web Audio API — 거리 기반 주파수 매핑 |
| 프리셋 | 6종 (Figure-8, Lagrange, Butterfly, Chaos, Sun-Earth-Moon, Today) |
| 나비효과 | Canvas clip 분할 뷰 + 0.1% 섭동 |