$

케이스 12 · 시뮬레이션

ACCRETION — 물리가 곧 규칙일 때 치르는 대가

천체물리를 곧 게임 규칙으로 삼은 교육형 블랙홀 아케이드. 그 약속은 반증 가능한 주장이라, 결국 모든 물리 주장에 자동 단정을 박아 고정했다. 흥미로운 건 기능 목록이 아니라 잘못 든 길들이다 — 천체를 먹어치우던 보이지 않는 회전 칼날, 사탕 행성처럼 보이던 라이벌 블랙홀, 한 프레임도 그려지지 않던 초신성 충격파, 그리고 측정이 뒤집은 세 건의 밸런스 판정.

  • Three.js
  • GLSL
  • Simulation
  • Verification

$

문제의식

대부분의 "교육형" 게임은 평범한 루프 위에 사실을 얹는다. 여기서는 반대로 걸었다 — 물리를 곧 메커닉으로. 에딩턴 한계가 먹는 속도를 억제하고, 조석력은 즉사가 아니라 질량을 뜯어가며, 약 20 태양질량 이상인 별만 블랙홀로 붕괴한다. 이 프레임에는 대가가 따른다. 규칙이 실제라고 주장하는 순간, 틀린 규칙은 전부 버그가 되고 "이게 재밌으니까"는 더 이상 충분한 근거가 아니게 된다.

잘못 든 길들

  1. 1 · 보이지 않는 칼날

    오너 리포트: "가만히 있는데 행성이 먹힌다." 퀘이사 제트는 화면을 향한 축으로 그려졌는데, 소비 판정은 플레이 평면을 도는 직선을 따랐다. 보이는 빔과 판정 영역이 완전히 다른 물체였던 것 — 아무도 볼 수 없는 회전 칼날. 빔을 플레이 평면에 눕히고 판정 범위를 메시와 같은 상수에서 파생시켜 고쳤고, "축 위의 천체는 먹히고 90° 벗어난 천체는 안 먹힌다"를 단정으로 박았다.

  2. 2 · 사탕처럼 보이던 라이벌 블랙홀

    스토어 스크린샷에서 드러났다 — 라이벌 블랙홀이 파스텔 고리 행성으로 읽혔다. 가독성 시스템이 "먹을 수 있음/위협" 색을 강착원반에 직접 칠하고 있어서, 먹을 수 있는 라이벌이 민트색 토성이 됐다. 두 역할을 분리해 고쳤다 — 원반은 언제나 뜨거운 강착원반(그게 블랙홀의 정체성)이고, 신호는 바깥 글로우가 담당한다. 후광만으로는 부족했다. 후광은 화면상 크기가 고정이라 거대한 라이벌에서는 신호가 죽는다.

  3. 3 · 아무도 본 적 없는 초신성

    물리 단정을 쓰다가, 충격파 링이 출시 이후 줄곧 보이지 않았다는 걸 발견했다. 스폰이 타이머를 1로 두는데 불투명도는 0.9 × (1 − 타이머)이고 타이머 ≥ 1이면 스스로 숨었다. 글자 하나. 그런데 모든 테스트를 통과해 왔다 — 단정이 "충격파가 보이는 프레임 수"를 "초신성이 터졌는가"의 프록시로 쓰고 있었고, 0회도 "최대 1회"를 만족했기 때문이다. 프록시를 사건 카운터로 교체했다.

  4. 4 · 등대처럼 돌던 퀘이사

    오너 질문: "퀘이사가 저렇게 도는 게 실제로 맞나?" 아니었다. 상대론적 제트는 블랙홀의 자전축을 따르고 그 축은 안정적이다 — 도는 빔은 퀘이사가 아니라 펄서다. 정직한 수정은 축을 고정하는 것(탑다운 게임에서 제트가 무용해진다)이 아니라 세차운동 수준으로 늦추는 것이었다. 세차는 실재하는 현상이다 — SS 433은 약 162일 주기로 세차한다. 코덱스 항목도 함께 고쳐, 게임이 틀린 걸 가르치지 않게 했다.

  5. 5 · 한 프레임에 사라지던 것들

    오너: "블랙홀이 정말 모든 걸 한순간에 빨아들이나?" 아니다. 조석력은 1/r³로 커지므로, 영향권에 든 천체는 블랙홀 방향으로 늘어나 가느다란 강착 흐름으로 찢겨 나선을 그리며 떨어진다. 이제 천체는 방사 방향으로 최대 2.35배 늘어나고, 접선 성분(각운동량)을 가진 흐름 입자를 흘리며(그래서 곧장 떨어지지 않고 나선을 그린다), 벗어나면 원래 형태로 돌아온다. 순수 연출이라 성장 수치를 하나도 건드리지 않고 출하했다.

두 번째 라운드 — 오너가 물리로 잡아낸 것들

  1. 6 · 등대처럼 돌던 퀘이사

    "퀘이사가 저렇게 도는 게 실제로 맞나?" 아니었다 — 도는 빔은 퀘이사가 아니라 펄서다. 상대론적 제트는 안정된 자전축을 따른다. 축을 고정하면 탑다운 게임에서 제트가 무용해지므로, 정직한 수정은 세차운동 수준으로 늦추는 것이었다. 세차는 실재한다 — SS 433은 약 162일 주기다. 방향은 바로잡고 시간 척도만 압축했으며, 그 압축은 숨기지 않고 밝혔다.

  2. 7 · 제트가 거꾸로 돌아가고 있었다

    "제트는 빨아들이는 게 아니라 분출하는 것 아닌가요?" 맞다. 상대론적 제트는 물질을 광속에 가깝게 내던지고, 블랙홀을 먹이는 것은 제트가 아니라 그것을 밝히는 강착이다. 그런데 구현은 제트가 훑은 것을 삼키고 있었다 — 화살표가 반대였다. 이제 빔에 걸린 천체는 찢겨 바깥으로 날아가고, 질량은 들어오지 않으며 풀려난 에너지가 점수와 충전이 된다.

  3. 8 · 근거가 없던 두 능력

    같은 기준으로 능력을 감사하니 둘 다 탈락했다. DASH는 "중력 슬링샷"이라 표시했는데, 슬링샷은 작은 물체가 큰 천체의 운동량을 빌리는 것이다 — 블랙홀이 자기 자신을 슬링샷할 수는 없다. PULSE는 먹이를 끌고 위협을 미는 기능을 한 버튼에 섞은 근거 없는 중력 폭발이었다. 각각을 실재하는 현상 하나 위에 다시 세웠다: 반동 킥(비대칭 중력파 방출은 실제로 병합 잔해를 수천 km/s로 걷어찬다 — 블랙홀이 스스로 가속하는 유일한 실제 경로), 프레임 드래깅(회전하는 블랙홀이 시공간을 끌어 주변 물질을 공전시킨다), 그리고 궤도를 흩고 라이벌의 강착을 끊는 신규 중력파.

  4. 9 · 그 질량은 누가 가져가나

    오너가 물었다 — 다투는 먹이는 중력이 더 센 쪽이 가져가는가, 그리고 질량은 접촉 순간 한 번에 넘어가는 대신 그 전부터 조금씩 새어야 하지 않는가. 둘 다 없었고 둘 다 실제다. 조석력은 1/r³로 커지므로, 영향권에 든 천체는 이제 바깥층을 계속 흘리고, 그 지점에서 M/r²가 큰 쪽이 가져간다 — 조석 지배를 플레이어와 라이벌 양쪽에 동일하게 적용했다. "먹혔다/안 먹혔다"의 이분법이 사라지고, 큰 것 옆을 스치는 것만으로 손해가 난다.

진화 아크, 순서대로

여섯 장 모두 렌더가 아니라 실제 게임 화면이다. 그중 둘은 위의 미술 수리 이후에야 쓸 수 있게 됐다 — 라이벌 블랙홀은 고리 두른 파스텔 행성으로 읽혔고, 초신성 충격파는 한 프레임도 그려진 적이 없었다.

  • 원시별 — 아직 별이 아니다

    원시별 — 아직 별이 아니다

    시작 상태는 원래 PLANETESIMAL이라는 회색 암석이었다. 별은 암석을 모아 생기지 않으므로 원시별로 바꿨다 — 수축열로 빛나는 구름 핵, 그리고 코덱스가 바로 그 사실을 말한다.

  • 점화 — 주계열성

    점화 — 주계열성

    핵융합이 시작된다. 이 구간은 이전보다 약 40% 길어졌다 — 무거운 별은 복사압으로 유입 가스를 밀어내 강착이 비효율적이다. 실제 제약으로 페이싱 불만을 해결했다.

  • 초신성 — 20 M☉를 넘는 순간

    초신성 — 20 M☉를 넘는 순간

    약 20 태양질량 이상인 별만 블랙홀로 붕괴하므로 임계값을 거기 뒀다. 여기 퍼지는 충격파가 출시 이후 죽어 있던 그 연출이다 — 타이머 초기값이 곧바로 투명해지는 값이었다.

  • 라이벌 블랙홀 — 후반의 유일한 성장 경로

    라이벌 블랙홀 — 후반의 유일한 성장 경로

    에딩턴 한계 때문에 일반 포식은 수지가 안 맞고, 후반 성장은 라이벌 병합에서 나온다. 이제 그들의 원반은 언제나 뜨겁고, 먹을 수 있는지는 바깥 글로우가 알린다 — 사탕처럼 보이던 원인이 그것이었다.

  • 조석 영역 — 즉사가 아니라 탈출 기회

    조석 영역 — 즉사가 아니라 탈출 기회

    더 큰 블랙홀에 닿으면 즉사였다. 스파게티화는 순간이 아니라 과정이므로, 이제 바깥 영역은 질량을 뜯어가되 탈출할 수 있다 — 되돌릴 수 없는 건 사건지평선 안쪽뿐이다.

  • 퀘이사 제트 — 등대가 아니라 세차운동

    퀘이사 제트 — 등대가 아니라 세차운동

    제트는 등대처럼 돌고 있었는데, 그건 퀘이사가 아니라 펄서의 행동이다. 상대론적 제트는 안정된 자전축을 따르므로, 정직한 절충은 회전을 세차운동 수준으로 늦추는 것이었다 — 세차는 실재한다. SS 433은 약 162일 주기다.

측정이 뒤집은 세 건의 판정

셋 다 눈으로는 결론이 난 사안이었다. 수치를 재보니 아니었고, 그중 두 번은 게임이 아니라 테스트 하네스가 결함이었다.

판정직관실측
"난이도 벽이 있다"봇이 초반에 계속 죽었다약한 봇 + 미검증 하네스. 실제는 벽이 아니라 초반 고분산
"점진 흡수가 성장을 망쳤다"성장이 느려 보였다40런 A/B: 손실 1/40 vs 기준선 2/40, 중앙 질량 2.94 vs 2.68 — 오히려 나았다
"후반엔 병합 없이 성장이 멈춘다"오너가 체감으로 지적확인됨: 일반 포식이 질량 6,000에서 0.62%, 25,000에서 0.15%. 에딩턴 감쇠를 완화, 병합은 여전히 3.8배 우위

방법론으로 남은 것

잘못 든 길에서 네 가지 습관이 남았다. 문자열 치환은 앞뒤로 assert할 것 — 같은 조용한 실패가 두 번 출하됐고, 두 번째는 라이브 파일을 grep해서야 잡혔다. 테스트의 부작용은 호출마다가 아니라 환경 경계에서 막을 것 — 한 스위트를 고쳤더니 나머지 셋이 여전히 프로덕션 리더보드에 행을 쓰고 있었다. 오버레이 감사는 선택자를 손으로 나열하지 말고 DOM에서 열거할 것 — 손으로 적은 목록은 화면에서 눈에 띄게 깨져 있던 요소를 빠뜨렸다. 그리고 렌더링 부작용을 사건의 대리로 쓰지 말 것 — "충격파가 보인 프레임 수"를 세는 단정은 한 번도 그려지지 않은 충격파를 조용히 통과시켰다. 다섯 번째는 나중에, 검증할 수 없는 수정에서 왔다 — 터치 기기용 CSS 미디어 쿼리는 헤드리스 에뮬레이션에서 평가되지 않아 적용된 것처럼 보였지만 아니었다. 하네스가 닿지 못하는 것은 닿을 수 있는 말로 다시 써야 하며, 그러지 않으면 고쳐진 것이 아니다.

바로잡은 진화 사슬

  1. PROTOSTAR

    붕괴하는 구름 핵 — 별은 암석을 모아 생기지 않는다

  2. MAIN SEQUENCE

    핵융합 점화

  3. SUPERNOVA

    약 20 태양질량 이상에서만

  4. BLACK HOLE

    에딩턴 한계가 포식을 억제

  5. QUASAR

    자전축을 따른 제트

  6. ULTRAMASSIVE

    TON 618 급

$

근거 · 깃·위키 인용

  • 제트 · 보이는 빔 = 판정 영역 · accretion@a6c8213
  • 세계관 · 원시별 + 20 M☉ 붕괴 · accretion@12932dc
  • 미술 · 라이벌이 블랙홀로 읽히게 · accretion@860da83
  • 제트 · 등대가 아니라 세차운동 · accretion@5444985
  • 강착 흐름 · 조석 늘어남 · accretion@9c19ee4
  • QA 제출을 라이브 보드에서 격리 · accretion@e427742
  • 제트는 삼키지 않고 뿜는다 · accretion@39a0db4
  • 능력을 실제 현상 위에 재구성 · accretion@da5fee5
  • 조석 박리 + 중력 지배 · accretion@68de4e4
  • 위키 · 전체 활동 기록 · accretion-wiki/log.md