# POI/측점 라벨 이동 부드럽게 — 라인처럼 매 프레임 연속 포즈로 직접 투영

**날짜**: 2026-06-24
**수정 파일**: `client/src/components/overlay/StationOverlay.tsx`

## 증상
재생 중 드론 카메라가 움직일 때 POI/측점 라벨 이동이 부드럽지 않음(라인은 부드러움).

## 원인
- **라인(중심선·궤적)**: RAF 가 매 프레임 `poseAt(estFrame)`(연속 보간 포즈)로 직접 투영 → 부드러움.
- **라벨**: precompute 가 **정수 프레임별 화면좌표**를 저장하고, RAF 는 baseFrame↔baseFrame+1
  사이를 선형 보간 + EMA. 프레임키가 estFrame 과 안 맞으면(밀도/오프셋) 폴백(frac=0, 보간 없음)
  → 동기 프레임 단위(거친 timeupdate)로 점프 → 덜 부드러움.

## 조치 — 라벨도 라인과 동일하게 연속 포즈로 직접 투영
precompute 의 역할을 **'가시성/겹침 결정'만** 으로 한정하고, 좌표는 RAF 가 매 프레임 재투영.
- `LabelCache` 저장 형식: 화면좌표(sx,sy)/(x,y) → **월드좌표**.
  · 측점: `{title, lat, lon, z}` (선로 스냅 좌표).
  · POI: `{title, category, lat, lon, gz}` (gz=지면고도; override/최근접 선로표고).
- precompute: 기존대로 거리·겹침·클립 판정(화면좌표는 판정용 임시), 통과분만 월드좌표로 저장.
- RAF: `dronePose = poseAt(estFrame)` 한 번 구해 라인·라벨 공통 사용.
  · 측점: `toCameraCoords(dronePose, lat, lon, z)` → `pixelFromCamera` → 화면좌표.
  · POI: `pz = 드론높이모드 ? dronePose.alt−지오이드−이격 : gz` → 동일 투영.
  · 기존 `smoothStep`(이상치 거부+EMA) 유지 → emaAlpha 슬라이더로 추가 평활 가능(기본 1.0=통과).
- 정수프레임 보간/labelsB/title 짝짓기/프레임키 의존 제거.

## 효과
- 라벨이 라인과 동일한 연속 포즈로 움직여 **부드럽게 이동**(드론 밀도/프레임키 무관).
- 성능: RAF 는 가시집합(소수)만 투영(겹침/최근접은 precompute) → 가벼움.
- 가시집합 멤버십만 baseFrame 기준(최대 ~1프레임 지연)·위치는 연속 → 체감 영향 없음.

## 검증
- `npm run build -w client` (node20) tsc + vite build 통과.

**소요 시간**: 약 18분
**Context 사용량**: input ~580k / output ~9k tokens
