Rocket Workshop — 나만의 로켓을 조립하고 우주로 쏘아 올리기
엔진, 연료탱크, 페이로드를 조합해 로켓을 설계하고, 실시간 스로틀 제어로 궤도에 진입하는 1D 물리 시뮬레이터
시작 — 로켓은 왜 이렇게 생겼을까
어릴 적 로켓 발사 영상을 처음 본 순간의 기억이 있습니다. 하얀 연기를 내뿜으며 지면을 떠나는 거대한 물체. "저게 어떻게 날 수 있지?" 하는 질문은 나이가 들어서도 사라지지 않았습니다.
Starship Mission을 만들면서 중력, 추력, 항력이라는 세 가지 힘만으로도 꽤 사실적인 비행을 재현할 수 있다는 걸 알게 되었습니다. 그렇다면 한 발 더 나아가서 — 로켓 자체를 플레이어가 직접 설계하면 어떨까? 엔진을 고르고, 연료탱크 크기를 정하고, 페이로드를 실은 뒤 그 조합이 실제로 우주에 도달할 수 있는지 시험해보는 것. Rocket Workshop은 그 호기심에서 출발했습니다.
종이 위의 로켓 — 조립 화면
게임의 첫 화면은 공학 노트를 펼친 듯한 인터페이스입니다. 노란 종이 질감 위에 바인더 구멍이 있고, 파츠를 선택하면 연필 스케치 스타일의 로켓 프리뷰가 실시간으로 업데이트됩니다.
파츠는 네 종류입니다.
| 카테고리 | 선택지 | 트레이드오프 |
|---|---|---|
| 엔진 | Kestrel → Raptor (5종) | 추력↑ = 비용↑, 질량↑ |
| 연료탱크 | Micro → Super (5종) | 연료↑ = 항력↑, 질량↑ |
| 페이로드 | CubeSat → Station (4종) | 과학 보너스↑ = 질량↑ |
| 부스터 | Solid / Liquid / Heavy (3종) | 1단 추력 보강, 분리 후 사라짐 |
모든 파츠에는 비용이 있고, 미션마다 예산 상한이 다릅니다. LEO 미션은 $600, 화성은 $1,300. 최고급 엔진과 최대 탱크를 고르면 성능은 좋지만 예산을 초과하게 됩니다. 싼 부품으로 우주에 가면 경제 점수가 올라갑니다. 이 긴장감이 조립의 핵심입니다.
세 가지 힘의 줄다리기 — 물리 엔진
Rocket Workshop의 물리는 1D(수직 방향만)로 단순화했지만, 핵심 원리는 실제 로켓과 같습니다.
중력은 고도에 따라 줄어듭니다. 지표면에서 9.8 m/s²이던 중력이 200km 상공에서는 약 9.2 m/s²로 감소합니다.
const g = G0 * (EARTH_RADIUS / (EARTH_RADIUS + altM)) ** 2;
추력은 엔진의 비추력(ISP)이 고도에 따라 변합니다. 대기 중에서는 배기가스가 주변 공기에 밀려 효율이 떨어지지만, 진공에서는 최대 성능을 발휘합니다. Raptor 엔진의 경우 해수면 ISP 330초에서 진공 ISP 360초까지 올라갑니다.
항력은 속도의 제곱에 비례합니다. 고도가 높아지면 대기 밀도가 줄어 항력도 사라지지만, 저고도에서 너무 빠르면 동적 압력(Max-Q)이 위험 수준까지 올라갑니다.
이 세 힘의 합이 매 프레임 가속도를 결정하고, 오일러 적분으로 속도와 고도를 갱신합니다. 시간은 4배속으로 흐릅니다 — 현실의 10분 비행이 게임에서는 2분 반이 됩니다.
Max-Q — 가장 위험한 순간
로켓 발사에서 가장 긴장되는 구간은 발사 직후 12분, 고도 1015km 부근입니다. 속도는 빠르게 오르는데 대기는 아직 충분히 두꺼워서, 동적 압력 q = ½ρv²이 최대치에 도달합니다. 실제 SpaceX 발사에서도 "Max-Q"라는 콜아웃이 나오는 구간입니다.
게임에서도 이걸 재현했습니다. 안전 한계(35,000 Pa)를 넘으면 HUD에 노란 경고가 뜨고 점수에 페널티가 쌓입니다. 임계값(50,000 Pa)을 넘으면 구조 파괴로 즉시 실패합니다. 하지만 저고도(5km 미만)에서는 경고만 주고 즉사하지 않습니다 — 초보자가 발사 직후 바로 폭발하는 경험을 피하기 위해서입니다.
최적의 전략은 이륙 직후 풀 스로틀로 올라가다가, Max-Q 구간에서 스로틀을 60~70%로 줄이고, 대기가 얇아지는 20km 이상에서 다시 100%로 올리는 것입니다. 실제 로켓 비행의 "throttle bucket"과 같은 원리입니다.
부스터 — 1단의 친구
부스터를 장착하면 이륙 시 추력이 크게 증가합니다. 양쪽에 하나씩, 총 두 개가 붙습니다. 부스터의 연료가 다 떨어지면 자동으로 분리되고, 그 순간 질량이 급격히 줄어들면서 가속이 붙습니다.
부스터 물리는 메인 엔진과 별개로 계산됩니다. 부스터만의 연료 비율(boosterFuelFrac)을 추적하고, 매 프레임 부스터 추력에 해당하는 연료를 소모합니다. 분리 후에는 총 질량에서 부스터 건조 중량 + 잔여 연료를 빼고 추력도 재계산합니다.
치올코프스키 로켓 방정식으로 ΔV를 미리 계산해 표시합니다. 부스터가 있으면 1단(부스터+메인)과 2단(메인만)의 ΔV를 각각 구해 합산합니다.
// 2단계 ΔV — 부스터 분리 전후
const Ve1 = (boosterThrust * boosterVe + mainThrust * mainVe) / totalThrust;
const dV1 = Ve1 * Math.log(m0_stage1 / mf_stage1);
const dV2 = mainVe * Math.log(m0_stage2 / mf_stage2);
const totalDeltaV = dV1 + dV2;
궤도 진입 — 1D의 한계를 넘어서
현실에서 궤도 진입은 수직 상승이 아닙니다. 수평 속도가 충분해야 지구를 계속 돌 수 있습니다. 하지만 이 게임은 1D 시뮬레이터 — 수직 방향만 있습니다.
이 한계를 ORBIT_VEL_FACTOR = 0.35라는 상수로 보정했습니다. 실제 궤도 속도의 35%에 도달하면 "나머지는 수평으로 전환했다"고 간주합니다. LEO의 경우 실제 궤도 속도 7,784 m/s의 35%인 약 2,724 m/s가 목표입니다.
HUD의 레이더에는 지구 중심에서 로켓 위치까지의 점과 목표 궤도 링이 표시됩니다. 고도와 속도가 모두 충족되면 궤도 링이 녹색으로 빛나며 성공을 알립니다.
점수 — 무엇이 좋은 비행인가
궤도 진입에 성공하면 네 가지 기준으로 점수가 매겨집니다.
| 항목 | 비중 | 기준 |
|---|---|---|
| 연료 효율 | 35% | 남은 연료가 많을수록 높음 |
| 경제성 | 25% | 예산 대비 저렴할수록 높음 |
| 속도 | 20% | 120초 근처에서 궤도 진입 시 보너스 |
| 구조 안정 | 20% | Max-Q 초과가 적을수록 높음 |
여기에 페이로드의 과학 보너스(1.0~2.0배)와 미션 난이도 보너스(LEO 1배, 화성 3배)가 곱해집니다. 등급은 S(85%+)부터 D(30% 미만)까지. S등급을 받으려면 저렴한 부품으로 연료를 아끼면서 Max-Q 구간을 깔끔하게 통과해야 합니다.
엔진별 불꽃 — 작은 디테일
각 엔진마다 화염 색상이 다릅니다. Kestrel은 청백색, Merlin은 주황, Raptor는 메탄 특유의 청록색입니다. 실제 로켓 엔진의 연료(RP-1, 메탄, 수소)에 따라 화염 색이 다른 것을 반영했습니다.
파티클 시스템은 최대 800개의 입자로 화염을 표현합니다. 각 입자는 개별적인 RGB값, 크기, 수명, 중력을 가지고 있어 엔진마다 고유한 분위기를 만듭니다.
마치며
Rocket Workshop을 만들면서 가장 재미있었던 건 "왜 로켓은 이렇게 비쌀까?"라는 질문에 대한 답을 체감한 것입니다. 궤도에 도달하려면 막대한 연료가 필요하고, 연료를 실으면 무거워져서 더 많은 연료가 필요하고, 그래서 더 강한 엔진이 필요하고... 치올코프스키의 저주라고 불리는 이 악순환이 게임 밸런싱에서 그대로 나타났습니다.
조립 화면에서 TWR과 ΔV 숫자를 보며 고민하는 시간, Max-Q 구간에서 스로틀을 조심스럽게 줄이는 긴장감, 궤도 링이 녹색으로 빛나는 순간의 쾌감 — 로켓에 대한 호기심이 이 모든 경험으로 이어졌습니다.