카툰 인 3D 애니메이션 스토리 숏 (three.js + Remotion)
제작 결과물: 1080x1920, 30fps, 45-65초 길이의 숏. 참조 영상 스타일로 전달되는 독창적인 실화: 과거 시제의 터무니없는 훅, 조롱하는 회의론자, "있잖아," 그리고 한 줄의 반전. 잉크 윤곽선이 있는 채색된 3D 세계 안에 서 있는 평평한 카툰 카드, 시원한 그늘에 대비되는 따뜻한 조명, 렌즈 블러, 절대 끊기지 않는 카메라. 빠른 내레이터(~3.7단어/초), 한 단어씩 표시되는 자막, 오리지널 배경 음악 및 합성 SFX, -14 LUFS로 마스터링.
예시: 가짜 쇼핑객들 (1937, Sylvan Goldman이 새 쇼핑 카트를 밀도록 배우들을 고용한 이야기). 해당 파일은 project/src/videos/fake-shoppers/ 및 project/stories/fake-shoppers/에 있습니다.
기본 규칙 (항상 적용)
- 스토리, 캐릭터, 음성 및 음악은 저작권이 없는 자체 제작물입니다. 외관과 공식을 위해 참조 영상을 사용하되, 대본, 캐릭터 또는 장면을 절대 복사하지 마세요. 동영상, 제목 또는 설명에 채널 이름을 절대 언급하지 마세요. 참조 영상은 비공개 학습 자료이며 절대 업로드하거나 공유하지 않습니다.
- 사실은 조사 및 출처가 명시되어야 하며, 스토리의
SCRIPT.md상단에 기록됩니다. 농담은 과장법이나 실제 사실에 기반해야 하며, 지어낸 역사를 사실로 제시해서는 안 됩니다. - 무료 로컬 도구만 사용합니다. edge-tts나 사용자의 목소리를 사용하고 유료 생성기는 사용하지 않습니다. 어떤 커넥터에 크레딧을 사용하기 전에 항상 물어보세요.
- 음성에 공백(일시정지)을 넣지 마세요 (공백을 0.07초로 줄이고, 문장 끝은 0.2초). 자막은 켜짐(참조 스타일). 동영상은 마지막 단어 후 0.5초 이내에 종료되며, 아웃트로나 CTA(행동 유도)가 없음.
- 주제를 선택하기 전에
references/TOPICS_DONE.md를 확인하세요. - 두 번의 승인 게이트, 그 후에는 "그냥 실행" (원래 스킬에서 유지):
- 대본: 대본(출처 포함)을 보여주고 음성 및 숏 계획 전에 사용자의 승인을 기다립니다. 이후 게이트 2까지 묻지 않고 작업을 진행합니다.
- 리뷰 보드: 전체 렌더링 전에 사용자가 리뷰 보드에서 절반 크기 초안을 시청하고, 특정 순간이나 장면에 메모를 고정한 후 "Looks good"을 누릅니다(8단계). 그때까지 라운드를 반복하며, 그 전에는 전체 렌더링을 하지 않습니다.
- 사용자의 취향 및 학습된 체크 항목 (과거 리뷰 보드에서 얻은). 대본(2단계), 숏 계획(4단계), 세트(5단계), 캐스트(6단계)를 작성하기 전에 두 PREFERENCES 파일을 모두 읽으세요. 8단계에서 두 CHECKS 파일을 가독성 함정과 함께 검토하세요:
- 모든 비디오 스킬에 공유됨:
~/video-editor/review-board/PREFERENCES.md,~/video-editor/review-board/CHECKS.md; - 이 스타일에만 해당:
references/PREFERENCES.md,references/CHECKS.md.
- 모든 비디오 스킬에 공유됨:
- 기존 스토리 재개: 먼저
node ~/video-editor/review-board/cli.mjs show stories/<name>/review를 실행하세요. 세션이 실행되지 않는 동안 사용자가 보낸 메모는 다른 모든 것보다 먼저 처리됩니다(8.5단계). - 전체 렌더링은 한 번만. 백그라운드에서 시작하고, 사용자에게 예상 시간(~4fps, 1080p 기준; 2K에서 60초 숏의 경우 ~10분)을 알려주고 폴링하지 마세요. 작업이 끝나면 알림을 받습니다.
--scale 0.5프리뷰는 무료로 반복 가능.
이 Mac (2026-11-07 설정 및 테스트 완료)
- 작업 프로젝트:
~/video-editor/toon3d-shorts/,setup.sh로 생성됨.src/engine(일반),src/videos/<name>/(동영상별 폴더),stories/<name>/(대본, 음성, 큐, 악보),audio/(신스 키트 + 믹서),tools/measure.py,scripts/및public/을 포함합니다. 새 복사본은 이 스킬의project/에 있습니다.bash ~/.claude/skills/toon3d-story-shorts/setup.sh <dir>로 어디서든 다시 생성할 수 있으며, npm install(고정 버전)과pip install --user scipy를 실행합니다. - Node 24 + Remotion 4.0.539: GPU는 ANGLE/Metal을 통해 사용. 스틸 이미지는 ~20초 번들 후 각각 ~1.3초 소요;
--scale 0.5에서 전체 60초 프리뷰는 ~45초에 렌더링됩니다. - Python 3.9: numpy, PIL, scipy. ffmpeg-full.
~/video-editor/models/ggml-large-v3-turbo-q5_0.bin모델과 함께 whisper-cli 사용. edge-tts (python3 -m edge_tts). - 참조 연구 (직접 구축해야 하며 포함되지 않음):
~/video-editor/reference-study/, 사용자가 연구한 참조 숏으로 생성됨 (직접~/Downloads/reference-shorts/에 다운로드; 학습 자료이며 절대 공유하지 마세요). 저자는 19개의 숏을 측정했습니다.references/의 숫자는 이 연구에서 나온 것입니다:STYLE_BIBLE.md및SCRIPTS_ANNOTATED.mdmeasure/(프레임별 통계, 대본, 2초/60프레임 접촉 시트, 1fps 프레임, summary.json) – 이는tools/measure.py ours ... --refs의 기준선입니다.frames/및sheets/(나란히 비교에 사용되는 1fps/2초 뷰)
TMPDIR/REMOTION_TMP를~/video-editor/remotion-tmp로 설정(stills.mjs에서 수행). Remotion 번들이 여기에 쌓입니다. 사용자가 동의할 때만 오래된remotion-webpack-bundle-*폴더를 삭제하세요.
파이프라인
-
아이디어 → 주제 → 사실. 사용자가 주제가 없거나 아이디어를 요청할 때, 아이디어 라운드를 실행합니다 (
references/VIRAL_IDEAS.md에 데이터, 출처, 평가 기준 및 사실 규칙이 있음):-
지금 유행하는 것 (몇 번의 YouTube 연구 호출; 커넥터가 크레딧을 청구하면 먼저 물어보세요):
- 참조 채널의 가장 인기 있는 숏:
youtube_channel_shortswith channel_id<REFERENCE_CHANNEL_ID>(사용자가 연구하는 채널) 및 sort_bypopular. 새 제목을TOPICS_DONE.md에 추가합니다. - 틈새 돌파:
faceless_outliers_videoswith a semanticqueryper winning kind (예: "기이한 역사적 발명, 트릭 또는 법 뒤에 숨은 숨은 이유를 반전 결말과 함께 밝히는 애니메이션 숏"), videoTypeshorts, languages["english"], minOutlierScore 3. 틈새에 맞지 않는 히트(게임, 가젯)는 무시합니다. 제목 패턴을 기록하고 사용된 스토리를TOPICS_DONE.md에 추가합니다.
- 참조 채널의 가장 인기 있는 숏:
-
후보: 소스 목록에서 WebSearch/WebFetch를 통해 ~30개의 실화를 수집합니다. 각각을 승리 유형(오래된 물건이나 관행 뒤에 숨은 이유, 외국 시스템 또는 허점, 뇌 심리학, 돈 트릭 또는 사기, 우화 또는 역설)에 매핑합니다.
-
점수 10가지 평가 기준(20점 만점)으로 각 후보를 평가합니다. 상위 10개에 대해
youtube_search(typeshorts)로 새로움을 확인합니다: 지난 12개월 동안 이미 조회수 100만 이상인 스토리는 버리거나, 새로운 각도를 찾습니다. -
5-8개의 아이디어 제시 항목 포함: 승리 패턴의 작업 제목, 한 줄 훅, 대상, 메커니즘 + 비유, 점수 분석, 입소성 가능 이유(해당 유형의 참조 수치), 2-3개의 출처. 모두
references/IDEAS_BANK.md에 저장합니다. 사용자가 하나를 선택합니다. -
선택된 주제 조사:
- 모든 숫자, 날짜, 이름 및 주장에 대해 ≥2개의 독립적인 신뢰할 수 있는 출처;
- 전설은 전설로 표시; 극화된 조롱은 그렇게 표시;
- 사실 블록(주장 → 링크 → 신뢰도)을
stories/<name>/SCRIPT.md상단에 배치.
큰 주제의 경우, 딥 리서치 스킬이 이 단계를 수행할 수 있습니다.
좋은 주제는 하나의 중심 대상을 가진 놀라운 실화와 시청자가 상상할 수 있는 숨은 메커니즘, 그리고 이를 설명하는 일상적인 비유(국그릇, 테이블에서 미끄러지는 전화기, 엘리베이터 버튼)로 구성됩니다.
-
-
대본 (160-240 단어, 45-65초). 측정된 채널 공식 (
references/STYLE_BIBLE.md§2,SCRIPTS_ANNOTATED.md):- 훅 (~5초 이내, 9-20 단어): 과거 시제의 터무니없는 행동을 사실로 제시 ("그는 자신의 식료품점에서 쇼핑하는 척 하도록 낯선 사람들을 고용했다."). 대안: 역설적 주장 ("X는 불법이지만, 그럼에도...") 또는 조건부 약속 ("만약 당신이...한다면"). 절대 질문 형태가 아님.
- 설정: 현재 시제 1-2줄, 구체적인 숫자와 연도를 포함.
- 회의론자: 누군가 웃거나 조롱하며, 캐릭터에 맞는 인용된 조롱을 사용. 동영상당 1-2개의 조롱 사용.
- 시청자 질문: "잠깐, ...?" / "하지만 어떻게?" (동영상당 약 1개).
- 고조: 시간 건너뛰기와 반복 ("매주", "7월까지..."), 그리고 10-15초마다 과장법 농담 ("X해서 Y할 정도로", 축소 비교).
- 전환: "그러던 어느 날 밤/아침...".
- 반전: 런타임의 ~65-87% 지점에서 "있잖아," 로 시작하여 실제 메커니즘을 1-3개의 간단한 문장으로 제시, 이상적으로는 일상적인 비유를 통해. (훅 직후의 "있잖아," 는 맥락 전환으로도 효과적임.)
- 반전 결말: 모든 것을 재구성하는 짧은 선언적 문장 (회의론자가 틀렸다는 증명). 이 부분에서 바로 컷. 보너스: 마지막 줄이 첫 번째 줄로 자연스럽게 이어져 완벽한 루프를 만들도록 작성.
- 스타일: 과거 시제 훅, 이후 현재 시제; 축약형 사용; 문장당 ~14 단어; 접속사는 "그래서 / 하지만 / 그때", 결코 "그리고서"는 사용하지 않음. 2인칭 ("당신이...한다고 상상해보세요")도 유효한 방식.
- 시청자가 이미 볼 수 있는 것은 절대 내레이션하지 마세요 (원래 스킬에서 유지). 목소리는 그림이 보여줄 수 없는 것(원인, 숫자, 농담, 이해관계)을 추가합니다. 그림은 행동을 보여줍니다.
- 제목: 대상 중심의 호기심 유발, 4-8 단어, 승리 패턴 사용 ("[대상] [터무니없는 결과]", "왜 [그룹]이 [이상한 행동]을 했을까", "어떻게 [작은 것]이 [큰 일]을 했는가", "[대상]이 정말 의미했던 것", "[역설을 행한] [사람]"). 대본과 함께 3개의 옵션을 제시합니다.
- 훅 테스트: 첫 문장을 소리 내어 읽어보세요. 약 3초 안에 전달되어야 하고 터무니없거나 불가능하게 들려야 합니다. 맥락이 필요하면 다시 작성하세요.
- 게이트 1 제출: 대본, 3개의 제목 옵션, 출처가 포함된 사실 블록.
-
음성 (
stories/<name>/voice/에 저장):- 생성:
python3 -m edge_tts --voice en-US-AndrewNeural --rate=+14% --text "$(cat ../script.txt)" --write-media raw.mp3또는 사용자 녹음 사용. - 다듬기:
python3 scripts/tighten_voice.py raw.mp3 voice.wav --sentence-gap 0.12– 공백을 0.07초로, 문장 끝은 0.12초로 줄이고 (참조 동영상은 동영상당 0.25초 이상의 일시정지가 약 1개), 48kHz 모노로 출력. - 단어 타이밍: 16kHz 복사본에 대해 whisper-cli
-l en -ml 1 -sow -oj실행 후words.json([{w, a, b}]초 단위)으로 변환. whisper의 철자가 아닌 대본의 철자를 사용합니다.words_authored.json에도 복사: 숏 계획이 작성된 타임라인입니다. (story.ts는 이 쌍에서RETIME을 빌드합니다. 동일한 파일 = 변경 없음.) - 사용자 직접 녹음: 단어를 대본과 비교하고 속도(단어/초, 0.25초 이상의 일시정지)를 측정합니다. 이미 빡빡한 녹음은 다듬기가 거의 도움이 되지 않습니다. 아래 목표보다 느린 경우 피치를 유지하는
--tempo 1.1버전을 만들고 사용자가 선택 전에 둘 다 들어보도록 합니다. - 숏 계획 후 음성 교체 (동일한 단어, 새 녹음; 2026-11-08 Fake Shoppers에서 수행): 수동으로 재타이밍하지 마세요.
- 이전 타이밍을
words_authored.json으로 유지하고 새 타이밍을words.json에 넣습니다 (대본 철자, 동일한 단어 수). 다른 단어는 새로운 숏 계획을 의미합니다. RETIME = makeRetime(authored, spoken, FPS)(engine/retime.ts) – 모든 출력 프레임을 작성된 타임라인에 매핑하며, 새 음성을 단어별로 ±2 단어 평활화하여 따릅니다 (중간값 시작 오류 ~1프레임). index.tsx는total: RETIME.total, retime: RETIME을 사용합니다. cast.ts의 립싱크는 계속words_authored.json을 가져옵니다.- 스틸 이미지에서 몇 개의 키워드 프레임을 확인한 후,
--changed아래에 모든 장면을 나열하여 새 초안을 리뷰 보드에 게시합니다. - 사운드는 수동 재배치 없이 함께 이동합니다:
node scripts/retime_cues.mjs <name>–cues_authored.json을 한 번 유지하고cues.json을 출력 시간(이벤트,dur인수, 배경 음악, whoosh 효과) 및timemap.json과 함께 작성합니다.python3 score.py music.wav <RETIME.total> timemap.json: 악센트는 그림을 따르고, 비트 그리드는 섹션별로 따릅니다. 맵이 없으면 악보는 변경되지 않습니다 (샘플 대 샘플 확인됨).python3 audio/mix.py stories/<name>/cues.json public/<name>/mix.wav실행 후, 믹스에 whisper를 실행하여 모든 단어가 들리는지 확인합니다.
- 이전 타이밍을
- 목표: 3.6-3.9 단어/초, 훅은 6초 이내에 종료. TOTAL = ceil(마지막 단어 종료 × 30) + 6 프레임.
- 숏 계획 전에 다듬고, 이후에는 절대 다듬지 마세요. 모든 숏 프레임은 다듬어진
words.json을 기반으로 구축되므로, 나중에 다시 다듬으면 전체 동영상을 재타이밍해야 합니다. (예시에서는 이를 건너뛰고 참조의 ~1개에 비해 0.25초 이상의 일시정지를 10개 유지했습니다.)
- 생성:
-
숏 계획 (
src/videos/<name>/story.ts, 예시 복사):SHOTS:{id, a, b, light, set}(프레임 단위). 약 ~2.2초 (약 8 단어)마다 새로운 시각. 액션은 키워드 시작 0-3프레임 전에 도달합니다.TRANSITIONS: 숏이 들어오는 방식:dissolve(4-8프레임) 장소 또는 시간 변경 시iris(12-16프레임,cx/cy) 현창, 들여다보는 구멍, 렌즈 또는 시계를 통해dust(20-26프레임) 연기나 구름이 프레임을 가득 채울 때flash(4프레임) 훅 직후에만 전환이 없는 동일한 세트의 숏은 경계를 중심으로 하는 연결된 카메라 글라이드 (makeCamAt;chain= 18프레임, 또는 이동 거리에 따라 들어오는 숏별 레코드 크기 조정)로 자동 결합되어, 이동 중간에 스테이징 교체가 이루어집니다. 절대 하드 컷 하지 마세요. ~1100픽셀 이상 이동하거나 90° 이상 회전하는 연결된 경계는 대신 dissolve를 사용합니다.
CAMS: 숏별 키{f, dur?, dissolve?, s: f => dolly(pos, look, pushK(f, f0, rate, punch?), {fov, roll})}. 카메라 규칙 (references/studies/camera.md, 30fps에서 12개 숏 기준):- 프레임 예산: 15-20% 정지, ~45% 크립, ~33% 글라이드 (540 너비에서 3-30px/프레임), ≤3% 빠름.
- 약 ~1.4초마다 새로운 프레이밍. 대부분은 작은 재프레이밍: 키를
withReframes(CAMS, ENDS)로 감싸면 모든 긴 홀드는 42프레임마다 피사체 거리의 ±5%로 14프레임 옆으로 패닝되며 해당 키의 자체 푸시를 유지합니다. 의도적인 정지 홀드는hold: true로 표시합니다. 분당 약 4개의 빠른 움직임: 최고 35-55px/프레임 (최대 70), 20-34프레임. - 10초당 약 7개의 움직임을 만들며, 대부분은 작고 느린 움직임입니다 (최고 ~10px/프레임, 80-150px 이동). 긴 홀드 내의 작은 옆으로 재프레이밍을 위해
withNudges(CAMS, [[shot, baseKeyF, at, dur, ±0.05-0.07], ...])를 사용하고 (해당 키의 푸시를 유지함),withReframes가 나머지를 채웁니다. 이 재키잉 후의 예시 카메라는 모든 클래스에서 참조 범위 내로 측정됩니다 (정지 19.5 / 크립 49.9 / 글라이드 27.1 / 빠름 3.5 %, 10초당 7.4 움직임; studies/camera.md). - 스틸 이미지에서 모든 너지의 방향을 확인하세요. 대상 방향으로 이동.
SETS:{id, file, layers?}. id는 story.ts 전체에서 일치하고, file은public/<name>/sets/<id>.glb입니다. 각 세트에는 0-4개의 카툰 카드가 있으며, 각 카드에는 액션에 할당된actions와 표정용emotes가 있습니다. 두 가지 표정 상태만 사용 (기본, 깜빡임, 웃음, 찡그림, 놀람, 슬픔). 립싱크는 한 템플릿 단어 위치 ({a, b})로 단순화됩니다. 캐릭터 카드는 세트 로드 시 스테이징에 배치되며shell소품으로 서로를 가릴 수 있습니다.
-
세트 (
public/<name>/sets/): Blender 3.6+에서 각 세트를.glb로 내보냅니다. 각 세트에는 장면 그래프가 있어야 합니다:rig(null,${id}_card*유지),cameras(null,shot_*유지, 각 숏에 대해{location, rotation, fov}및 세트를 비추는light_*),lights(null). 카툰 카드 리그:node scripts/create_char_rig.py <glb> <name>– 뼈대 및 모양 키를 추가하고, 매핑 규칙(참조 스터디 카드)과 일치하는지 확인하고, 올바른 카메라를 향하도록 회전을 설정한 후 다시 내보냅니다. 풀만 지면에 닿음 예외: 피벗(스케이트보드, 자전거)과의 접촉도 기준 스터디와 일치해야 합니다.- 카드 비율: 참조 카드는 참조 스터디에서 측정된 특정 최대 폭과 높이를 가지므로 대상 장면과 일치하도록 스케일을 조정합니다. 스테이징에서 레이어링: 오른쪽 위에 왼쪽.
- 카드 액션: 각 카드에 대해 스토리보드가 애니메이션을 정의합니다. Blender에서
armature를scripts/update_char_rig.py를 사용하여 새 포즈로 설정하고, .glb를 다시 내보냅니다. 숏 계획을actions: [ { frame, card, action, duration?, ease? } ]로 구축합니다. - 필요한 경우 Blender 자동화:
blender -b <set> -P scripts/setup_card.py -- [...args]– 자동으로 수행하는 경우 설명과 함께 수행합니다.
-
캐스팅 및 각색 (
src/videos/<name>/setup/): 캐릭터, 카드 변형(다른 각도, 스킨), 추가 소품(표지판, 음식, 장난감)을 생성합니다. 캐스팅은 대본과 카드 가용성의 균형을 유지합니다. 목표: 동영상당 3-5개의 고유 캐릭터, 각 캐릭터는 1-2개의 장면에만 등장. -
음악 및 SFX (
stories/<name>/score/):python3 scripts/generate_score.py --style cartoon --duration <TOTAL>– 참조 수치(음악: -18 LUFS, SFX: -12 LUFS, 대화: -14 LUFS, 마스터 합계: -14 LUFS)와 일치하도록 조정합니다. -
리뷰 보드 (
~/video-editor/review-board/):node scripts/review_post.mjs <name>– 초안을 게시하고 사용자가 핀 메모를 추가할 때까지 기다립니다. "좋아 보입니다" 가 표시될 때까지 라운드를 반복하며, 각 라운드 후에 문제를 해결합니다. 문제 해결: 메모는 기술적(렌더링 결함, 잘못된 정렬, 누락된 액션) 및 창의적(캐릭터가 어색함, 느린 속도, 너무 많은 텍스트)일 수 있습니다. -
최종 렌더링:
node scripts/render_final.mjs <name>– 1080x1920, 30fps, .mp4(H.264, 프리셋 slower, 비트레이트 16M)로 렌더링합니다. 배경에서 작업을 시작하고 완료 시 사용자에게 알립니다.
예시: Fake Shoppers (1937)
project/src/videos/fake-shoppers/ 및 project/stories/fake-shoppers/에 있는 전체 워크플로를 확인하세요:
- 대본 (
SCRIPT.md), 측정된 타이밍 (words.json), 숏 계획 (story.ts), 세트(public/sets/), 캐스트(setup/), 믹스(mix.wav). - 최종 렌더링:
public/fake-shoppers/final.mp4.
모든 동영상에 사용되는 측정 도구
tools/measure.py ours <dir> --refs: 프레임 통계(정지 대 움직임, 카메라 속도 분포), 속도, 단어 수, 일시정지 길이를 측정하여 참조 수치와 비교합니다.python3 tools/measure.py ours project/src/videos/fake-shoppers/ --refs ~/video-editor/reference-study/measure/summary.json.
감사 정보
이 스킬은 mromidev/claude-animated-shorts (MIT 라이선스)의 감사 및 수정을 기반으로 하며, 이전 버전과의 호환성을 유지합니다. 감사에서 발견된 모든 격차가 수정되었습니다:
- 카메라 움직임이 참조 움직임과 일치하도록
withReframes및withNudges추가. - 새 음성에 대한 재타이밍 지원 (
makeRetime,retime_cues.mjs). - 카드 리그 생성(
create_char_rig.py) 및 업데이트(update_char_rig.py) 스크립트. - Blender 자동화(
setup_card.py). - 측정 및 비교를 위한
tools/measure.py. - 리뷰 보드 워크플로 (
review_post.mjs).
문제 해결
- 렌더링 오류:
node scripts/check_bundle.mjs로 번들을 확인합니다. 문제가 지속되면npx remotion bundle을 다시 실행합니다. - 카메라가 예상과 다름:
withReframes가 올바르게 구성되었는지 확인합니다. 키프레임 간격이 너무 좁으면 카메라가 흔들릴 수 있습니다. - 카드가 나타나지 않음: 세트가 올바르게 내보내졌는지(
.glb유효), 캐릭터 카드가 올바른 레이어에 할당되었는지 확인합니다. - 음성 동기화 문제:
words.json및words_authored.json이 동일한 단어 수와 시퀀스를 가지고 있는지 확인합니다.retime_cues.mjs가 올바르게 실행되었는지 확인합니다. - 성능:
public/세트의 복잡성을 줄이거나--scale 0.5를 사용하여 프리뷰 속도를 높입니다.
부록: 참조 수치
(참조 스터디에서 측정됨, references/ 디렉토리 참조)
- 평균 길이: 55.3초 (45-65초)
- 평균 속도: 3.7 단어/초
- 문장당 평균 단어: 14.1
- 평균 훅 길이: 5.2초 (3.8-6.5초)
- 평균 일시정지(>0.25초): 1.2개/동영상
- 평균 카메라 속도 분포: 정지 17.1%, 크립 48.3%, 글라이드 31.2%, 빠름 3.4%
이 스킬은 사용자가 "저 카툰 3D 스타일의 숏" 또는 "가짜 쇼핑객/식료품 카트 비디오 같은" 스타일을 요청하거나 역사/과학 이야기 숏을 만들고 싶어할 때 가장 잘 작동합니다. 주제 아이디어 생성, 사실 조사 및 대본 작성, 참조 숏과의 측정/비교에도 사용할 수 있습니다.
MIT 라이선스에 따라 mromidev/claude-animated-shorts에서 파생되었습니다.