05
Orbit
INDEPENDENT EXPERIMENT · 2026
공개 TLE로 그리는 실시간 위성 궤도
Overview
공개 궤도 요소(TLE)만으로 지금 이 순간의 위성 위치를 그리는 웹 실험입니다.
외부 지도 타일이나 실시간 위치 API 없이, 빌드 때 받아 둔 궤도 요소를 브라우저에서 전파해 지구와 위성을 함께 그립니다.
점을 누르면 해당 위성의 한 바퀴 궤적과 현재 고도·속도·좌표를 확인할 수 있습니다.
Problem
위성 데이터는 대개 지도 위의 정적인 결과로 보입니다. 실제로는 서로 다른 고도와 주기를 가진 물체들이 같은 지구 주위를 계속 움직입니다.
그 움직임을 보이되, 실행할 때마다 외부 서비스에 의존하거나 수천 개의 점으로 화면이 과밀해지지 않는 작은 실험을 만들고 싶었습니다.
Constraint
현재 위치 API에 기대지 않는다
외부 API를 실행 중에 호출하면 CORS, 장애, 호출 제한이 곧 화면의 장애가 됩니다. 궤도 요소는 위치 그 자체가 아니라 위치를 계산하는 재료이므로, 한 번 받아 두면 임의 시각의 위치를 브라우저에서 다시 계산할 수 있습니다.
많지만 읽을 수 있어야 한다
활성 위성을 전부 그리면 점 구름이 됩니다. 우주정거장·과학·기상·GPS처럼 역할과 궤도가 다른 공개 그룹만 골라, 서로 다른 높이와 기울기는 보이되 선택 가능한 밀도를 유지했습니다.
지구를 설명하되 무겁게 만들지 않는다
사진 텍스처는 시선을 빼앗고 네트워크 비용도 큽니다. 축약한 해안선과 위경도 격자만 사용해, 위성이 어느 쪽 위를 지나가는지 읽을 수 있는 최소한의 기준만 남겼습니다.
Decision
TLE는 빌드 때, 전파는 실행 때
수집 스크립트가 CelesTrak의 TLE를 정적 JSON으로 저장합니다. 페이지는 그 파일만 받아 satellite.js로 현재 시각의 ECI 좌표를 구하고 위경도·고도로 바꿉니다. 배포물은 정적이지만, 점은 열 때마다 현재 시각에 맞춰 움직입니다.
선택한 한 기만 궤적을 그린다
모든 궤적을 미리 그리면 선이 지구를 덮고 계산량도 커집니다. 점을 선택한 순간 그 위성의 평균운동으로 한 주기를 샘플링해 한 줄만 그립니다. 선택하지 않을 때는 점들의 흐름만 남습니다.
회전은 자동으로, 탐색은 손으로
처음에는 천천히 회전해 3D 물체라는 사실을 드러냅니다. 드래그 중에는 자동 회전을 멈추고 위아래 기울기를 제한해 뒤집힌 지구가 되지 않게 했습니다. 모션 감소 설정에서는 자동 회전을 처음부터 끕니다.
Interface
Loading orbits…
DRAG TO ROTATE · SELECT A SATELLITE
Engineering
- TLE groups공개 궤도 요소를 빌드 때 묶어 둔다
- satellite.js현재 시각의 ECI 위치와 속도를 전파한다
- Geodetic위경도·고도로 바꿔 지구 표면과 맞춘다
- Three.js점·해안선·선택 궤적을 한 장면에 그린다
120ms마다 위치만 갱신
매 프레임 전파하지 않고 120ms 간격으로 점 버퍼만 다시 씁니다. 렌더링은 부드럽게 이어지고, 계산은 궤도 변화가 눈에 띄기 시작하는 빈도로만 합니다.
실패한 요소는 전체를 멈추지 않는다
TLE 한 쌍이 파싱되지 않거나 전파에 실패하면 그 항목만 건너뜁니다. 데이터 파일을 읽지 못했을 때만 명시적인 상태 메시지를 보입니다.
보이지 않을 때도 메모리를 남기지 않는다
리사이즈 관찰자·포인터 리스너·애니메이션 프레임을 컴포넌트 종료 때 모두 해제하고, Three.js 지오메트리·머티리얼·렌더러도 함께 dispose합니다.
Result
외부 런타임 API 없이도 실제 궤도 요소에서 출발한 인터랙티브한 3D 장면을 정적 포트폴리오 안에 넣었습니다.
데이터는 다음 빌드에서 새로 받을 수 있고, 방문자는 한 위성을 골라 현재 위치와 한 바퀴의 경로를 직접 확인할 수 있습니다.
궤도 요소는 CelesTrak 공개 데이터, 해안선은 Natural Earth 1:110m 공개 데이터를 사용했습니다. TLE는 시간이 지날수록 예측 정확도가 낮아지므로 다음 빌드에서 갱신합니다.