GPT 手描きアニメーションスキル (Codex 向け)
動作するアニメーションプロジェクトと、要求された MP4 またはループを作成します。フレームは時間の決定論的関数であり、p5.brush で Chrome 内に描画され、FFmpeg でエンコードされます。Claude ランタイム、有料 API、画像生成モデルは必要ありません。Clawd はオプションの組み込みキャラクターです。ユーザーの選んだキャストとスタイルに従ってください。
プロジェクトの開始
ロードされた SKILL.md の場所からこのスキルのディレクトリを特定します。Claude のディレクトリをハードコードしないでください。以下を実行します:
python "<skill-dir>/scripts/new_project.py" "<project-dir>"
クロスプラットフォームの初期化ツールは template/ をコピーし、デモを切り離し、npm ci でロックされた依存関係をインストールし、ツールを報告します。デモまたはエンジンチェックの場合のみ --keep-demo を、スキャフォールディングのみの場合は --skip-install を、Node はあるが npm が PATH にない場合は --npm-cli /path/to/npm-cli.js を使用します。NPM_CLI_JS は同等の環境変数による上書きです。空でないプロジェクトは上書きしません。
デザインを始める前に、生成された ANIMATION_GUIDE.md をすべて読んでください。利用可能な画像ビューア(例: 実行ツールの view_image)で docs/emotions.jpg と docs/views.jpg を確認してください。ガイドにはエンジンとキャラクター API が含まれています。ミュージックビデオまたは約 20 秒より長い動画の場合は references/music-video.md を読んでください。ランタイムの問題、プラットフォームコマンド、レンダラーの制限については references/codex-runtime.md を読んでください。
計画と構築
ユーザーの既存の選択を使用します。作業に実質的に影響する不足情報のみを尋ね、回答済みの質問を繰り返さないでください。MV の場合は、オーディオとタイミングソースを収集します。リリックビデオには、提供された歌詞と LRC または同等のタイムスタンプが必要です。不足している歌詞を作成しないでください。インストゥルメンタル MV には LRC は必要ありません。クリエイティブの方向性が欠けている場合、1 つのオプションの質問で、ストーリー、ムード、繰り返し現れるイメージ、避けるべき点をカバーできます。ユーザーが方向性を委任した場合は、首尾一貫した解釈を提案して進めてください。
音楽を計測するには: python "<skill-dir>/scripts/beat_grid.py" song.mp3 --from=0 --to=30 --lrc=song.lrc(NumPy と FFmpeg が必要)。テンポは半拍/倍拍の曖昧さがある推定値として扱います。提供されたオーディオとタイムスタンプがタイミングを定義します。LRC は通常、行単位でタイミングを取るため、カラオケの文字単位の塗りつぶしは、ワードレベルのタイミングが提供されない限り近似値です。強制アライメントを主張しないでください。
STORYBOARD.md を作成します: ログライン、世界とパレットの弧、ビジュアルモチーフ、感情の弧、および時間範囲、アクション、視聴者の読み取り、トランジションを含むショット。必要に応じて方向性をレビューのために共有します。ユーザーが続行を依頼した場合は、そのまま進めてください。完全な実例は examples/xiaozhen/STORYBOARD.md にあり、そのシーンファイルも同じ場所にあります。
src/config.js に duration、bpm、offset、およびオプションの audio を設定します。シーンを src/scenes/ 内の IIFE として実装し、shots([[t0, fn], ...]) で登録し、それらのスクリプトを studio.html に含めます。まず読み取り可能なポーズをブロックします。ショット全体で共通のキャスト、パレット、および繰り返し現れるモチーフを使用します。
レンダリングと確認
プロジェクトディレクトリから、必要に応じて選択したフレーム、短いモーションストリップ、詳細をレンダリングします:
node render.mjs --sheet=0.1,0.8,1.6,2.4 --cols=4 --w=480 --out=out/check/poses.jpg
node render.mjs --strip=2.1:2.6 --out=out/check/motion.jpg
node render.mjs --sheet=2.3 --crop=760,420,500,400 --w=500 --out=out/check/face.jpg
生成された画像を開きます。各ショットのイベントと読み取り時間、顔、プロップの接触、キャラクターサイズ、トランジション、パレットを確認します。主要なアクションと継ぎ目の周りのモーションを検査します。観察された問題を修正し、その後影響を受けるフレームを再度検査します。コンタクトシートはポーズと連続性を検証します。重要なモーションタイミングについては、短いエンコード済みプレビューを検査します。ソースコードのみから視覚的なレビューを行ったと主張しないでください。
測定された ms/フレームとフレーム数を使用して最終コストを見積もります。このデスクトップ環境はローカルです。動画作成のリクエストは通常、ローカルレンダリングを許可します。明示的なローカル/クラウドの選択を尊重します。必須の場所承認ゲートを追加したり、許可なく有料/クラウドサービスを使用したりしないでください。作業が実際にリモートで、レンダリング場所が重要な場合は、フルレンダリングの前に明確にしてください。ユーザーがソースまたはローカルコマンドのみを要求した場合は、実行可能なプロジェクトとプレビューを保持します。
node render.mjs --clip --out=out/video.mp4
node render.mjs --frames --workers=4
node render.mjs --encode --audio=assets/song.mp3 --out=out/video.mp4
フレームレンダリングとエンコードで同じ --fps を使用します。フレームファイルは再開可能ですが、変更された時間範囲のキャッシュされたフレームは再レンダリング前に削除する必要があります。--encode は 0 からフレームを消費します。後半から始まる部分的な範囲には、独自の FFmpeg 開始番号と一致するオーディオトリムが必要です(ランタイムリファレンスを参照)。
ffprobe でエンコードされた duration、解像度、fps、オーディオを検証し、結果を検査します。動画とプロジェクトのパス、測定されたパフォーマンス、および実際の制限を返します。node_modules、フレームキャッシュ、および一時ファイルはポータブルソースアーカイブから除外します。
ビジュアルとエンジンの不変条件
paint()とinkLine()で描画します。加算光にはglow()を使用します。フラットな 2D 描画のキービュー、ソフトなパレット、沸騰するインク。これらはスタイルのデフォルトです。明示的なユーザー要件が優先されます。- 不要なテキストは避けます。リリックカラオケと要求されたレタリングはサポートされています。
timeline.jsの後にsrc/karaoke.jsをロードし、LYを埋め、アクションをその下部バンドより上に保ちます。実際のフォントと中国語のグリフを確認します。 - すべてのショットには、イベント、原因とそれに続く反応、および読み取れる保持された意味が必要です。
emotions()で顔をアニメーション化し、feel()でアイドル状態をアニメーション化します。トランジションをストーリーに合わせ、適切な場合はエンディングをオープニングに接続します。 - すべてのフレームは
tの純粋関数です。蓄積シミュレーション、シードされていないMath.random()、またはレンダリング順序への依存はありません。安定したバリエーションにはhash()を使用し、独立した要素ごとにboilSeed(key)を使用します。 - p5 のグローバル名前空間の衝突を避けるために、ヘルパーをシーン IIFE 内に保持します。退化したジオメトリと NaN をガードします。前景フレームでドア/窓の内容をマスクします。クローズアップではアウトラインの太さを減らします。
- パフォーマンスはブラシの塗りつぶしとストロークに依存します。スケールアップする前に、代表的なフレームをいくつか測定します。GPU メモリが不足している場合は、過剰なジオメトリとワーカー数を減らします。
--soft-glはデフォルトの最適化ではなく、低速なフォールバックです。 - ユーザーが明示的にエージェントを要求しない限り、チャプターを順次実装します。並列レンダリングワーカーはレンダラーの機能であり、サブエージェントを必要としません。
ソースとライセンス: references/upstream.md。エンジンまたはスキルを再配布する場合は、バンドルされた両方の MIT 通知を保持します。