zach-d-films について
zach-d-filmsは、スタイル化されたプロシージャル3D短編を制作するClaude Codeスキルです。再利用可能なショットエンジンと制作手順により、台本とナレーションから動画を作成できます。
主な機能
- 01プロシージャルな3Dシーンと人物
- 02再利用可能な小道具とアニメーション補助
- 03字幕とショットのタイミング設定
- 04静止画プレビューと動画レンダリング
活用シーン
- 01誤解を解説する短編動画の制作
- 02スローモーションとエフェクトによる衝撃描写
- 03台本とナレーションから縦型短編を作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ artemnovitckii/ claude-animation-skills --skill zach-d-filmsインストール後、Claude Code で/zach-d-filmsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
engine/captions.pyindex.htmlrender.mjsengine/src/anim.jshuman.jsmain.jsmaterials.jsprops.jsshots.jstextures.js詳細
/zach-d-films
┌──────────────────────┐
│ blue sky │ procedural 3D people and props, soft shadows
│ ◕‿◕ ⛨ │ depth of field, bloom, light grain
│ /▓▓▓\ ⟶ • │ slow-motion impacts, sparks, a red force ripple
│ ▓▓ │
│ arrows │ 1-3 word captions, white bold, lower third
└──────────────────────┘
完成済みの作例も含まれています。engine/ は、29.5 秒の短編「古代の鎧で銃弾を止められるか?」です(9 ショット:銃の発砲、ベストに当たってスローモーションで平たくなる銃弾、鎖かたびらに当たる剣、赤い波紋が広がるプレートアーマーに当たるメイス、射手、矢と叫び声、2 つの的を貫通する銃弾)。ナレーションは含まれていないため、音声を用意してください。Zack D. Films とは無関係です。「このスタイル」とは、形式を指します。問いかけ、誤解、「しかし」という展開、例を積み重ね、最後に見せ場を用意します。
初めて使う場合
このスキルのフォルダーは、Claude Code の読み込み時に表示される「Base directory」です。
SKILL_DIR="<base directory of this skill>"
KIT=$(python3 -c 'import os,sys;print(os.path.realpath(os.path.join(sys.argv[1],"..","..","kit")))' "$SKILL_DIR")
[ -d "$KIT/node_modules/playwright" ] || bash "$KIT/setup.sh"
[ -x "$KIT/.venv/bin/python" ] && [ -d "$KIT/models" ] || bash "$KIT/setup.sh" --voice # word timings + free voice, ~1 GB once
PY="$KIT/.venv/bin/python"
ffmpeg、Node、Python 3.9 以降が必要です。ヘッドレス Chrome の WebGL でレンダリングします。Mac では 1 フレームあたり約 0.2~0.5 秒かかり、短編のレンダリングには数分かかります。使用可能な GPU がないマシンでは、GL=swiftshader を設定してください(大幅に遅くなります)。
エンジン
| ファイル | 内容 |
|---|---|
src/shots.js | 編集内容です。 CAPTIONS([start, text, end?])、FADES(黒へのフェード)、DURATION、ショットごとの関数、SHOTS リスト({start, end, build})が含まれます。ショットの build({makeStage}) は {scene, camera, update(t)} を返します。update にはショット内の時刻が渡され、{dof, bloom, exposure} を返すことがあります。 |
src/human.js | makeHuman(outfit):ポーズを付けられる漫画風の人物('vest'、'chainmail'、'plate'、'knight'、'archer')。setPose({joint: [x, y, z]}) で pelvis spine chest neck head lSh lEl lWr rSh rEl rWr lHip lKn lAn rHip rKn rAn(および drop)を指定し、setMouth(0..1)、lerpPose(a, b, t)、standArmor(kind) を使用します。 |
src/props.js | pistol、gunArm、bullet(平たくなるモーフ付き)、sword、shield、mace、arrow、bow、stand、glowSprite、sparks、streak、rippleOverlay(赤い衝撃波の波紋)。 |
src/anim.js | kf キーフレーム、イージング、range、cam(fov)、place(camera, pos, look)、shake、ikArm(手で物をつかめるようにする 2 ボーンの腕 IK)。 |
src/textures.js、src/materials.js | Canvas で作成した鋼の傷、鎖かたびらのリング、木、布、肌のテクスチャと、それらを使ったマテリアル。 |
src/main.js | レンダラー、空、ライティング、被写界深度、ブルーム、カラーグレーディング、window.renderAt(t)。 |
手順
- 台本。 ユーザーの台本を使うか、「もしあなたが…」というフック、「こう考える人もいます…」、「しかし」というひねり、展開していく例、仕組み、フックへの答えとなる結論の形式で作成します。30秒で約2.5語/秒(70〜90語)を目安にします。事実関係を確認してください。
- プロジェクト。 エンジンを新しいフォルダーにコピーし(
<project>がまだ存在しないこと)、共有パッケージにリンクします。
台本を文のリストとしてcp -R "$SKILL_DIR/engine" <project> && ln -s "$KIT/node_modules" <project>/node_modules<project>/script.jsonに書き込みます。 - 音声。 最適なのはユーザー自身の録音です。
ffmpeg -i <take> -ac 1 -ar 44100 <project>/audio/vo.wavで変換します。それがない場合は、プロジェクトから無料の Kokoro 音声を使います。"$PY" "$SKILL_DIR/../stick-figure/engine/tools/tts_kokoro.py" [voice] [speed](デフォルトはam_michael 1.12、ほかにaf_heart、am_adam、bm_george)を実行すると、audio/vo_kokoro.wavが書き出されます。これをaudio/vo.wavにコピーします。ブラウザーでプレビューする場合に限り、audio.m4aとしても保存します(main.jsはこのファイルを再生します)。 - 字幕。
"$PY" "$KIT/words.py" audio/vo.wav script.jsonを実行すると、audio/vo.words.json(ナレーションのファイル名に.words.jsonを付けたもの)が書き出されます。次にpython3 captions.py audio/vo.words.jsonを実行すると、CAPTIONSとDURATIONが表示されるので、src/shots.js内の値を置き換えます。「しかし」のカット付近にFADESを設定します(例では6.2秒で暗くなります)。使わない場合は[]にします。 - ショット。 2〜4秒ごとにショットを計画します(30秒なら8〜10個、10秒なら3個)。字幕の区切りでカットし、仕組みを見せるショットを最も長くします。最も近い例をコピーして、プロップ、ポーズ、カメラを変更し、開始時刻と終了時刻を指定して
SHOTSに列挙します(使わない例の関数は削除してください)。update(t)はtのみに依存させます。レンダリングがショットの途中から始まる場合があります。例のショット7はフレーム間で状態を保持するため、回避策が必要です。このパターンはコピーしないでください。shots.jsで使えるヘルパー:standPose、STAND、handsOnHips、surfaceHit(飛翔体がメッシュに当たる位置)。props.jsではbox、shadowが使えます。rippleOverlayを配置するには、その下にメッシュが必要です。複数のパーツでできたターゲットには、影を無効にした透明な円盤を付けてください。- 新しいプロップは
props.jsに小さな関数として追加し、THREE.Groupを返すようにします。sparksは光る点なので、破片やほこりには専用のメッシュが必要です。 - 9:16ではフレームの幅が狭くなります(fov 34で約19°)。飛翔体をフレーム内に収めるには、その後ろからカメラで追います。
- 顔や重要なプロップは、字幕領域(yは1280のうち約950〜1030)やフレームの端から離してください。
- 静止画。 プロジェクトから
node render.mjs stills 1.5,6.8,14 stillsを実行します。全体をレンダリングする前に、すべてのショットを確認してください。 - レンダリング。
node render.mjs video silent.mp4 30を実行します(1フレームあたり約0.2〜0.5秒)。次に音声を追加し、音量を調整して1080x1920に拡大します。ffmpeg -i silent.mp4 -i audio/vo.wav -map 0:v -map 1:a -vf scale=1080:1920:flags=lanczos -c:v libx264 -crf 17 -pix_fmt yuv420p -af "apad,loudnorm=I=-14:TP=-1.5" -c:a aac -b:a 192k -shortest <name>.mp4 - 受け渡し。 mp4のパスを伝えます。
ライブプレビューを表示するには、プロジェクトを配信し(python3 -m http.server 8000)、index.html を開きます(クリックすると audio.m4a で再生されます)。または、1フレームだけ表示するには index.html?t=14.5 を開きます。
スタイル
- 明るい青のスタジオ風の空、柔らかな昼光、金属らしく見える金属。漫画風の人物は大きく表情豊かな顔をしたシンプルな形にし、プロップとの大きさのバランスを保ちます。
- 衝突時はスローモーションにし、短いカメラシェイク、火花、熱いものにはブルームを加えます。赤い波紋で力が広がる様子を表します。
- 字幕の区切りで素早くカットし、「しかし」の転換部分で一度だけ暗転します。字幕は白の太字で、1〜3語にします。