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 Stars | 8,100+ |
| 사용자 | ~300,000명 |
| Contributors | 32명 |
| 라이선스 | Apache License 2.0 |
| 핵심 언어 | Rust |
기술 아키텍처 심층 분석
Python에서 Rust로의 마이그레이션
Arnis는 원래 Python으로 개발되었으나, v2.0.0에서 Rust로 완전 재작성되었습니다. 이 결정의 배경은 다음과 같습니다.
- 메모리 안전성: 대규모 OSM 데이터셋 처리 시 Python의 GC(Garbage Collector) 오버헤드가 병목
- 처리 속도: Rust의 zero-cost abstractions으로 데이터 파이프라인 성능 극대화
- 바이너리 배포: 단일 바이너리로 크로스 플랫폼 배포 가능 (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 API | HTTP REST | 무료 | 커뮤니티 실시간 |
| 고도 데이터 | AWS Terrain Tiles / Terrarium | S3 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.0 | 2024 | Python → Rust 포팅 | 성능 10x+, 메모리 안전성 |
| v2.2.0 Alpine | 2025-01-22 | 지형 리얼리즘 개선 | 고도 처리 파이프라인 재설계 |
| v2.4.0 Bedrock | 2025-12-05 | Bedrock Edition 지원 | .mcworld 형식 구현 |
| v2.4.1 | 2026-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를 클릭하면 됩니다.
기존 도구와의 기술 비교
| 항목 | Arnis | WorldPainter | MCEdit |
| 자동화 | 완전 자동 | 반수동 | 수동 |
| 데이터 소스 | OSM + AWS (무료) | 수동 또는 유료 | 없음 |
| 에디션 | Java + Bedrock | Java만 | Java만 |
| 언어 | Rust | Java | Python |
| 웹 버전 | MapSmith | 없음 | 없음 |
| 건물 내부 | 자동 생성 | 수동 | 수동 |
제한사항
정직하게 제한사항도 짚어보겠습니다.
- OSM 데이터 품질 의존: 도시 지역은 데이터가 풍부하지만, 개발도상국 농촌은 건물/도로 데이터가 부족할 수 있습니다
- MC 높이 제한: Y=-64~320 범위에 현실 고도를 압축해야 하므로, 히말라야 같은 극단적 지형은 스케일 왜곡이 불가피합니다
- 스케일링 버그: 특정 지형 조건에서 간헐적 발생 (활발히 패치 중)
자주 묻는 질문 (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
참고 자료
Comments
Join the discussionNo comments yet. Be the first to comment.
