Communitygithub.com

mromidev/cartoon-3d-short

약 55~70초 분량의 세로형 만화 스토리 단편을 "3D 세계 속 2D 캐릭터" 스타일(잉크 윤곽선이 있는 평면 콩머리 카드, 검은 잉크선으로 칠해진 3D 마을/세계, 채도 높은 하늘, 피사계 심도 배경, 부드러운 카메라, 음성 해설, 합성 SFX + 행진곡 스타일 음악)로 제작하며, three.js와 Remotion으로 렌더링합니다. "The Bridge That Fell for a Song"(2026-10-31)에서 검증되었습니다. 사용자가 "다리 영상처럼", "군인/다리 단편처럼", "그 만화 3D 스타일로" 역사/과학 스토리 단편을 요청하거나 "만화 단편 스킬을 사용해"라고 말할 때 사용하세요.

cartoon-3d-short란 무엇인가요?

이 스킬은 놀라운 역사적 또는 과학적 사건을 약 55~70초 분량의 세로형 만화 스토리 단편으로 변환하도록 설계되었습니다. "The Bridge That Fell for a Song"이라는 검증된 예시를 기반으로, 3D 세계에서 2D 캐릭터(콩머리, 잉크 윤곽선)가 등장하는 독특한 비주얼 스타일을 사용합니다. three.js로 장면을 렌더링하고 Remotion으로 최종 비디오를 조합합니다. 이 스킬은 주제 선정, 사실 조사, 대본 작성(갈고리, 설정, 행동, 결정적 순간, 설명, 결과, 반전을 포함한 비트 구조), 음성 녹음, 샷 계획, 3D 세계 구축(lights.ts, shade.ts, build.ts, paint.ts, world.ts), 캐릭터 디자인(toon.ts, cast.ts, cardshade.ts), 포스트 프로덕션(잉크, 렌즈 블러, 블룸, 그레이딩), 사운드 디자인(합성 SFX 및 음악), 최종 렌더링 및 품질 보증까지의 전체 파이프라인을 안내합니다. 이 스킬은 Claude Code, Cursor, Codex와 같은 AI 에이전트 플랫폼과 함께 사용하도록 설계되었으며, 사용자 지침(자막 없음, 영어 전용, 음성 톤 일정, 농담은 실제 사실 기반, 믹싱 레벨, 최종 내보내기 설정)을 포함하고 외부 참조 영상을 모방하지 말라는 주의사항을 강조합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add mromidev/claude-animated-shorts

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

만화 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가 모든 단계를 검증합니다.
  • 각 단계 후 저장합니다.
  • 대본이 승인되면 "그냥 실행"합니다.

파이프라인

  1. 주제 및 사실. 하나의 놀라운 실제 이야기를 선택하세요. 물리적 원인과 결과가 있어야 하고(시각적이어야 함), 이를 설명하는 간단한 일상 비유가 있어야 합니다.
    • 사실과 출처를 SCRIPT.md 상단에 작성합니다.
  2. 대본 (~3.7단어/초, 55-70초). 다리 단편의 비트 공식:
    • 갈고리: 터무니없는 사실을 한 줄로 요약합니다. ("일흔네 명의 군인이 그냥 걸어서 철교를 무너뜨렸다.")
    • 배경: 연도, 장소, 자부심.
    • 행동: 세네 번의 비트에 걸쳐 확대되며, 각 비트는 조금씩 더 커집니다.
    • 결정적 순간: 무너지는 순간.
    • 무표정한 이중 대사: "운 좋게도 ... / 불운하게도 ...".
    • 설명: 일상적인 비유(그네 타는 아이)를 통한 하나의 물리학 아이디어.
    • 결과: 이로 인해 만들어진 규칙.
    • 회상 반전: 결말.
    • 시청자가 이미 보고 있는 내용을 화면에 절대 설명하지 마십시오.
  3. 음성. voice.wav를 녹음하거나 생성한 다음, 단어 타이밍을 words.json으로 만듭니다(단어 시간을 포함한 음성-텍스트 도구 사용).
    • 프로젝트 폴더(예: ~/bridge-short/voice/)에 넣습니다.
    • 단어 타이밍을 수동으로 수정합니다. 모든 것은 words.json에 동기화됩니다.
  4. 샷 계획 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프레임 먼저 도착합니다.
  5. 세계.
    • lights.ts: LIGHTS와 조명별 LOOK 하늘/강/구름 팔레트.
    • shade.ts: 2-톤 쉐이딩 및 untone().
    • build.ts: 마을, 집 및 Kenney CC0 키트 소품, 색상 재지정, 카메라를 가리는 물체의 시선 차단 제거.
    • paint.ts: HD Canvas2D 페인트 텍스처, 이음새는 어두운 색조로 칠함.
    • world.ts: 하늘 셰이더, 안개 = 수평선 색상, 강, 프레임별 포즈, 샷별로 고정된 태양 및 카메라 상대 위치.
  6. 캐릭터.
    • toon.ts: Canvas2D Pen 드로잉 API, 600x1000 디자인 캔버스, y=975에 밑창, 콩 머리, 막대기 사지, 자두색 가변 너비 윤곽선, 얼굴 라이브러리.
    • cast.ts: 카메라를 향한 빌보드, 군중, 효과 카드, 깜박임, 걷기 사이클. 모든 빌보드는 NOINK 레이어로 이동합니다.
    • cardshade.ts: 장면 조명에 의해 조명되는 카드, 자체 발광 없음.
  7. 포스트 (Bridge.tsx + ink.ts + lensblur.ts + grade.ts).
    • 컴포저 순서: 잉크 → 렌즈 프리 → 렌즈 메인 → 블룸 → NEUTRAL 톤 맵 → 그레이드(MSAA 4).
    • 모든 픽셀 매개변수는 출력 높이 / 1920에 따라 조정됩니다.
  8. 사운드 (~/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.
    • 사운드를 만들기 전에 영상의 시간 상수를 고정합니다. 이후 타이밍 변경은 사운드를 다시 실행해야 합니다.
  9. 룩 체크. 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단어 이하의 판정.
  10. 최종 렌더링.
    • 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 감사를 실행합니다.
  11. 전달. 최종 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처럼 보이게" 패스에 재사용)

  1. 먼저 참조를 측정합니다. 주제별로 하나의 분석 에이전트 (모션, 깊이, 텍스처, 캐릭터, 조명, 윤곽선, 그레이드), 각각 숫자(형용사 아님)를 references/reports/<topic>.md에 작성합니다. 공유 브리프: compare/CONTEXT.md. 보고서는 이후 모든 에이전트의 진실 공급원입니다.
  2. 샌드박스, 파일당 하나의 소유자. 프로젝트 폴더를 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로 스틸을 렌더링합니다.
  3. 병합 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>/).
  4. 검증 새 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은 노트 참조.
  5. 소유자 간 계약은 내보낸 상수(예: 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에서 뭉개집니다. 참조에는 없습니다. 끄십시오.

검증자가 발견한 가독성 함정 (모든 새 소품/샷을 이것들에 대해 확인)

  • 아이 뒤로 사라지는 한 줄의 밧줄로 그려진 그네는 교수형으로 읽힙니다. 항상 아이 사이에 넓은 판자가 있는 두 줄의 밧줄(swingKid in toon.ts)과 호가 다리를 비우는 프레임(각 끝에 A-프레임)이 있어야 합니다.
  • 렌즈에서 약 2m보다 가까운 소품이나 부유물은 프레임 가장자리에서 거대한 잘린 블롭이 됩니다. 카메라가 움직일 때, 새 위치 근처의 모든 소품을 다시 확인하십시오(강 카메라가 떠 있는 모자 안으로 이동함).
  • 프레임 가장자리에 의해 잘린 전경 덤불은 "녹색 공"으로 읽힙니다. 전경 소품은 알아볼 수 있거나 없어야 합니다.
  • 깃발: 빨간색 + 노란색 별/다이아몬드는 베트남의 것으로 읽힙니다. 시대에 맞는 깃발(1831년 영국의 경우 성 조지 십자)을 사용하십시오.
  • 고통

관련 스킬