Files
GhiVideo_v4/docs/history/2026-06-24_1343_라벨-연속포즈투영-부드럽게.md
T
b23042andClaude Fable 5 d38b842e8d GhiVideo 소스 복제 — v4 작업 시작 기준
기존 GhiVideo 저장소 HEAD의 트래킹 소스 362개 파일을 복제.
(node_modules·storage·빌드 산출물·대용량 미디어는 .gitignore 규칙대로 제외)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 14:32:51 +09:00

2.3 KiB

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