달리기를 마치고 앱을 닫으려는 순간, 갑자기 화면에 3D 영상이 펼쳐져요. 내가 방금 뛴 한강 둔치 코스가 마치 드론으로 촬영한 것처럼 하늘 위에서 내려다보이고, 경로가 빛나는 선으로 도시 위를 미끄러지듯 날아가죠. “이게 어떻게 만들어지는 거지?” 라는 생각, 한 번쯤 해보셨을 거예요. 사실 이 영상의 재료는 딱 하나예요. 여러분의 스마트폰이 1~2초마다 몰래 기록한 GPS 좌표들이거든요. 그 좌표 점들이 어떤 과정을 거쳐 영상이 되는지, 기술적으로 뜯어볼게요.
📍 GPS가 뭘 기록하는지부터 알아야 해요
스마트폰 GPS가 실제로 저장하는 데이터는 생각보다 훨씬 구체적이에요. 기본 단위는 위도(latitude), 경도(longitude), 고도(altitude), 그리고 타임스탬프(timestamp) 이렇게 네 가지예요.
예를 들어 서울 여의도 한강공원에서 달리기 시작했다면, 앱은 이런 데이터를 기록해요.
위도 37.5283, 경도 126.9320, 고도 12.4m, 시각 07:32:01
위도 37.5285, 경도 126.9323, 고도 12.6m, 시각 07:32:02
1초에 한 번씩 찍히는 거예요. 5킬로미터를 30분 달리면 약 1,800개의 좌표 점이 쌓이는 셈이죠. 이 데이터는 GPX(GPS Exchange Format)라는 표준 파일 형식으로 저장돼요. XML 기반 텍스트 파일이라 메모장으로 열어보면 숫자와 태그가 줄줄이 나와요. 이 1,800개의 점들이 바로 3D 영상의 원재료예요.
중요한 건 고도 데이터예요. 위도·경도만 있으면 2D 지도 위 선으로만 표현할 수 있는데, 고도가 있어야 비로소 3차원 공간에 경로를 배치할 수 있거든요. 다만 스마트폰 기압 센서(barometer)가 없는 기기에서는 GPS 위성 신호로 고도를 추정하는데, 이 경우 오차가 10~15m까지 날 수 있어요. 그래서 고급 러닝 앱들은 기기 GPS 고도 대신 외부 수치 지형 모델(DEM, Digital Elevation Model) 데이터를 가져와서 덮어씌우기도 해요.
🗺️ 좌표 점들이 선이 되고, 선이 공간에 올라서는 과정
1,800개의 좌표 점을 그냥 이어 붙이면 엄청나게 울퉁불퉁한 선이 나와요. GPS 신호는 완벽하지 않거든요. 고층 건물 옆을 달리면 반사된 신호(멀티패스 오류) 때문에 실제 경로에서 20~30m 벗어난 점이 툭 튀어나오기도 해요. 이 잡음을 정리하는 과정이 먼저 필요해요.
가장 많이 쓰이는 방법은 칼만 필터(Kalman Filter)예요. 이전 위치와 현재 위치, 그리고 이동 속도를 종합해서 “이 점은 물리적으로 가능한 위치인가”를 판단하고 튀어나온 값을 보정해줘요. 시속 200킬로미터 이동을 나타내는 점이 갑자기 나오면 필터가 잡아내는 식이죠. 또 더글라스-푸커(Douglas-Peucker) 알고리즘으로 큰 방향성을 유지하면서 불필요한 중간 점들을 솎아내요. 1,800개짜리 경로가 500개 정도로 압축될 수 있어요.
이렇게 정제된 좌표 선을 실제 지도 공간 위에 올려야 하는데, 이때 지구가 구형이라는 게 문제가 돼요. 평평한 화면에 둥근 지구 위의 선을 올리려면 투영 변환이 필요해요. 대부분의 앱은 웹 메르카토르(EPSG:3857) 좌표계를 써서 위도·경도를 x, y 픽셀 좌표로 변환해요. 그리고 고도 값은 z축으로 변환되면서 드디어 3D 공간 안의 선이 완성돼요.
🏙️ 도시 배경이 생기는 원리 — 지도 타일과 3D 건물 데이터
좌표 선 하나만 3D 공간에 떠 있으면 아무 감흥이 없어요. 그 아래에 건물이 있고, 도로가 있고, 한강이 보여야 “아, 내가 저기를 뛰었구나” 하는 느낌이 오거든요. 이 배경을 만드는 재료가 따로 있어요.
도로와 지표면은 래스터 지도 타일 또는 벡터 지도 타일을 사용해요. 구글 맵, 애플 맵, Mapbox 같은 서비스가 전 세계 지도를 256×256픽셀 단위 타일로 잘라서 제공하고, 앱은 카메라 위치 기준으로 필요한 타일만 골라 불러와서 평면 지형으로 깔아요. 확대 수준(줌 레벨)에 따라 타일 해상도가 달라지는데, 도시 상공에서 바라보는 플라이오버 뷰에 적합한 줌 레벨은 보통 14~16 사이예요.
3D 건물은 OpenStreetMap의 건물 높이 데이터나 구글·애플이 자체 제작한 3D 도시 메시(3D City Mesh)를 사용해요. 서울 중심부나 여의도 같은 주요 지역은 건물 외벽 텍스처까지 실제 사진으로 매핑된 포토리얼리스틱 데이터가 있는 경우도 있어요. 이 건물 데이터와 지도 타일을 GPU 기반 렌더링 엔진(예: Metal on iOS, Vulkan on Android)으로 실시간 합성하면 3D 배경 도시가 탄생해요.
🎬 카메라 경로가 만들어지는 방법 — 플라이오버의 핵심
배경과 달린 경로가 3D 공간에 다 올라왔어요. 이제 이걸 어떤 시점으로, 어떤 속도로 날아가며 보여줄지 결정해야 해요. 이게 바로 플라이오버(flyover) 효과의 핵심이에요.
카메라는 달린 경로 선을 따라가면서 특정 규칙으로 움직여요. 앱마다 조금씩 다르지만 일반적인 방식은 이렇게 작동해요.
첫째, 카메라 위치는 경로 선보다 일정 고도 위(보통 지표에서 100~300m 상공)를 유지해요. 둘째, 카메라가 바라보는 방향(시선 벡터)은 경로의 다음 포인트를 향하도록 실시간 계산돼요. 셋째, 구간마다 실제 달린 속도 데이터가 있으니까 빠르게 뛴 구간은 카메라도 빠르게 날아가고, 천천히 걸은 구간은 느려지는 식으로 속도를 비례 매핑할 수 있어요. 넷째, 급격한 방향 전환 구간에서 카메라가 갑자기 꺾이면 어지러우니까 스플라인 보간(cubic spline interpolation)으로 카메라 경로를 부드럽게 만들어요.
이 네 가지를 조합하면 드론이 나를 따라 날아다니는 것 같은 플라이오버 영상이 완성돼요. 실제로 드론은 없고, 전부 소프트웨어가 계산해서 만들어낸 가상의 카메라 움직임이에요.
📱 스마트폰이 이걸 실시간으로 처리하는 방법
이 렌더링 과정이 PC 게임 그래픽이라면 고사양 그래픽카드가 필요하겠지만, 스마트폰에서 어떻게 이게 돌아가는 걸까요?
핵심은 오프라인 렌더링과 타일 캐싱이에요. 달리기가 끝난 직후 영상을 만들 때, 앱은 현재 위치 주변 타일 데이터를 미리 캐싱해뒀다가 써요. 러닝 중에 이미 지도 타일을 다운로드해놨기 때문에 사후 렌더링이 비교적 빠른 거예요. 건물 3D 메시는 복잡도를 낮춘 LOD(Level of Detail) 모델을 쓰고, 거리가 멀어질수록 더 단순화된 형태로 교체해서 GPU 부담을 줄여요.
iOS에서는 애플의 Metal API, 안드로이드에서는 Vulkan이나 OpenGL ES를 통해 GPU를 직접 제어해요. 화면에 보이는 프레임 하나하나가 GPU가 0.016초(60fps 기준) 안에 계산해서 뽑아내는 결과물이에요. 3D 건물, 지형, 경로 선, 카메라 움직임을 전부 이 안에 처리하는 거예요.
완성된 영상을 녹화해서 공유하려면 화면 녹화 기능이 필요한데, iOS는 ReplayKit, 안드로이드는 MediaProjection API를 사용해서 실시간으로 프레임을 캡처하고 H.264나 HEVC 코덱으로 압축해요. 그래서 최종 공유 파일은 무거운 3D 렌더링 데이터가 아니라 일반 mp4 영상 파일로 떨어지는 거예요. 이 영상을 인스타그램 스토리에 올리거나 카카오톡으로 보내는 게 가능한 이유죠.
지오윌(Geowill)의 3D 플라이오버 기능도 이 파이프라인 위에서 작동해요. 달린 코스를 도시 위 3D로 다시 보고, 화면 녹화로 바로 공유할 수 있게 만든 건데, 위에서 설명한 GPS 정제 → 좌표 변환 → 지도 렌더링 → 카메라 경로 생성의 흐름이 그대로 적용돼요.
✨ GPS 한 줄이 영상이 되기까지, 생각보다 긴 여정이었죠
정리하면 이렇게 돼요. 스마트폰이 1초마다 찍은 위도·경도·고도 좌표가 GPX 파일로 쌓이고, 칼만 필터로 잡음을 제거한 뒤 3D 좌표 공간으로 변환돼요. 그 위에 지도 타일과 3D 건물 메시가 합쳐지고, 스플라인 보간으로 부드럽게 만든 가상 카메라가 경로를 따라 날아가면서 GPU가 초당 60번 프레임을 뽑아내요. 마지막으로 그 화면이 mp4로 압축되어 공유 가능한 영상이 되는 거예요.
여러분이 “오늘 5킬로 뛰었어요” 라고 찍은 영상 한 편 뒤에는, 이렇게 복잡한 기술 파이프라인이 숨어 있어요. 달리기를 마치고 나서 그 영상을 한 번 더 들여다보면, 단순한 기록 이상의 무언가가 느껴질 거예요. 내가 발로 그려낸 경로가 도시 위를 날아다니는 걸 보면서, 다음 달리기가 조금 더 기대가 되는 게 우연은 아닐 테니까요.