TL;DR
- v1→v3: GPU 포인트 렌더러 + Remotion으로 EgoX 설명 영상 제작, 1920x1080 30fps 81.0초 → 68.0초
- 렌더: 1080p 약 0.7–0.9 s/frame (1 GPU), 합성 2,430프레임 8분 25초 (CPU 1코어), 테스트 25/25
- v3: 재현 결과 대신 프로젝트 페이지 공개본 + 선별 배치 클립으로 교체 (몽타주 6클립 × 2.7초)
1 배경 / 목적
비전공자 대상 발표 상영용 EgoX 설명 영상. 메시지: 3인칭 영상 → 3D로 세움 → 카메라를 주인공 눈으로 이동(안 보이던 곳은 빔) → AI가 빈 곳을 채움. 16:9 1920x1080, 30fps, 무음, 큰 한글 자막, 7컷. 핵심 컷("눈으로 날아 들어감")을 실제 클립 depth/camera 데이터로 렌더.
설계: docs/superpowers/specs/2026-10-07-egox-explainer-video-design.md
2 작업 내용
explainer/render3d/scene.py exo 영상+depth+camera_params → 프레임별 3D 점 (depth 0/NaN/inf 제거, SVD 정규직교화)
splat.py z-buffer 원판 스플랫 (depth 30bit + 점 index 22bit를 int64로 묶어 scatter_reduce amin), 반지름 = depth/fx×0.75, 2x supersample
shots.py flyin / lift (Slerp 회전, 호 보간, 화각 로그 보간)
post.py 배경, depth 기반 DoF, bloom, vignette
remotion/ src/scenes.tsx, storyboard.ts (타이밍·문구·클립 한 곳)
- ego 카메라에 90° roll 존재: roll 0/90/180/270 비교로 3클립에서 90° 확정 (
EGO_ROLL_DEG=90).
- 메타 회전행렬이 소수 4자리 반올림이라 비정규직교 → Slerp 끝점 1e-5 어긋남, SVD로 해결.
- v1 개선: look-at 기반 비행 경로(장면 15% 이상 화면 유지), joker ego_extrinsics가 프레임당 최대 28.5° 튀어
anchor_frame으로 고정, lift→fly-in 연결, 반지름 확장(최대 8배), scatter 통합.
- v2 피드백 4건 반영: 속도(훅 240→150f, 문제 255→165f, lift 420→210f), ego 카메라를 피라미드 모양 주황 카메라로(반화각 32°), yamamoto→breakingbadS5E8, 훅 1인칭 0프레임부터.
- v3: 지적(재현 결과 ≠ 공개 결과) → 프로젝트 페이지
joker_infer, tabletennis, hulk_blackwidow 사용(1232x448 규격 검증), 몽타주 4×4s → 6×2.7s (탁구·전두광·호떡·헐크·피아노·소주).
- 워커 Remotion:
libexpat 추가(explainer-chrome env), 시스템 폰트 없음 → delayRender로 Pretendard 로드 대기, 배치 스텝 1코어 고정.
3 결과
| 버전 | 길이 | 용량 | 비고 |
| v1 | 81.0s (2,430f) | 79.6 MB | 테스트 24/24, 결함 3건 발견·수정(자막 누락, 이음매 튐, 탁구 기울어짐) |
| v2 | 68.0s (2,040f) | 63.0 MB | 테스트 25/25, 이음매 diff 4.49 (정상 2.0–2.2) |
| v3 | 68.0s | 63.9 MB | 공개본 교체, 12프레임 검수 |
- 1단계 10클립 fly-in 시험: job 177741, 960x540 × 1,500프레임 21분 9초 (0.85 s/frame). 도착 방향 10클립 모두 일치.
- 3D 본 렌더(1080p): lift 420f 약 5분, fly-in 480f 약 7분. 이음매 diff 6.31 → 4.76 (v1) → 4.49 (v2).
- 색/기울기 문제 클립: djokovic·halland·ironman_captain 파란 톤, ironman 기울어짐, ironman·spiderman_stanlee·breakingbad는 v0 경로에서 중간 구간 빈 화면(look-at로 해결).
4 Takeaway
설명 영상 전체가 스크립트 기반 재현 파이프라인(3D 렌더 → 소재 → 합성). 클립/문구 변경은 storyboard.ts와 build_assets.py만 수정.
정지 화면 확인으로는 부족: 워커 자막 누락은 결과 mp4에서 프레임을 뽑아야 발견. 보여주기용 소재는 재현 폴더가 아닌 공개본·사용자 선별본을 써야 함.
5 Next Steps
- v3 사용자 검토 후 문구·타이밍 조정 (fly-in 16s, ③ 14.5s는 여전히 느릴 수 있음).
- 도착 화면이 어두움: 105° 핀홀 → 119° 어안 투영 렌더로 ③ 밑그림과 구도 일치.
- 깊이 경계 혼합 픽셀의 떠 있는 점 제거 필터, 근거리 물체(팔) 구슬 현상.
- 448x448 → 1080 확대 화질(업스케일 모델 검토), Blender(B안) 상향 여부.
- 호떡·피아노 exo 모서리의 원본 채널 로고, 영화·중계 영상 상영 저작권은 사용자 판단.