3D 줌 설명 동영상
어떤 차트보다 스케일을 잘 설명하는 형식: 모두가 아는 물체에서 시작하여 단 한 번의 컷 없이 그 안으로 날아들어가고, 화면에 숫자를 하나 유지하여 시청자가 얼마나 멀리 왔는지 알려주며, 예상치 못한 사실로 끝맺습니다. 이 스킬의 기준 결과물은 "Nothing is really sharp"입니다: 면도날, 26번의 반분, 하나의 철 원자, 그리고 그 날의 가장자리가 여전히 약 300개 원자 폭이라는 사실.
assets/template/은 완성된 프로젝트입니다. 빈 파일에서 시작하지 말고 이 템플릿에서 시작하세요: 까다로운 부분들(정밀도 손실 없이 8차원 규모를 줌, 스케일에 따라 변하는 디테일, 피사계 심도, 결정론적 렌더러)은 이미 해결되어 있으며, 제대로 구현하는 데 여러 번의 시도가 필요했습니다.
공식
다섯 가지 모든 요소를 유지하세요. 각각 역할을 하고 있습니다.
- 하나의 연속적인 샷. 전체 핵심은 시청자가 위치를 잃지 않는다는 점입니다. 컷은 스케일 감각을 리셋시킵니다.
- 하나의 실시간 측정값. 주제에 고정된 얇은 막대, 매 프레임마다 변하는 숫자, 반분(또는 배가) 횟수, 현재 보이는 것을 설명하는 두 세 단어. 막대는 시청자가 읽어야 할 유일한 것이므로 정직해야 합니다: 장면에서의 길이가 실제로 표시된 숫자여야 합니다.
- 모든 스케일에서 주제의 특성이 변합니다. 광택은 연마 자국, 칩, 결정립, 둥근 가장자리, 원자로 변합니다. 표면이 3초 동안 동일하게 보이면 줌이 아무 일도 일어나지 않는 것으로 읽힙니다.
- 스케일을 위한 물체들. 줌이 각 크기를 지날 때마다, 그 크기의 친숙한 물체가 주제 옆에 이름과 크기와 함께 자리합니다: 소금 결정, 머리카락, 적혈구, 박테리아, 바이러스, 트랜지스터, 항체, DNA. 추상적인 숫자를 "바이러스보다 작은"으로 바꿔줍니다.
- 결말. 시작 지점으로 빠르게 되돌아와 여정의 목적이었던 하나의 숫자를 보여줍니다.
워크플로우
1. 모델링 전 조사
동영상은 사실에 기반할 때만 가치가 있습니다. 실제 치수를 조사(웹 검색, 가능한 경우 1차 출처)하고, 주제와 각 스케일 객체에 대해 다음을 기록하세요: 크기, 출처, 그리고 단순화한 모든 내용. 그런 다음 해당 숫자로 기하학이 구축되므로 그림이 사실에서 벗어날 수 없습니다. 출처와 단순화 내용을 최종 사용자에게 보고하세요; 질문을 받을 것입니다.
6~9개의 스케일 객체를 선택하세요. 각각은 이전 객체보다 최소 약 3배 작아야 합니다. 그보다 가까우면 레이블이 겹치고, 약 30배 이상 멀어지면 화면이 몇 초 동안 비어 있습니다.
2. 계획이 도움이 될 때 표시
사용자가 먼저 계획을 보기를 요청했거나, 브리프에 실제 선택지(내레이터 유무, 언어, 결말)가 남아 있는 경우, 짧은 표를 제공하세요: 시간, 스케일, 보이는 것, 스케일 객체. 그렇지 않으면 계속 진행하세요; 아무도 요청하지 않은 계획은 첫 번째 렌더링만 지연시킬 뿐입니다.
3. 프로젝트 설정
cp -r <skill>/assets/template <project>/ && cd <project> && npm install
node render.mjs --stills 1,10,20,30,40
두 번째 명령은 GPU 이름을 출력하고 다섯 개의 JPEG를 out/에 써야 합니다. SwiftShader 또는 llvmpipe가 보고되면 CPU에서 렌더링되고 있으며 몇 시간이 걸립니다: GPU 플래그를 먼저 수정하세요(references/pitfalls.md 참조).
4. 장면 조정
main.js는 하나의 파일이며 섹션으로 나뉘어 있습니다. 구조적인 변경 전에 references/techniques.md를 읽으세요; 각 부분이 왜 그렇게 구성되었는지 설명합니다. 새로운 주제에 대해 일반적으로 변경되는 사항:
main.js 섹션 | 대체할 내용 |
|---|---|
| constants | 미터 단위의 물리적 데이터, 시작 크기 L0, 반분 횟수 HMAX, 타임라인 |
| subject surface | 단면 prof(), 윤곽 컷아웃, 표면 특징 테이블 FEATS (파장, 유형, 강도) |
| finest scale | 원자 격자(또는 마지막 단계를 구성하는 모든 것) |
| things for scale | addObj(name, sizeText, sizeInMetres, geometry, material, placement) 목록 |
| overlay | LABELS (각 줌 레벨에서 보이는 것), 최종 캡션 |
| camera keys | 줌 레벨의 함수로서 K_AZ, K_EL, K_TY, K_D, K_AP |
다른 모양(칩, 잎, 종이)의 주제에 대해서는 기계 장치를 유지하고 프로필과 특징을 교체하세요. 바깥쪽 줌의 경우 동일한 타임라인을 역순으로 실행하고 "두 배"라고 말하세요.
5. 영화 렌더링 전에 스틸 이미지 확인
타임라인 전체에 분산된 8~10개의 스틸 이미지를 렌더링하고, ffmpeg로 연락처 시트에 타일링한 다음 읽으세요. 그런 다음 본 것을 수정하고 반복하세요. 이 루프에서 품질이 나옵니다; 참조 영화의 첫 번째 버전에서 모든 문제는 스틸 이미지에서 볼 수 있었고 코드에서는 볼 수 없었습니다. 특히 확인할 사항:
- 노출. 첫 번째 패스는 거의 항상 날아갑니다. 금속은 대부분 어둡고 정의된 하이라이트가 있어야 합니다.
- 프레임 가장자리로 잘린 모든 것, 특히 상단 근처의 스케일 객체.
- 밝은 영역이나 서로 위에 있는 레이블. 측정 레이블은 빈 검은색 영역에 유지하세요.
- 각 단계가 레이블이 말하는 대로 읽히는지. 레이블이 "입자"라고 말하고 그림이 줄무늬라면 둘 중 하나가 잘못된 것입니다.
- 첫 번째와 마지막 프레임, 썸네일과 핵심 포인트이기 때문입니다.
ffmpeg -y -i a.jpg -i b.jpg -i c.jpg -i d.jpg -filter_complex "[0][1]hstack[t];[2][3]hstack[u];[t][u]vstack,scale=1920:-1" sheet.jpg
6. 결과 렌더링 및 확인
node render.mjs --full --o video.mp4 # 내레이션이 있으면 --audio vo.wav 추가
백그라운드에서 실행하세요; 1080p에서 45초 영화는 개별 GPU에서 몇 분 정도 걸립니다. 그런 다음 이전에 만든 스틸 이미지가 아닌 파일 자체를 확인하세요: 지속 시간과 크기를 프로브하고, 개요 그리드를 추출하고, 바쁜 구간에서 연속된 6프레임을 추출하여 깜박임을 확인하세요. 미세한 절차적 디테일은 압축이 잘 안 되므로 큰 파일이 예상되며 필요할 때 더 작은 복사본을 만드세요:
ffmpeg -i video.mp4 -vf "fps=1/3,scale=640:-1,tile=4x4" -frames:v 1 overview.jpg
ffmpeg -ss 13 -i video.mp4 -vf "crop=960:540:480:270,tile=3x2" -frames:v 1 consecutive.jpg
ffmpeg -i video.mp4 -vf scale=1280:720 -c:v libx264 -preset slow -crf 25 -maxrate 4200k -bufsize 8400k small.mp4
무엇을 확인했고 무엇을 확인하지 않았는지 명확히 말하세요. 프레임 그리드는 그림이 올바르다는 것을 증명하지만, 움직임이 올바르게 느껴진다는 것을 증명하지는 않으므로 사용자가 시청해야 한다고 말하세요.
기본값
- 무음. 요청하지 않는 한 음악, 음향 효과, 내레이션 없음. 형식 자체로 전달되며, 참조 영화에도 내레이션이 없었습니다.
- 텍스트는 데이터와 이름만. 측정값, 반분 횟수, 보이는 것, 스케일 객체의 이름과 크기, 하나의 최종 숫자. 내레이션이 추가되면 음성이 이미 말하는 모든 레이블을 제거하세요. 같은 단어를 읽고 듣는 것은 주의를 분산시키기 때문입니다.
- 1920x1080, 30fps, 40~50초, 1.5배속으로 렌더링하고 다운스케일. 세로 동영상의 경우
W와H를 변경하고 모든 스틸 이미지를 다시 확인하세요; 구도가 자동으로 전이되지 않습니다. - 레이블은 사용자 청중의 언어로, 항상 대화 중인 언어와 같지는 않습니다. 불분명하면 물어보세요.
내레이션 추가
요청 시에만. 각 스테이지에 속하는 짧은 라인으로 스크립트를 작성하고, 오디오를 생성하거나 수신하고, 단어 타이밍을 얻고(faster-whisper가 잘 작동함), 그런 다음 오디오에서 줌을 구동하세요: 줌 레벨은 오디오 키프레임 함수가 되어, 스테이지를 설명하는 동안 유지되고 스테이지 사이를 이동합니다. 오디오를 render.mjs --audio에 전달하세요. 각 유지 시간 동안 작은 일(빛 스윕, 객체 도착, 원자 진동)이 발생하도록 하세요. 그렇지 않으면 멈춘 줌이 얼어붙은 것처럼 보입니다.
참조 파일
references/techniques.md- 템플릿이 작동하는 방식과 이유: 초점 지점 주변 스케일링, 스케일 윈도우 프로시저럴 디테일, 구체 임포스터, 피사계 심도, 물리적 공간에 고정된 객체, 결정론적 렌더러. 구조적 변경 전에 읽으세요.references/pitfalls.md- 이미 만난 실패와 그 수정 사항. 렌더링이 잘못 보이거나 도구가 오작동할 때 읽으세요.MASTER_PROMPT.md- 새 동영상 시작을 위한 채우기 프롬프트와 공식에 맞는 주제 아이디어.