만화 3D 스토리 단편 (three.js + Remotion)
검증된 예시: The Bridge That Fell for a Song. 1831년 브로튼 다리와 행진하는 74명의 군인에 관한 독창적인 67초 단편입니다.
- 코드: Remotion 프로젝트의
src/videos/bridge/(컴포지션BridgeShort, 1080x1920, 30fps). - 대본, 음성 및 사운드:
~/bridge-short/. - 스타일 연구:
references/.
스타일 참조는 비공개로 연구된 채널입니다 (references/: STYLE_BIBLE.md, reports/*.md, frames/).
- 해당 영상은 비공개 학습 자료입니다. 절대 업로드, 게시 또는 전송하지 마십시오.
- 대본, 캐릭터 또는 장면을 절대 복사하지 마십시오. 스토리, 캐릭터 및 음성은 항상 우리만의 것입니다.
- 음성 해설이나 설명에서 채널 이름을 절대 언급하지 마십시오.
적용되는 사용자 규칙:
- 영상에 자막이나 레이블을 넣지 마십시오.
- 영어만 사용합니다.
- 음성: 일정한 톤.
- 농담은 조사된 실제 사실입니다.
- 표준 믹스: 음악 +3dB, SFX -6dB, 음성 변경 없음.
- 최종 내보내기 2K 세로: 1440x2560,
--scale 1.3333. - Opus max가 모든 단계를 검증합니다.
- 각 단계 후 저장합니다.
- 대본이 승인되면 "그냥 실행"합니다.
파이프라인
- 주제 및 사실. 하나의 놀라운 실제 이야기를 선택하세요. 물리적 원인과 결과가 있어야 하고(시각적이어야 함), 이를 설명하는 간단한 일상 비유가 있어야 합니다.
- 사실과 출처를
SCRIPT.md상단에 작성합니다.
- 사실과 출처를
- 대본 (~3.7단어/초, 55-70초). 다리 단편의 비트 공식:
- 갈고리: 터무니없는 사실을 한 줄로 요약합니다. ("일흔네 명의 군인이 그냥 걸어서 철교를 무너뜨렸다.")
- 배경: 연도, 장소, 자부심.
- 행동: 세네 번의 비트에 걸쳐 확대되며, 각 비트는 조금씩 더 커집니다.
- 결정적 순간: 무너지는 순간.
- 무표정한 이중 대사: "운 좋게도 ... / 불운하게도 ...".
- 설명: 일상적인 비유(그네 타는 아이)를 통한 하나의 물리학 아이디어.
- 결과: 이로 인해 만들어진 규칙.
- 회상 반전: 결말.
- 시청자가 이미 보고 있는 내용을 화면에 절대 설명하지 마십시오.
- 음성.
voice.wav를 녹음하거나 생성한 다음, 단어 타이밍을words.json으로 만듭니다(단어 시간을 포함한 음성-텍스트 도구 사용).- 프로젝트 폴더(예:
~/bridge-short/voice/)에 넣습니다. - 단어 타이밍을 수동으로 수정합니다. 모든 것은 words.json에 동기화됩니다.
- 프로젝트 폴더(예:
- 샷 계획
story.ts에서:templates/bridge/(Remotion 프로젝트의src/videos/bridge/와 동일한 최종 브리지 소스)를src/videos/<name>/로 복사하고,src/Root.tsx에서BridgeShort옆에 새 컴포지션을 등록한 다음 이름을 바꿉니다.SHOTS: id, a/b 프레임, 조명(day/golden), 군중 모드,tau스토리 시간.XFADE: 장소/시간 변경 시 크로스페이드.FLASH_AT: 갈고리 후 흰색 플래시.CAMS: 샷별 키{f, dur?, cut?, s: f => {pos, look, fov, roll}}.KICKS: 충격 플립-셰이크.DOF/dofAt: 비트별 렌즈 블러.FOREGROUND: 근접 프레이밍 소품.- 모든 시각적 반응은 해당 단어보다 0-3프레임 먼저 도착합니다.
- 세계.
lights.ts: LIGHTS와 조명별 LOOK 하늘/강/구름 팔레트.shade.ts: 2-톤 쉐이딩 및untone().build.ts: 마을, 집 및 Kenney CC0 키트 소품, 색상 재지정, 카메라를 가리는 물체의 시선 차단 제거.paint.ts: HD Canvas2D 페인트 텍스처, 이음새는 어두운 색조로 칠함.world.ts: 하늘 셰이더, 안개 = 수평선 색상, 강, 프레임별 포즈, 샷별로 고정된 태양 및 카메라 상대 위치.
- 캐릭터.
toon.ts: Canvas2DPen드로잉 API, 600x1000 디자인 캔버스, y=975에 밑창, 콩 머리, 막대기 사지, 자두색 가변 너비 윤곽선, 얼굴 라이브러리.cast.ts: 카메라를 향한 빌보드, 군중, 효과 카드, 깜박임, 걷기 사이클. 모든 빌보드는NOINK레이어로 이동합니다.cardshade.ts: 장면 조명에 의해 조명되는 카드, 자체 발광 없음.
- 포스트 (
Bridge.tsx+ink.ts+lensblur.ts+grade.ts).- 컴포저 순서: 잉크 → 렌즈 프리 → 렌즈 메인 → 블룸 → NEUTRAL 톤 맵 → 그레이드(MSAA 4).
- 모든 픽셀 매개변수는 출력 높이 / 1920에 따라 조정됩니다.
- 사운드 (
~/bridge-short/audio/: timeline.py, sfx_gen.py, sfx.py, music.py, instruments.py, dsp.py, mix.py).- 이벤트 테이블 → 합성 SFX와 음성 아래에 덕킹된 오리지널 악보.
- 출력: mix.wav(48kHz, 정확한 길이), stems 및 cues.md.
- 사운드를 만들기 전에 영상의 시간 상수를 고정합니다. 이후 타이밍 변경은 사운드를 다시 실행해야 합니다.
- 룩 체크.
node scripts/bridge-stills.mjs out/<name>/x_ 100,400 0.5실행.BRIDGE_ENTRY=src/sandboxes/<n>/index.tsx를 설정하여 샌드박스 복사본을 렌더링합니다.python scripts/sbs_sheet.py out.jpg --ours ... --ref ...로 참조 프레임과 나란히 비교합니다.- Opus max 검증자에게 전송: 1-3개의 이미지, 200단어 이하의 판정.
- 최종 렌더링.
npx remotion render src/index.ts <Comp> out/<name>/video.mp4 --codec h264 --crf 16 --scale 1.3333-map 0:v:0 -map 1:a:0으로 먹싱합니다(Remotion은 무음 오디오 트랙을 작성함).- QA:
python scripts/short_qa.py final.mp4 out/<name>/qa shots.json은 모든 프레임에서 블랙, 화이트, 프리즈 및 팝 프레임과 음량 및 시트를 확인합니다. - 발견된 모든 문제를 수정한 다음, 심층 Opus 감사를 실행합니다.
- 전달. 최종 mp4를 SendUserFile로 전송하고, 메모리를 업데이트하며, 노트를 작성합니다.
최종 룩 값 (4차 검증 이후 다리; 모두 templates/bridge/에 있음)
모든 새 단편은 templates/bridge/에서 시작합니다(src/videos/<name>/로 복사). 룩은 이 값들에 있고, 스토리는 story.ts / build.ts 레이아웃 / cast.ts 역할에 있습니다. 최종 Opus max 점수: 색상(day) 7, 색상(golden) 5-6, 조명 5-6, 잉크 6, 텍스처 5-6, 캐릭터 7, 깊이 6-7, 구성 6-7 (시작 시 5/3/4/5/4/7/4/6에서 향상).
- 조명 프리셋 (
lights.ts, 태양은 카메라 상대적이며 샷별로 고정):- day: az 75 / el 48, lit [1.58,1.5,1.33], shade [.30,.29,.36], lift [.05,.06,.11] (그늘에만 쿨 틴트), 하늘 상단 #3e7fd2 → 수평선 #b8d0ec, 안개 = 수평선, 25→300m, uSat 1.08, 60m 이후 약 15% 블루 헤이즈.
- golden: az 6 / el 7 (역광 낮은 태양), 키는 #FFB36B ×1.5 방향, 바이올렛-블루 그늘 (파사드 ≈ #444380), 하늘 #ffc47c → #8a6f8a, 피치 안개는 50m 이후에만, 태양 원반 #ffcf9e + 블룸, 접촉 블롭 + 실제 카드 그림자.
- 알베도 (
paint.ts/build.ts): 음영 벽돌 / 크림 / 황토 / 테라코타 집, 주춧돌, 처마, 창틀, 후드, 문턱, 굴뚝 + 굴뚝 토시, 높이 7 / 8.4 / 9.8m; 따뜻한 회색/베이지색 돌 (채도 "스토리북"에서 -35%); 황토색 나무 데크 C* ~51-58 및 거의 검은색 이음새; 철은 어둡고 채도 낮음. 절대 레몬색이나 라벤더색으로 조명된 얼굴을 사용하지 마십시오. - 잉크 (
ink.ts): #030303, 5.1px 근거리(6m) → 3.3px 원거리(90m) (1080x1920 기준), 주름은 35°에서 ×0.8, 깊이 점프는 1%에서, 안개 틴트는 원거리에서만 0.3; 캐릭터 카드는NOINK레이어에 있음 (자체 자두색 잉크를 가짐). - 렌즈 (
lensblur.ts+story.ts의dofAt): 1080에서 cInf px: 갈고리/강 CU 15-16, 클로즈업 12-14, MS 10-12, 공원 7, golden sway 5, 와이드/에어리얼 0. 앞줄의 눈에 초점을 맞춥니다. - 포스트 (
Bridge.tsx): 잉크 → 렌즈 프리 → 렌즈 메인 → 블룸 (thr 1.0, int .5, 6레벨, radius .6) → NEUTRAL 톤 맵 → 그레이드; MSAA 4. 필름 그레인은 존재하지만 OFF입니다 (참조에서 그레인 없음; 파일 크기가 4배 증가함). - 캐릭터 (
toon.ts/cast.ts/cardshade.ts): 콩 머리 h/w .94, 자두색 잉크 #241726, 눈 간격 .26 W, 블러셔 없음, 14가지 표정; 성인 3.5 머리 높이; 걷기 바운스 5%, 기울기 1-7°, 보폭 0.8m; 깜박임 0.5-2.3초; 발 아래에 꼭 맞는 접촉 그림자 ~.5 + 낮에는 태양 방향 꼬리; golden은 내부 림만 있음(오프셋 외부 복사본 없음). - 카메라 (
story.ts): 큰 점프 시 컷, 18-40f의 smootherstep 글라이드, 모든 홀드는 미세 이동(정적 홀드 없음 ≥4f), 충격 시 7f 동안 감소하는 플립 킥, 4-4.6° 롤, 약 1/3 샷에 전경 소품(FOREGROUND).
룩 목표 (참조에서 측정; references/reports/ 참조)
- 잉크:
- 세계 선: 1080 너비에서 약 3px, 거의 검은색 #0b0a0c, 거리에 따라 거의 일정. 실루엣, 깊이 점프 및 법선 주름만. 벽/바닥 연결부나 수평선에 선이 없음. 캐릭터 카드는 세계 잉크로 윤곽선이 그려지지 않음.
- 캐릭터 잉크: 어두운 자두색 #201628-#2f1d28, 아래쪽/그림자 쪽이 더 두꺼움.
- 색상:
- 낮 중간 휘도 ~.57. 비잉크 p5 ~.23 (뭉개진 검은색 없음). 조명된 채도 C* p90 ~55. 낮 하늘 상단 ~#5e93d9, 수평선 1.28배 더 밝음.
- Golden: 복숭아색 수평선 #ffd08a, 바이올렛-블루 그림자(갈색 아님), 역광 태양.
- 깊이:
- DOF는 약 1/3 화면 시간(CU, MS, 삽입) 동안, cInf 10-16px (1080 기준), 눈에 초점. 설정 및 와이드 샷은 선명하게 유지.
- 안개 = 수평선 색상, 낮 25→420m, golden 20→360m.
- 블룸은 HDR 자체 발광에만: 임계값 1.0.
- 카메라:
- 큰 점프 시 하드 컷. 그 외 모든 것은 18-40f의 smootherstep 글라이드, 720p에서 피크 ≤ 25px/f.
- 모든 홀드는 0.15-0.35%/f로 푸시 인, 펀치 단어에서는 0.6%/f.
- 4-5° 롤.
- 핸드헬드 플로트 없음. 충격 셰이크는 매 프레임 부호를 반전하고 7f에 걸쳐 감소.
- 캐릭터:
- 약 3.5 머리 높이, 다리 1.4 HH.
- 막대기 사지 약 0.055 머리 너비, 잉크 점 손.
- 콩 머리 (h/w ~0.93, 더 좁은 턱, 더 뾰족한 정수리).
- 블러셔나 눈 하이라이트 없음. 얼굴 밝기 ~.93.
- 걷기 바운스 3-7%, 기울기 1-7°, 발 고정.
- 0.5-2.3초마다 깜박임, 4f 지속.
룩-매치 루프 (다리 룩에 도달한 방법; "X처럼 보이게" 패스에 재사용)
- 먼저 참조를 측정합니다. 주제별로 하나의 분석 에이전트 (모션, 깊이, 텍스처, 캐릭터, 조명, 윤곽선, 그레이드), 각각 숫자(형용사 아님)를
references/reports/<topic>.md에 작성합니다. 공유 브리프:compare/CONTEXT.md. 보고서는 이후 모든 에이전트의 진실 공급원입니다. - 샌드박스, 파일당 하나의 소유자. 프로젝트 폴더를
src/videos/<name>_{cam,world,mat,char,post}로 복사하고src/sandboxes/<n>/index.tsx항목을 만듭니다 (메인과 동일한index.tsx, 가져오기 경로만 변경). 다리에서 사용된 소유권:- cam: story.ts (카메라 키, 컷, 킥, DOF 테이블, 전경 소품)
- world: world.ts, lights.ts, shade.ts, grade.ts (태양, 하늘, 안개, 강, 색상, 그레이드)
- mat: paint.ts, build.ts (페인트 텍스처, 건물, 소품)
- char: toon.ts, cast.ts, cardshade.ts (캐릭터 드로잉, 포즈, 카드 조명, FX 카드)
- post: ink.ts, Bridge.tsx, lensblur.ts (윤곽선 패스, 컴포저, 렌즈 블러, 블룸)
에이전트는 자신의 샌드박스에서만 자신의 파일을 편집하고
BRIDGE_ENTRY=src/sandboxes/<n>/index.tsx node scripts/bridge-stills.mjs out/<name>/<n>/x_ <frames> 0.5로 스틸을 렌더링합니다.
- 병합
python scripts/bridge_merge.py [cam,world,mat,char,post]로 (메인을backup/bridge_<time>/에 백업하고 소유 파일만 복사). 그런 다음npx tsc --noEmit(프로젝트 폴더로 필터링), 다음 라운드 전에 모든 샌드박스를 메인에서 재동기화 (cp -f src/videos/<name>/* src/videos/<name>_<n>/). - 검증 새 Opus max 에이전트로: 나란히 시트 (
python scripts/sbs_sheet.py out.jpg --ours a b --ref r1 r2), 각 영역을 10점 만점으로 평가 (색상 day/golden, 조명, 잉크, 텍스처, 캐릭터, 깊이, 구성) 및 프레임 번호가 포함된 번호가 매겨진 수정 목록. 각 수정을 파일 소유자에게 매핑하고 SendMessage로 해당 소유자의 에이전트를 재개합니다 (컨텍스트 유지). 브리지 점수: 라운드 1 5/3/4/5/4/7/4/6 → 라운드 2 5/4/5/6/4/7/6/6 → 라운드 3은 노트 참조. - 소유자 간 계약은 내보낸 상수(예: ink.ts의
NOINK레이어, story.ts의dofAt/FOREGROUND, lights.ts의LIGHTS/LOOK)로 존재합니다. 계약 변경은 이를 읽는 모든 소유자에게 알리는 것을 의미합니다.
주의사항
- Kenney 네이처 키트 재질은 청록색입니다. build.ts에서 재질 이름으로 색상을 다시 지정합니다.
- 카메라가 집 안에서 끝납니다. build.ts/world.ts의 시선 차단 제거기가 카메라 광선을 차단하는 모든 것을 제거합니다.
- DOF와 동일한 병합 효과 패스의 잉크는 덮어쓰여집니다. 잉크는 블러 전에 자체 패스여야 합니다.
- 픽셀 크기의 포스트 매개변수는 해상도에 따라 조정되어야 합니다. 스틸은 0.5, 최종은 1.333입니다. R3F는 dpr을 ≥ 1로 고정하므로,
--scale 0.5스틸은 여전히 1080x1920 버퍼를 렌더링합니다. - 디스크: 모든 Remotion 번들은
public/(~1.3GB)를임시 폴더\remotion-webpack-bundle-*에 복사하고 절대 삭제하지 않습니다. 60GB 이상이 다리 패스 중 시스템 드라이브를 채웠고 ENOSPC로 렌더링이 중단되었습니다. 항상export TEMP='<큰 드라이브>/remotion-tmp' TMP='<큰 드라이브>/remotion-tmp'로 렌더링하고(bridge-stills.mjs는 자체 설정), 공유 임시 폴더에서 오래된 번들 폴더를 삭제하기 전에 사용자에게 물어보십시오(자동 모드는 스윕을 차단합니다). <큰 드라이브>/remotion-tmp도 채워집니다 (4번의 브리지 라운드 후 약 500개 폴더/110GB). 프로젝트가 완료되고 아무것도 렌더링하지 않을 때, 해당 폴더의remotion-webpack-bundle-*및puppeteer_dev_chrome_profile-*폴더를 삭제합니다. - JS 문자열에서는
"<큰 드라이브>/remotion-tmp"를 쓰고,"<큰 드라이브>\remotion-tmp"를 쓰지 마십시오 (\r이 캐리지 리턴이 됩니다). - Remotion은 무음 오디오 트랙을 작성합니다.
-map 0:v:0 -map 1:a:0으로 먹싱합니다. - 서브 에이전트는 이 하네스에서 보고서 파일을 쓸 수 없습니다. 150단어 이하의 최종 메시지를 요청하고 직접
out/<name>/<n>/REPORT.md에 저장하십시오. out/내부의 스크래치.ts파일은tsc를 손상시킵니다. 이름을.txt로 지정하십시오.- 2K 렌더는 약 4fps (67초에 약 10분)로 실행됩니다. 0.5 스틸은 약 40초 번들 후 각각 3-8초가 걸립니다.
- 2.5%의 필름 그레인은 2K 파일을 ~250MB 대신 910MB로 만들고 YouTube에서 뭉개집니다. 참조에는 없습니다. 끄십시오.
검증자가 발견한 가독성 함정 (모든 새 소품/샷을 이것들에 대해 확인)
- 아이 뒤로 사라지는 한 줄의 밧줄로 그려진 그네는 교수형으로 읽힙니다. 항상 아이 사이에 넓은 판자가 있는 두 줄의 밧줄(
swingKidin toon.ts)과 호가 다리를 비우는 프레임(각 끝에 A-프레임)이 있어야 합니다. - 렌즈에서 약 2m보다 가까운 소품이나 부유물은 프레임 가장자리에서 거대한 잘린 블롭이 됩니다. 카메라가 움직일 때, 새 위치 근처의 모든 소품을 다시 확인하십시오(강 카메라가 떠 있는 모자 안으로 이동함).
- 프레임 가장자리에 의해 잘린 전경 덤불은 "녹색 공"으로 읽힙니다. 전경 소품은 알아볼 수 있거나 없어야 합니다.
- 깃발: 빨간색 + 노란색 별/다이아몬드는 베트남의 것으로 읽힙니다. 시대에 맞는 깃발(1831년 영국의 경우 성 조지 십자)을 사용하십시오.
- 고통