글만든 이유와 원리
한 줄 설명이 3D 영상이 되기까지: 영상 코드가 스스로 사실을 검사하게 만든 방법
PromptFilm은 조사, 스토리보드, 제작, 검수를 거쳐 브라우저에서 재생되는 3D 영상을 만듭니다. 우주·GPU·영화 장면 세 편을 만들며, 화면의 숫자가 틀리지 않도록 영상 코드 안에 넣은 장치들을 정리했습니다.

PromptFilm은 Claude Code 플러그인입니다. “지구에서 관측 가능한 우주의 끝까지 확대해 줘” 같은 한 줄을 입력하면, 브라우저에서 재생되는 3D 영상을 HTML 파일 하나로 만들어 줍니다. 원하면 1080p 60fps MP4로도 뽑습니다.
이런 도구를 만들 때 가장 걱정한 건 그럴듯하지만 틀린 영상이었습니다. 설명 영상에서 숫자 하나가 틀리면 나머지 전부를 믿기 어려워집니다. 그래서 PromptFilm은 예쁘게 만드는 것만큼 틀리지 않게 만드는 과정에 공을 들였습니다. 이 글에서는 실제로 만든 영상 세 편을 예로 그 과정을 정리합니다.
한 편이 만들어지는 순서
| 단계 | 하는 일 |
|---|---|
| 1. 질문 | 조사 깊이, 화면 비율, 길이, 자막 언어를 처음에 한 번만 묻습니다. 그다음부터는 혼자 진행합니다. |
| 2. 조사 | 출처가 있는 사실, 참고 사진, 참고 영상의 장면을 모읍니다. |
| 3. 스토리보드 | 장면마다 몇 초를 쓸지 정한 카드를 만들어, Studio 화면에서 승인을 받습니다. |
| 4. 제작 | 함께 들어 있는 영상 엔진 위에서 Claude가 3D 장면을 코드로 씁니다. |
| 5. 검수 | 자동 검사, 영상을 만들지 않은 별도 에이전트의 화면 검토, 최종 관문을 통과할 때까지 고치고 다시 확인합니다. |
| 6. 전달 | 모든 버전의 HTML을 남기고, 원하면 MP4를 출력합니다. |
한 편에 에이전트 작업 몇 시간과 많은 토큰이 듭니다. 조사와 여러 차례의 검수가 들어가기 때문입니다. 빠른 생성보다 믿을 수 있는 결과를 우선한 선택입니다.
숫자는 코드 안에 출처와 함께 둔다
영상에 나오는 숫자는 장면 코드 여기저기에 흩어 쓰지 않고, 파일 맨 위의 사실 표 한 곳에 출처와 함께 모읍니다. 우주 영상(Cosmic Size Ladder)의 표는 이런 식입니다.
earth: { r: 6371.0, src: 'NASA Earth fact sheet (mean radius)' },
jupiter: { r: 69911, src: 'NASA Jupiter fact sheet' },
sun: { r: 1.0 * KM.RSUN, T: 5772, src: 'IAU 2015 nominal solar radius' },
betelgeuse:{ r: 764 * KM.RSUN, T: 3600, src: 'Joyce et al. 2020 (702–880)' },
proxima: 4.24, // ly
obsUniverse: 93e9, // ly, diameter (ESA)장면과 자막은 이 표에서 값을 꺼내 씁니다. 자막에 “목성 — 지구의 11배”라고 나온다면, 그 11은 누군가 손으로 적은 숫자가 아니라 표의 반지름으로 계산한 값입니다. 출처가 틀렸다면 표 한 줄만 고치면 모든 장면이 같이 바뀝니다.
별의 밝기처럼 직접 측정값이 마땅치 않은 숫자는 계산으로 만듭니다. 별의 밝기는 반지름의 제곱과 표면 온도의 네제곱에 비례한다는 슈테판–볼츠만 법칙을 써서, 표에 있는 반지름과 온도로 구합니다.
영상이 스스로 사실을 검사한다
한 단계 더 나아가, 몇몇 숫자는 영상이 재생되기 전에 스스로 검사하게 했습니다.
GPU 영상(Blackwell)은 NVIDIA의 아키텍처 문서를 따라 칩 구조를 그립니다. 문서에는 칩 하나에 GPC 12개, GPC마다 TPC 8개, TPC마다 SM 2개, SM마다 CUDA 코어 128개가 있다고 나옵니다. 영상 코드는 이 값들로 전체 개수를 직접 계산하고, 문서에 적힌 합계와 맞는지 확인합니다.
const DOCUMENTED_TOTALS = { tpcs: 96, sms: 192, cuda: 24576, tensor: 768, rt: 192, busBits: 512 };
// 12 × 8 = 96 TPC, × 2 = 192 SM, × 128 = 24,576 CUDA 코어 …
ARCH_CHECK.forEach(c => console.assert(c.ok, `ARCH mismatch: ${c.key}`));영화 장면을 재구성한 영상(New Element)은 마지막에 “117번 원소는 아이언맨 2 개봉 4주 전에 보고됐다”는 자막이 나옵니다. 이 “4주”도 손으로 쓰지 않았습니다. 논문 발표일(2010년 4월 9일)과 영화의 미국 개봉일(2010년 5월 7일)을 표에 두고 날짜 차이를 계산한 뒤, 28일이 아니면 영상이 아예 시작하지 않도록 오류를 냅니다.
const DAYS_117_TO_FILM = Math.round((Date.parse(FACTS.film.usRelease) - Date.parse(FACTS.e117.reported)) / 864e5);
if (DAYS_117_TO_FILM !== 28) throw new Error('fact check: element 117 → film should be 28 days, got ' + DAYS_117_TO_FILM);과해 보일 수 있지만, 영상을 고치는 과정에서 숫자를 바꾸거나 장면을 옮기다가 사실이 어긋나는 일을 막아 줍니다. 어긋나면 조용히 틀린 영상이 나가는 대신 바로 멈춥니다.
모르는 것은 모른다고 쓴다
공개된 자료로 확인할 수 없는 부분은 영상 안에서 설명용이라고 밝힙니다.
- Blackwell의 칩 구조도는 논리적인 블록 배치일 뿐 실제 실리콘 배치도가 아니라고 자막에 적었습니다. 카드 내부나 트랜지스터 재료층도 일반적인 구조를 보여주는 설명용입니다.
- 문서끼리 맞지 않는 부분도 그대로 둡니다. NVIDIA 문서는 RTX PRO 6000이 칩 전체를 쓴다고 하면서, 사양표에는 SM 188개로 적고 있습니다. 영상은 192개짜리 전체 구조를 그리되, 판매 제품에서 어떤 SM이 꺼져 있는지는 지어내지 않았습니다.
- 우주 영상의 제9행성은 “가설 · 미발견”, 우주 거미줄은 “약 10억 광년 안쪽만 관측, 그 밖은 모의 구조”라고 표시했습니다.
세 편의 출처와 설명용 표현은 영상 해설 페이지에 정리해 두었습니다.
숫자 말고도 맞춰야 하는 것
사실만 맞다고 좋은 영상이 되지는 않습니다. 몇 가지를 엔진 차원에서 정해 두었습니다.
크기가 아주 큰 장면. 우주 영상은 지구(약 10⁴km)부터 관측 가능한 우주(약 10²³km)까지를 한 장면에서 다룹니다. 이 범위를 그대로 3D 좌표에 넣으면 컴퓨터의 소수점 정밀도가 무너져 화면이 떨립니다. 그래서 매 프레임 우주 전체를 축소해, 카메라가 늘 지금 보는 대상에서 같은 거리에 있도록 했습니다.
보는 속도. 장면마다 도입, 핵심, 진행, 이동, 복귀 같은 성격을 붙이고 재생 속도를 다르게 합니다. 새로 나타나는 것이 없는 긴 이동은 빠르게, 자막이 가리키는 대상 앞에서는 멈춰 읽을 시간을 줍니다.
검토는 화면에서. 제작 중에 내 컴퓨터에서만 열리는 Studio 페이지가 뜹니다. 타임라인을 움직이며 보다가 잘못된 곳을 화면에서 바로 눌러 코멘트를 남기면, Claude가 그 장면의 스냅숏과 함께 받아 고치고 답합니다.
써 보려면
/plugin marketplace add Seokwoooo/promptfilm
/plugin install promptfilm@promptfilm직접 설치할 것은 Node.js 20 이상뿐이고, 나머지(헤드리스 Chrome, ffmpeg 등)는 첫 실행이 확인하고 없으면 설치합니다. 메모리는 8GB면 충분하지만, GPU가 없으면 렌더링이 느립니다.
결과물을 볼 때는 화면의 숫자를 한 번쯤 의심해 보시길 권합니다. 위의 장치들은 실수를 줄여 줄 뿐, 출처 자체가 틀렸다면 영상도 틀립니다. 틀린 곳을 발견하면 알려주세요.