mcpField
Z
zach-d-films

zach-d-films

github.com/artemnovitckiiクリエイティブ・メディア59658 回インストール1 週間前に更新
リポジトリ

zach-d-films について

zach-d-filmsは、スタイル化されたプロシージャル3D短編を制作するClaude Codeスキルです。再利用可能なショットエンジンと制作手順により、台本とナレーションから動画を作成できます。

主な機能

  1. 01プロシージャルな3Dシーンと人物
  2. 02再利用可能な小道具とアニメーション補助
  3. 03字幕とショットのタイミング設定
  4. 04静止画プレビューと動画レンダリング

活用シーン

  1. 01誤解を解説する短編動画の制作
  2. 02スローモーションとエフェクトによる衝撃描写
  3. 03台本とナレーションから縦型短編を作成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/artemnovitckii/claude-animation-skills --skill zach-d-films

インストール後、Claude Code で/zach-d-filmsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

engine/
captions.py
index.html
render.mjs
engine/src/
anim.js
human.js
main.js
materials.js
props.js
shots.js
textures.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.jsmakeHuman(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.jspistol、gunArm、bullet(平たくなるモーフ付き)、sword、shield、mace、arrow、bow、stand、glowSprite、sparks、streak、rippleOverlay(赤い衝撃波の波紋)。
src/anim.jskf キーフレーム、イージング、range、cam(fov)、place(camera, pos, look)、shake、ikArm(手で物をつかめるようにする 2 ボーンの腕 IK)。
src/textures.js、src/materials.jsCanvas で作成した鋼の傷、鎖かたびらのリング、木、布、肌のテクスチャと、それらを使ったマテリアル。
src/main.jsレンダラー、空、ライティング、被写界深度、ブルーム、カラーグレーディング、window.renderAt(t)。

手順

  1. 台本。 ユーザーの台本を使うか、「もしあなたが…」というフック、「こう考える人もいます…」、「しかし」というひねり、展開していく例、仕組み、フックへの答えとなる結論の形式で作成します。30秒で約2.5語/秒(70〜90語)を目安にします。事実関係を確認してください。
  2. プロジェクト。 エンジンを新しいフォルダーにコピーし(<project> がまだ存在しないこと)、共有パッケージにリンクします。
    cp -R "$SKILL_DIR/engine" <project> && ln -s "$KIT/node_modules" <project>/node_modules
    
    台本を文のリストとして <project>/script.json に書き込みます。
  3. 音声。 最適なのはユーザー自身の録音です。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 はこのファイルを再生します)。
  4. 字幕。 "$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秒で暗くなります)。使わない場合は [] にします。
  5. ショット。 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)やフレームの端から離してください。
  6. 静止画。 プロジェクトから node render.mjs stills 1.5,6.8,14 stills を実行します。全体をレンダリングする前に、すべてのショットを確認してください。
  7. レンダリング。 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
    
  8. 受け渡し。 mp4のパスを伝えます。

ライブプレビューを表示するには、プロジェクトを配信し(python3 -m http.server 8000)、index.html を開きます(クリックすると audio.m4a で再生されます)。または、1フレームだけ表示するには index.html?t=14.5 を開きます。

スタイル

  • 明るい青のスタジオ風の空、柔らかな昼光、金属らしく見える金属。漫画風の人物は大きく表情豊かな顔をしたシンプルな形にし、プロップとの大きさのバランスを保ちます。
  • 衝突時はスローモーションにし、短いカメラシェイク、火花、熱いものにはブルームを加えます。赤い波紋で力が広がる様子を表します。
  • 字幕の区切りで素早くカットし、「しかし」の転換部分で一度だけ暗転します。字幕は白の太字で、1〜3語にします。

コメント