Communitygithub.com

syahdestiny/javascript-animation

ユーザーが「JavaScriptで毎フレーム描画するアニメーション」や「画像アセットなしのアニメーション」、「手描き風アニメーション動画」などを依頼したときに使用します。単一の自己完結型HTMLファイルを生成し、HTMLキャンバス上でフレームを計算し、MP4にレンダリングして結果を自己チェックします。

javascript-animation とは?

このスキルは、すべてのピクセルをコードで計算する短編アニメーション動画を制作するためのものです。外部画像やフォント、ライブラリを一切使用せず、単一のHTMLファイルにすべてを収め、ヘッドレスブラウザでフレームごとにキャプチャしてMP4に変換します。Claude Opus 5.5で構築・テストされており、描画品質はモデルに大きく依存します。ストーリーボード駆動のテンプレートから始め、純粋な時間関数として各フレームを計算し、シーンやカメラ、サウンドトラックが構造的に同期します。自己チェック機能(スチルシート、フルレンダリング、アセット監査、レイアウトチェック)を備えており、結果を確認・修正した上でMP4とHTMLを納品します。音楽が必要な場合は、soundtrackスキルと連携してWeb Audioでコード合成された音楽を生成します。主な使用ケースは、手描き風アニメーション、ゼロアセットアニメーション、コードで描く解説動画、短編アニメーション映画などです。データからのチャートアニメーションや3D/WebGLアニメーションには対応していません。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/syahdestiny/skill-motion-javascript/tree/HEAD/skills/javascript-animation

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

JavaScript アニメーション(全てのフレームをコードで描画)

すべてのピクセルを計算によって生成する短編アニメーション動画を作成します。画像もフォントもライブラリも不要です。1つのHTMLファイルに全体を収め、ヘッドレスブラウザでフレームごとにシークしながらMP4にレンダリングします。

モデル

Claude Opus 5.5 で構築・テスト済みです。描画品質はモデルに大きく依存します。以下の自己チェックでは画像入力が必要です。現在のモデルが画像を見られない場合は、その旨をユーザーに伝え、視覚確認は未実施として扱ってください。他のモデルは未テストです。結果が粗い場合は、より強力なモデルを使うと改善する可能性があることを伝え、それが最高の結果であるとは主張しないでください。

デフォルトの流れ:確認のために止まらない

そのまま実行してください。適切なデフォルト値を選択し、納品時に代替案を提案します。開始前にユーザーに確認するのは、主題がまったくない場合のみです(例:「アニメーションを作って」のみ)。

  1. 依頼内容を読み解く。 形式(ストーリー、解説、詩、ループ、インタラクティブページ)、長さ(デフォルト15〜20秒。その時間内に主題を語れない場合のみ長くする)、アスペクト比(デフォルト1920x1080)をユーザーの発言から推測します。画面上のテキストはユーザーが依頼を書いた言語で書きます。バイリンガルにするのは、ユーザーが明示的に要求した場合か、視聴者が明らかに複数言語を使用する場合のみです。references/forms.md に各形式の短い構造が記載されています。
  2. 主題と視聴者から見た目とサウンドを計画する。 自分の言葉で説明します。その映像が何か、どのように見え、どのように聞こえ、なぜその主題と視聴者に適しているかを記述します。記入すべきリストはありません。references/techniques.md に材料が記載されており、スターターの値はプレースホルダーであって、ハウススタイルではありません。デフォルトでは、以前の作品の見た目やサウンドを再利用しないでください。異なる主題は異なる見た目とサウンドになるべきです。ユーザーが他の作品を参照した場合(「あのバイラル動画のように」)、その技法だけを借用し、キャラクター、ストーリー、構図は借用しないでください。
  3. ビートグリッド、ストーリーボード、ブロッキングをデータとして作成する(references/storyboard.md)。まずテンポとセクションを決めます。次に、形式に合ったペースのショットリスト(references/storyboard.md のペース表。各ショットにフレーミング、カメラワーク、アクション、該当するビート、サウンド、トランジションを含む)を作成します。次にブロッキング(ストーリーや解説の場合、一貫した世界のトラック)を設定します。これらをページに BPM、SECTIONS、SHOTS、EVENTS として埋め込みます。シーン、カメラ、サウンドトラックはすべてこれらを読み取るため、映像と音声が構造的に同期します。ストーリーや解説の場合は、論理の整合性を確認します。すべてのビートが直前のビートによって引き起こされ、メタファーが映像に可視化されていることを確認します。
  4. templates/starter.html から構築する。 このテンプレートはすでにストーリーボード駆動です。ワールド座標で描画される1つの世界、ショットごとの withCamera、すべてのテキストと主要オブジェクトに対する claim() が含まれています。プレースホルダーのパレットとデモワールドを置き換えます。コントラクトを維持します。draw(frame) はフレーム番号の純粋関数です。Math.random や Date の代わりに rng(seed) / hash2() を使用します。
  5. 自己チェックを行い、レンダリングする(次のセクション)。クリーンになるまで修正と再チェックを繰り返します。
  6. 納品する。 MP4 と HTML(ブラウザでライブ再生可能。クリックでサウンドが再生される)を納品します。その後、1〜2行で変更可能なオプションを提示します。別のルック、合成音楽ではなくAI音楽、異なる長さなど。

音楽には soundtrack スキルを使用します(デフォルト:Web Audio でページ内に合成。キーは不要)。

自己チェック(エージェントが実行。ユーザーは見ない)

node scripts/render.mjs piece.html sheet.jpg --sheet 1        # カット点を除いて毎秒1フレーム
node scripts/render.mjs piece.html shot --stills 90,300,610   # 特定の瞬間
node scripts/render.mjs piece.html piece.mp4                  # フルレンダリング(+サウンドトラック、ページにあれば)
node scripts/asset-audit.mjs piece.html                       # ゼロアセット証明:読み込みまたは埋め込みがあれば exit 1
node scripts/layout-check.mjs piece.html                      # テキスト同士の衝突、またはクレームされたオブジェクトとの重なりをチェック
node ../soundtrack/scripts/sync-check.mjs piece.mp4 --cues-file piece.cues.json   # ビート上のカット、驚きなし

その後、references/qc.md に従って目視で2回のパスを実施します。

  1. ストーリーボード適合性:各ショットのアクションビートでの静止画を、その行と照合して確認します(アクターはブロッキングで指定された位置にいるか、指定されたアクションを実行しているか?)。
  2. ディレクターパス:毎秒2フレームのコンタクトシート(--sheet .5)を、形式に対するペース、フレーミングの多様性、デッドフレーム、すべてのアクションにサウンドが付いているか、ルックが視聴者に合っているかで評価します。少なくとも2ラウンド実施します。変更したフレームは、毎回フルフィルムをレンダリングし直すのではなく、そのフレームの静止画をレンダリングします。

条件付きトリガー

状況対応
キャラクターが複数のシーンに登場するシーンに入る前に、キャラクター単体(表情+ポーズ)をレンダリングし、references/character.md に従って自分で確認する。キャラクターはアンカーポイント(口、手)を公開し、プロップがそれらにアタッチできるようにする。
ユーザーが実在の人物、ペット、場所の写真を提供したreferences/character.md の抽出方法を使って写真からキャラクターを構築する。写真はローカルに留める。決してアップロードしたり、公開物に含めたりしない。
実在人物作品であり、ユーザーがその場にいる納品時(それ以前ではない)に、主要なプロップや人物の写真を使って作品をより個人的なものにするオプションを提案する。
移動するキャラクターにテキストや吹き出しが追従するplaceFree(w, h, [above, right, left, below]) で配置し、既にクレームされているものから避ける。
画面上のテキストがラテン文字以外(中国語、日本語など)CJKフォントスタックを使用する。すべてのグリフが正しくレンダリングされることを確認する(等幅フォントは欠落グリフを静かに置き換える。例:≈ が = になる)。
ページがWebページとして公開されるHTMLを納品する。ライブプレビューループとクリック再生のオーディオを維持する。

よくある失敗を防ぐルール

  • 時間の純粋関数。 requestAnimationFrame の状態、CSSアニメーション、物理演算の累積は禁止。各フレームを t だけから計算しないと、レンダリング結果とプレビューが一致しません。
  • 手描きの線は「沸騰」し、ジッターしない。 フィルムが LOOK.wobble を設定する場合、うねりのシードは4フレームごとに変更します(LOOK.boil: 4)。毎フレーム変更するとノイズとして認識されます。毎秒約7.5回の変化は手描きとして認識されます。
  • 体は丸みのある形状で構成する。 楕円や角丸長方形からフィギュアを構築します。頂点の少ない生のポリゴンは記号(五角形の手、箱型の胴体)として読まれます。
  • ポーズが読み取れる角度を選ぶ。 横から見た長い胴体と短い手足は毛虫のように見えます。同じポーズを正面から見ると(短縮遠近法)、うつ伏せの赤ちゃんのように見えます。
  • 後ろから前に向かって明示的に描く。 後ろ髪→体→首→顔→前髪。ほとんどの「何かが顔を隠している」バグは描画順序が原因です。
  • カットとアクションのポイントを正確に合わせる。 すべてのカットとすべての目に見えるアクションは EVENTS/CUES に含まれ、サウンドトラックはそれらに合わせて配置されます(soundtrack を参照)。
  • テキストは決して衝突しない。 すべてのテキストボックスと主要オブジェクトをクレームします。layout-check は CLEAN を出力する必要があります。キャプションがモニターの端や顔に重なっていると粗雑に見え、コンタクトシートで目視しても見逃しがちです。

ファイル

  • templates/starter.html:描画ライブラリ(インク、イラスト、フラット/ブループリントプリミティブ、ラベル、ペーパー、フィルターレイヤー)、withCamera、claim/placeFree、およびストーリーボード駆動の2ショットスケルトン。
  • scripts/render.mjs:MP4 / スチル / コンタクトシート。window.CUES と window.SCORE はオプション。フルレンダリング時には <出力>.cues.json を書き出し、SCOREサウンドトラックを多重化します(SCOREがない場合は無音のMP4)。キャンバスサイズは偶数である必要があります。
  • scripts/asset-audit.mjs:読み込まれたり埋め込まれたりするものがないか、静的スキャン+ライブネットワークチェックを実行。
  • scripts/layout-check.mjs:フィルム全体の window.LAYOUT を読み取り、テキストの衝突とその時刻をリストアップ。
  • references/storyboard.md:ビートグリッド、ショットリスト、ブロッキング、連続性、ストーリーの論理。
  • references/techniques.md:テスト済みの描画技法(インク、スポットカラープリント、単線彫刻、言葉を形に、マーカーフィル、イラスト形状)。
  • references/forms.md:形式ごとの構造メモ。
  • references/character.md:キャラクターがいる場合のみ使用。
  • references/qc.md:自己チェックリスト。

要件:Node 18以降、ffmpeg、Chrome(または npx playwright install chromium)、およびスクリプトを実行するフォルダ(スキルフォルダではなく、あなたのプロジェクト)に npm i playwright-core がインストールされていること。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

関連スキル