Skip to main content

Arnis 완벽 분석: OpenStreetMap과 AWS 데이터로 실세계를 마인크래프트 월드로 변환하는 Rust 오픈소스

Published 5 min readMarkdown

Arnis 완벽 분석: OpenStreetMap과 AWS 데이터로 실세계를 마인크래프트 월드로 변환하는 Rust 오픈소스

Arnis는 OpenStreetMap 지리 데이터와 AWS Terrain Tiles 고도 데이터를 결합하여 지구상 어떤 위치든 마인크래프트 월드로 자동 변환하는 Rust 기반 오픈소스 도구입니다.

오픈 데이터와 게임 엔진의 교차점에서 탄생한 Arnis는 GitHub Stars 8,100개를 넘기며 약 30만 명이 사용하는 프로젝트입니다. Python에서 Rust로의 완전 재작성, Java와 Bedrock 동시 지원, 웹 기반 MapSmith까지 - 이 글에서는 Arnis의 아키텍처, 데이터 파이프라인, 기술적 결정들을 심층 분석합니다.

Arnis 프로젝트 개요

Arnis는 좌표 입력만으로 실세계 지형을 마인크래프트 월드로 변환하는 완전 자동화 도구입니다. WorldEdit이나 수동 모델링 없이 건물 외벽, 내부 구조, 지붕, 도로, 수계, 자연 지형을 블록으로 재현합니다.

핵심 수치:

지표값
GitHub Stars8,100+
사용자~300,000명
Contributors32명
라이선스Apache License 2.0
핵심 언어Rust

기술 아키텍처 심층 분석

Python에서 Rust로의 마이그레이션

Arnis는 원래 Python으로 개발되었으나, v2.0.0에서 Rust로 완전 재작성되었습니다. 이 결정의 배경은 다음과 같습니다.

  1. 메모리 안전성: 대규모 OSM 데이터셋 처리 시 Python의 GC(Garbage Collector) 오버헤드가 병목
  2. 처리 속도: Rust의 zero-cost abstractions으로 데이터 파이프라인 성능 극대화
  3. 바이너리 배포: 단일 바이너리로 크로스 플랫폼 배포 가능 (Python 런타임 의존성 제거)
// fastnbt 크레이트로 Minecraft region 파일(.mca) 직접 생성
// zero-copy 직렬화로 메모리 효율 극대화

데이터 파이프라인 아키텍처

Input Layer
  └── 좌표/바운딩 박스 파싱

Data Acquisition Layer (병렬 처리)
  ├── Overpass API → OSM 데이터 (건물, 도로, 수계, 자연)
  └── AWS Terrain Tiles → 고도 래스터 데이터

Processing Layer
  ├── OSM 파서 → 노드/웨이/릴레이션 추출
  ├── 좌표 변환 → 위경도 → MC XYZ 블록 좌표
  ├── 우선순위 레이어링 → 요소 간 충돌 해결
  └── 고도 프로세서 → 스무딩 + 갭 패칭 + 적응형 스케일링

Element Handlers
  ├── 건물 핸들러 → 외벽 + 내부 + 지붕 생성
  ├── 도로 핸들러 → 도로 폭/재질 매핑
  ├── 수계 핸들러 → 강/호수/바다 생성
  └── 자연 핸들러 → 숲/공원/초지 생성

Output Layer
  ├── Java Edition → .mca (fastnbt)
  └── Bedrock Edition → .mcworld

데이터 소스 비교

데이터소스프로토콜비용갱신 주기
지리 데이터OpenStreetMap Overpass APIHTTP REST무료커뮤니티 실시간
고도 데이터AWS Terrain Tiles / TerrariumS3 Static무료연간

두 소스 모두 무료라는 점이 Arnis의 가장 큰 접근성 장점입니다. 별도 API 키나 유료 구독이 필요 없습니다.

우선순위 기반 레이어링 시스템

여러 지리 요소가 동일 블록 좌표에 매핑될 때의 충돌 해결이 핵심 과제입니다. Arnis는 우선순위 큐 기반 레이어링을 사용합니다.

우선순위 (높은 순):
1. 건물 (structures) → 가장 높은 우선순위
2. 수계 (waterways) → 건물 다음
3. 도로 (roads) → 수계 다음
4. 자연 (natural) → 도로 다음
5. 지면 (ground) → 기본 레이어

같은 좌표에 건물과 도로가 겹치면 건물이 우선합니다. 이 방식으로 자연스러운 도시 레이아웃을 보장합니다.

고도 처리 파이프라인

실세계 고도를 마인크래프트의 Y좌표(-64~320, 총 384블록)에 매핑하는 과정은 4단계로 이루어집니다.

1. 스무딩 (Smoothing)

인접 타일 간의 급격한 고도 변화를 완화합니다. 이웃 블록의 고도 평균을 사용하여 자연스러운 경사를 만듭니다.

2. 갭 패칭 (Gap Patching)

AWS Terrain Tiles에서 데이터가 누락된 영역을 보간으로 채웁니다. 주변 고도값의 가중 평균을 사용합니다.

3. 검증 (Validation)

처리된 고도 데이터가 MC 높이 제한 내에 있는지 확인하고, 비정상적 값(음수 고도, 극단값)을 필터링합니다.

4. 적응형 스케일링 (Adaptive Scaling)

변환 영역의 고도 범위에 따라 스케일링 팩터를 동적으로 조절합니다. 평지 도시는 1:1에 가깝게, 산악 지형은 압축하여 MC 높이 제한 내에서 최대한 리얼리즘을 유지합니다.

릴리스 히스토리

버전날짜주요 변경기술적 의미
v2.0.02024Python → Rust 포팅성능 10x+, 메모리 안전성
v2.2.0 Alpine2025-01-22지형 리얼리즘 개선고도 처리 파이프라인 재설계
v2.4.0 Bedrock2025-12-05Bedrock Edition 지원.mcworld 형식 구현
v2.4.12026-01-11품질 개선엣지케이스 버그 수정

빠른 시작 가이드

CLI 사용법

# 저장소 클론 및 빌드
git clone https://github.com/louis-e/arnis.git
cd arnis
cargo build --release

# 서울 강남역 주변을 Java Edition으로 변환 (고도 포함)
./target/release/arnis \
  --bbox "37.4950,127.0260,37.5010,127.0320" \
  --output ./gangnam-world \
  --edition java \
  --terrain

# Bedrock Edition으로 변환
./target/release/arnis \
  --bbox "37.4950,127.0260,37.5010,127.0320" \
  --output ./gangnam.mcworld \
  --edition bedrock \
  --terrain

웹 버전 (MapSmith)

설치 없이 arnismc.com에서 바로 사용 가능합니다. 브라우저에서 지도를 드래그하여 영역을 선택하고, 옵션을 설정한 후 Generate를 클릭하면 됩니다.

기존 도구와의 기술 비교

항목ArnisWorldPainterMCEdit
자동화완전 자동반수동수동
데이터 소스OSM + AWS (무료)수동 또는 유료없음
에디션Java + BedrockJava만Java만
언어RustJavaPython
웹 버전MapSmith없음없음
건물 내부자동 생성수동수동

제한사항

정직하게 제한사항도 짚어보겠습니다.

  1. OSM 데이터 품질 의존: 도시 지역은 데이터가 풍부하지만, 개발도상국 농촌은 건물/도로 데이터가 부족할 수 있습니다
  2. MC 높이 제한: Y=-64~320 범위에 현실 고도를 압축해야 하므로, 히말라야 같은 극단적 지형은 스케일 왜곡이 불가피합니다
  3. 스케일링 버그: 특정 지형 조건에서 간헐적 발생 (활발히 패치 중)

자주 묻는 질문 (FAQ)

비용이 드나요?

Arnis 도구와 사용 데이터(OSM, AWS) 모두 무료입니다. Apache 2.0 라이선스입니다.

한국 지역도 변환 가능한가요?

네. 서울, 부산 등 대도시는 OSM 데이터가 풍부해서 높은 품질의 결과를 얻을 수 있습니다.

대규모 영역도 가능한가요?

가능하지만, 영역이 넓을수록 처리 시간과 파일 크기가 커집니다. 처음에는 500m x 500m로 시작해서 점차 넓히는 것을 추천합니다.

Rust를 몰라도 쓸 수 있나요?

네. 릴리스 바이너리 또는 웹 버전 MapSmith를 사용하면 Rust 지식 없이 사용 가능합니다.

마무리

Arnis는 오픈 데이터(OSM + AWS), 시스템 프로그래밍(Rust), 게이밍(Minecraft)의 교차점에서 탄생한 프로젝트입니다. Python에서 Rust로의 재작성, 우선순위 기반 레이어링, 적응형 고도 스케일링 등 기술적 결정들이 8,100+ Stars와 30만 사용자로 검증되었습니다.

시작하기: arnismc.com | GitHub

참고 자료

No comments yet. Be the first to comment.

More from this blog