2D 게임에서 3D를 만든 방법
How I made a 3D Level in a 2D Game by Spu7Nix
지오메트리 대시(Geometry Dash) 2D 게임 내 3D 레벨 제작 과정의 전말
이 영상은 2D 모바일 게임인 지오메트리 대시 내부에서 별도의 모드 사용 없이 오로지 게임 내 기본 오브젝트만을 활용하여 완벽한 3D 그래픽을 구현해낸 초고난도 레벨 제작기입니다. 제작자가 겪은 2년여의 집착에 가까운 노력과 기술적 한계 극복, 그리고 그 과정에서 마주한 심리적 변화를 상세히 담고 있습니다.
1. 3D 시각적 착시의 기초와 배경 터널 구현
- 3D 터널의 원리: 회전하는 나선형 구조를 통해 사물이 중심부로 모여들며 작아지는 현상을 이용합니다. 이는 3D 공간에서 사물이 멀어질 때 작아지는 원리와 동일합니다.
- 속도와 곡률의 조정: 단순한 나선은 3D처럼 보이지 않습니다. 실제 3D 공간에서는 멀어질수록 움직임이 느려지기 때문에, 나선 팔의 곡률을 수학적으로 조정하여 원근감을 부여했습니다.
- 이중 나선의 결합: 반대 방향으로 회전하는 두 개의 나선을 겹쳐 더욱 설득력 있는 터널 환상을 만듭니다.
- 시각적 완성도 향상:
- 오브젝트 구성: 경사면(Slope)과 사각형(Square) 오브젝트를 사용하여 나선 팔을 입체감 있게 표현했습니다.
- RGB 블렌딩 기술: 오브젝트가 겹칠 때 어색함을 없애기 위해 특정 RGB 채널 값을 최대화하고 블렌딩(Blending) 설정을 적용하여 겹치는 선을 숨겼습니다.
- 셰이딩(Shading) : 정교한 레이어 작업과 음영 처리를 더해 사실적인 3D 터널을 완성했습니다.
2. 가짜 플레이어와 정교한 물리 시스템 구축
- 게임 모드의 한계 극복: 기존 2D 게임 모드로는 3D 연출이 불가능하므로, 실제 플레이어는 화면 상단에 숨겨두고 트리거(Trigger) 로 제어되는 가짜 플레이어를 새롭게 제작했습니다.
- 가짜 플레이어의 구성:
- 머리(Head) : 웨이브(Wave) 방향이 바뀔 때마다 7프레임의 회전 애니메이션을 출력합니다. 각 프레임마다 10가지 원근 변형을 수작업으로 제작하여 총 70개의 정교한 피라미드 형상을 만들었습니다.
- 꼬리(Trail) : 수백 개의 타원 레이어로 구성됩니다. 머리의 움직임을 지연(Delay)을 두고 따라가도록 설계하여 매끄러운 궤적을 만듭니다.
- 꼬리 구현의 수학적 난제:
- 원근 증폭: 3D 느낌을 위해 카메라에 가까워질수록 타원과 움직임이 커져야 합니다. 이를 위해 3D 모델링 소프트웨어로 카메라 각도를 재현하고 14개의 타원 모델을 렌더링한 후, 지수 회귀 모델(Exponential Regression Model) 을 사용하여 증폭 함수를 산출했습니다.
- 정밀한 지연 제어: 일반적인 스폰 트리거(Spawn Trigger) 는 프레임 레이트에 의존하여 부정확합니다. 플레이어 추적(Follow Player) 트리거를 활용하려 했으나, 게임 개발자(RobTop)가 설정한 0.01초의 최소 지연 시간 제한에 부딪혔습니다.
- 해결책: 0.01초 간격으로 타원들을 그룹화하고, 곡선의 기울기에 따라 위아래 경사면 사본을 전환하는 새로운 기술을 발명하여 부드러운 궤적을 구현했습니다. 이 작업에만 한 달이 소요되었습니다.
3. 3D 지형과 큐브 렌더링 엔진 개발
- 3D 산(Mountain) 제작 :
- 3D 모델링 소프트웨어에서 산을 설계한 후 스크립트를 작성했습니다.
- 각 삼각형 면과 수직 평면의 교차점을 찾아 선을 생성하고, 이를 지오메트리 대시 오브젝트로 변환했습니다.
- 300개의 2D 단면을 겹치고 앞뒤 크기를 조절하여 완벽한 투영 3D 지형을 만들었습니다.
- 전용 프로그래밍 언어 및 컴파일러: 복잡한 물리 엔진을 구현하기 위해 지오메트리 대시 트리거로 변환되는 독자적인 추상화 프로그래밍 언어를 개발하여 사용했습니다.
- 큐브의 원근감: 6개의 레이어로 큐브를 분할하고 점프 시 앞뒤 레이어의 크기와 속도를 미세하게 다르게 설정하여 시점 변화를 시뮬레이션했습니다.
4. 고도화된 3D 렌더링 알고리즘: 삼각형의 한계 돌파
- 26.6도의 제약: 지오메트리 대시 오브젝트로 만들 수 있는 가장 얇은 각도는 26.6도입니다. 따라서 컴퓨터 그래픽의 기본인 임의의 삼각형을 직접 만드는 것은 불가능합니다.
- 큐브 구성 알고리즘: 삼각형 대신 큐브를 선택하여 문제를 해결했습니다.
- 전면(Front Face) : 모든 각도가 26.6도 이상인 면을 먼저 배치합니다.
- 측면 처리: 전면 아래로 삐져나온 경사면 오브젝트를 숨기는 방식으로 부적절한 각도를 처리합니다.
- 논리적 보장: 알고리즘을 통해 어떤 방향에서도 단 11개의 오브젝트로 정밀한 큐브를 생성할 수 있게 되었습니다.
5. 애니메이션 시스템과 데이터 주입
- 객체 수 최적화: 수천 프레임의 애니메이션에 수십만 개의 오브젝트를 사용하면 게임이 충돌합니다.
- 워크플로우:
- 3D 애니메이션 프로그램에서 큐브의 움직임을 스케치합니다.
- 파이썬(Python) 스크립트로 각 프레임의 위치/회전 데이터를 추출합니다.
- 5,000줄의 러스트(Rust) 코드로 데이터를 지오메트리 대시 저장 파일에 직접 주입(Injection)합니다.
- 동적 로딩 시스템: 수천 개의 미세한 애니메이션으로 나누고 현재 프레임만 로딩하도록 설계하여 렉(Lag)을 제거했습니다.
- 유전 알고리즘(Genetic Algorithm) : 전환 효과를 위해 이미지를 오브젝트로 재구성할 때, 진화 시뮬레이션을 통해 최적의 형태를 찾아내는 알고리즘을 사용했습니다.
6. 로켓 파트와 물리적 연출
- 3D 로켓: 50개의 수작업 프레임(5개 회전 프레임 × 10개 원근 변형)으로 구현했습니다.
- 헬릭스(Helix) 효과 : 점 장식 오브젝트를 수백 개 쌓고 미세하게 회전시켜 나선형 제트 화염을 만들었습니다. 두 개의 나선을 겹치고 꼬리 지연 기술을 적용하여 액체 플라즈마 같은 질감을 연출했습니다.
- 배경 및 특수 효과: 회전하는 성운, 라인 트래커(Line Tracker)를 이용한 거대한 혜성 지대, 워프 속도 도달 시의 섬광 효과 등을 포함했습니다.
7. 프로젝트 마감과 최후의 사투
- 2.1 업데이트의 끝: 7년 만에 발표된 대규모 2.2 업데이트가 2.5개월 앞으로 다가오면서 제작자는 강박적인 마감 시한에 쫓기게 됩니다.
- 후반부 가속:
- 타이틀 시퀀스: 5가지 폰트를 3D 애니메이션 경로를 따라 배치했습니다.
- 레벨 몽타주: 23개의 유명 레벨을 정교하게 재현하여 삽입했습니다.
- 4D 하이퍼큐브: 4차원 초입방체를 3차원 소프트웨어로 프로그래밍한 뒤 라인 트래커로 2D 게임에 이식했습니다.
- 출시 후 문제 발생:
- 과도한 오브젝트 밀도로 인해 서버가 일시 마비되었습니다.
- 윈도우 버전의 구현 문제로 고사양 PC에서 로딩 시 충돌이 발생했으나, 오히려 구형 모바일 폰에서는 정상 작동하는 기현상이 벌어졌습니다.
8. 제작자의 회고와 철학
- 동기 부여의 변화: 초기에는 순수한 열정으로 시작했으나, 2년의 시간이 흐르며 오로지 의지력만으로 버티는 고통스러운 과정으로 변질되었습니다.
- 제약의 가치: 2.2 업데이트 이후 3D 구현이 훨씬 쉬워졌음에도 불구하고, 제작자는 **"이전 버전의 극한의 제약"**이야말로 자신의 작업물을 흥미롭게 만들었던 본질이었음을 깨닫습니다.
- 마지막 메시지: 과거의 자신에 대한 원망과 성취감이 교차하는 가운데, 잠시 눈을 감고 일상으로 돌아가는 휴식의 중요성을 역설하며 마무리됩니다.