Communitygithub.com

BlockReel

マインクラフト風のアニメ動画をアイデアから生成します。シネマティックショート、YouTubeチャンネルオープニング、会話エピソードなど、コードでレンダリングし、オリジナルのゲームルック&サウンド(テクスチャと効果音はローカルキャッシュ)をデフォルトで使用。ユーザーがスキンを送ればそれを使用し、オリジナル楽曲とオフラインのキャラクターボイスも生成できます。

BlockReel とは?

BlockReelは、マインクラフト風ブロックアニメーション動画を、コードベースでフルパイプライン生成するスキルです。Three.jsシーンとJSONストーリーボードを駆使し、1フレームずつMP4にレンダリングします。事前準備(ブリーフィング、リサーチ、ショットリスト作成)から、スキン・テクスチャの作成、ストーリーボードの記述、テスト静止画・プレビューの確認、サウンド(効果音、オリジナル楽曲、音声)の生成、最終レンダリング、品質レビューまでを網羅。ユーザーが送ったスキンはそのまま使い、オリジナルテクスチャはMojangのファイルをローカルキャッシュから利用(リポジトリにコミットしない)。Claude Code、Cursor、CodexなどのAIエージェント環境で動作し、Node.js、Python、ffmpeg、Chrome/Chromiumが必要。ユーザーのアイデアから、ゲームの見た目と音を忠実に再現した短編アニメーションを、一切の動画生成AIを使わずに制作できます。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ViniciusNoetzold/mine-blockreel-skill-/tree/HEAD/plugin/skills/blockreel

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

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

ドキュメント

BlockReel は何をしますか?

あなたは短いブロックアニメーションをコードとして演出・構築し、フレームごとにMP4にレンダリングします。 動画モデルは使用しません。すべてのフレームはJSONストーリーボードによって駆動されるThree.jsシーンから生成されます。

流れはA→Eです。ブリーフとショットリスト(A~C)を作成する前に、ストーリーボード(D)に飛ばないでください。 品質は準備と自身のフレーム確認(E)によって生まれます。JSONの量ではありません。

0. ブートストラップ(初回使用)

export BLOCKREEL_HOME="${BLOCKREEL_HOME:-$HOME/blockreel}"
[ -d "$BLOCKREEL_HOME" ] || git clone https://github.com/ViniciusNoetzold/mine-blockreel-skill- "$BLOCKREEL_HOME"
cd "$BLOCKREEL_HOME" && npm install && pip install -r requirements.txt
python tools/vanilla.py fetch    # オリジナルゲームテクスチャ + mob/chest/steve/alexテクスチャ -> work/vanilla/ (ローカルキャッシュ、約45KB)
python tools/vanilla.py sounds   # オリジナルゲーム効果音 -> work/vanilla/sounds/ (ローカルキャッシュ、約1MB、音楽なし)

デフォルトでゲームのように見えます。 ユーザーが自身のテクスチャを指定しない限り、フィルムはキャッシュからのオリジナルテクスチャを使用します(エンジンが自動的に読み込みます。"textures": "builtin" とするとCC0のオリジナルに切り替わります)。Mob: /work/vanilla/entity/zombie.png、creeper.png、pig.png、spider.png。デフォルトスキン steve.png / alex.png。これらのファイルはMojangのものです。ユーザーのマシンの work/ に留まり、決してコミットも配布もされません(docs/LEGAL.md 参照)。 必要な環境: Node 20+、Python 3.11+、ffmpeg、Chrome/Chromium(CHROME_PATH を設定するか、python -m playwright install chromium を実行)。作業は $BLOCKREEL_HOME/films/<name>/ またはユーザーが開始したフォルダ内で行います。core/ 内には決して書き込まないでください。

1. ガイド(該当するステップに到達したら読むこと)

ファイルこれについて読む
docs/PREPRODUCTION.mdステップA~C: ブリーフィング、リサーチルール、brief.md/research.md/shotlist.mdのテンプレート
DIRECTOR.mdストーリー、リズム、カメラ、演技、アクションシーケンス
TECHNIQUE.mdパイプライン、単位、パフォーマンス、エンジンの拡張
docs/STORYBOARD.md正確な story.json スキーマ(フィールドの唯一の信頼できる情報源)
docs/QA.mdステップE: チェックリストと tools/qa.py
styles/<style>/STYLE.md選択したスタイルのルック
docs/SKINS.md、docs/BLOCK-ATLAS.md、docs/RESOURCE-PACKS.md、docs/MOBS.mdアセット作業
docs/COVERAGE.mdエンジンが現時点でアニメーション可能なもの、不可能なもの: シーンを約束する前に確認すること

ジャンル(スタイルと同様に、最初に1つ選ぶ)

オープニングの場合: python tools/opening.py "<CHANNEL>" --out films/<name> から開始(名前がブロックで表示、ブラスト、オービット、ロゴホールド、ゲームサウンド、オリジナル楽曲)。その後、生成された story.json(ブロック、スキン、タイミング、追加ショット)を調整します。

docs/GENRES.md を読んでください: opening(YouTubeチャンネルイントロ、5~12秒)、cinematic short(壮大またはドラマチックな20~60秒の映像、例: examples/ および「Farol Negro」制作)、series episode(会話するキャラクター、コメディまたはアドベンチャー、1~5分、大規模Minecraftアニメーションチャンネルの形式)。各ジャンルはペース、カメラ文法、サウンド、提供物を固定します。前提はユーザーが望む任意のものにできます。

A. ブリーフィング(最大1つの短い質問をする)

リクエストから以下を抽出: 前提(1文)、トーン(コメディ、ホラー、壮大、心温まる…)、長さ(デフォルト30~60秒)、キャラクター(どのスキンか)、設定、スタイル(DIRECTOR.md §8 参照)。不足しているものがあり、適切なデフォルトが存在する場合はそれを選択し、どのデフォルトを選択したかを伝えてください。回答がフィルム全体を変える場合にのみ質問してください(例: 「これらのキャラクターのスキンはありますか?」)。結果を films/<name>/brief.md に保存します(テンプレートは docs/PREPRODUCTION.md)。

B. リサーチ(Web、リンク付きで記録)

WebSearch / WebFetch を使用。すべてを films/<name>/research.md に書き、各主張にはリンクを付けます:

  1. トーンに合わせたアニメーション言語: ペース、カメラ、コメディのタイミング/ホラーの恐怖/壮大なスケール。
  2. 剛体キャラクターアニメーション: 予備動作、オーバーシュート、フォロースルー、代用のつぶれ、インパクトフレーム。
  3. 設定の参考: 選択した設定に対応するブロック建築、カラーパレット、ランドマーク。
  4. フリー音源/効果音源: ソース、トラック名、そのライセンス をリストアップ。ユーザーの許可なく音声をダウンロードまたは追加しないでください。ユーザーが story.json に含めるファイルを提供します。

次に「適用する原則」セクションを追加: 5~10の箇条書きを自分の言葉で、それぞれをこのフィルムのショットまたはルールに関連付けてください。決して他作品のシーン、キャラクター、台詞をコピーせず、原則を抽出してください。参考動画のローカルコピーは work/(gitignore対象)にのみ保存。リポジトリにはあなたの書いた結論のみを置きます。

C. 脚本とショットリスト

DIRECTOR.md §7 のテーブルを使用して films/<name>/shotlist.md を記述(意図 列を追加: ショットが視聴者に何を感じさせ、または知らせるか)。ブリーフィングと照合: 1つのアイデア、明確なビート(設定→盛り上げ→転換→解決)、エネルギー曲線(静→騒→静)、トーンに応じたショット長、すべての台詞は短く。

D. 構築

  1. アセット。
    • ユーザーがスキンを送ってきた場合→そのスキンを そのまま変更せずにフィルムで使用(フィルムフォルダにコピーし、story.json で参照)。最初に python core/skin.py validate skin.png を実行。レガシー64x32の場合は convert して新しいファイルに。あなたが作成するスキンは validate に合格する必要があります(64x64 RGBA PNG、ベースレイヤーが完全に不透明、slim/classicを自動検出)。これにより実際のゲーム(Javaスキンページ/ランチャー)にもアップロードできます。
    • スクリーンショット/拡大縮小画像としてスキンが与えられた場合 → python core/skin.py snap in.png out.png --crop x0,y0,x1,y1、その後 validate。行が欠けている場合はその旨を伝え、完全な画像を要求してください。
    • スキンがキャラクターのレンダリングされた3D画像の場合 → テクスチャに変換できません。その旨を伝えてください。
    • スキンを作成または改善する場合 → blockreel-skins スキンを実行(/blockreel:blockreel-skins): リサーチ、パレット計画、レイヤー描画、python tools/turntable.py skin.png --out tt.png、少なくとも2回のチェックラウンド。ブロック/アイテムテクスチャまたはリソースパック → blockreel-textures(core/tilecheck.py、tools/pack_preview.py、core/pack.py)。結果をフィルム内で使用(story.json のスキンパス/blocksフォルダ)。
    • Mob: docs/MOBS.md(ユーザーのテクスチャが必要。クリーパー型、ブタ型、クモ型のリグと、プレイヤーリグを介したゾンビ)。
    • スキンがない場合 → python core/skin.py make ... または core/builtin/skins/ のオリジナルを使用。
    • ブロック/アイテムのシート → python core/atlas.py slice|label|faces(docs/BLOCK-ATLAS.md 参照)。識別できるもののみラベル付け。
  2. ストーリーボード。 レターボックスバーとビネット(暗い隅)はスタイルから来ます(letterbox、vignette)。2.37:1配信の場合は、最後にバーをクロップ(ffmpeg -vf crop=iw:iw/2.37)してプレイヤーが黒帯を表示しないようにし、ユーザーが望まない場合はビネットをオフにします(styleOverride.vignette: false)。 ショットリストから story.json を記述(docs/STORYBOARD.md)。最も近い examples/*/story.json から始めてください。 カメラオフセットはワールド空間: 見たい顔の前にカメラを置きます。
  3. テスト静止画。 python tools/render.py story.json --frame <t> --out check.png を実行し、画像を見てください(まずフレーミング、次にライト、次に演技)。
  4. プレビュー。 python tools/render.py story.json --out preview.mp4 --fps 12 --scale 0.5。
  5. サウンド(必須)。 audio ブロックが指すすべてのファイルを構築: work/vanilla/sounds/ からのオリジナルゲーム効果音(爆発、ドア、チェスト、Mob、ヒット、足音、雨、雷、火)、効果音がない場合のみ自作音(ウィッシュ、ライザー: ゲームの音楽には他の権利者がいます)、エネルギー曲線に従ったオリジナル楽曲(python tools/score.py --out music.wav --duration 30 --sections calm:0:7,build:7:15,battle:15:23,silence:23:26,dawn:26:30)、および音声: まずユーザーの録音。なければ tools/voice.py(オフラインのみ: python tools/voice.py fetch で取得したPiperニューラル音声、例: --voice piper:faber、またはWindows OneCore音声 daniel/maria とSSMLによるポーズと強調)。キャラクタープリセット(hero、villain、monster、child、narrator、radio)。各台詞をそのショット内に収める: 測定し、--rate またはショット長を調整。docs/GENRES.md の films/ スタイル make_audio.py を参照。 python tools/audio.py story.json --out mix.wav、聴いてから、音声付きでレンダリング(またはミックスを無音レンダリングに多重化)。
  6. 最終レンダリング。 python tools/render.py story.json --out film.mp4。ソフトウェアGLは960x540で約1秒/フレーム: 長いフィルムにはどれくらい時間がかかるかユーザーに伝えてください。

E. 品質レビュー(納品前に必須)

python tools/qa.py films/<name>/story.json --out films/<name>/qa

これにより、少なくとも8枚の分散フレーム(オープニング、各ショットチェンジ、クローズアップ、エンディング)がレンダリングされ、コンタクトシートが作成され、自動チェック(カメラがブロック内、俳優がフレーム外、顔がカメラから離れている、字幕が切れている、ショットがトーンに対して制限時間を超えている)が実行されます。次に各フレーム画像を開いて見て、スクリプトでは判断できないものを評価: スキンの穴、奇妙な影、不自然なポーズ、不明瞭なストーリー、ペース。修正、再レンダリング、クリーンになるまで繰り返します。 結果を films/<name>/qa.md に記録(テンプレートは docs/QA.md): 何をチェックしたか、何が見つかったか、何を修正したか、何を確認できなかったか。その後初めて film.mp4 とプロジェクトフォルダを納品します。

ルール

  • ゲームアセット(テクスチャ、サウンド、フォント)をリポジトリやフィルムフォルダにコピーしないでください。ただし、ユーザーが提供し、所有権を持つ場合は除きます。それ以外の場合はオリジナルの組み込みアセットを使用します。docs/LEGAL.md を参照。
  • 実行していない機能が動作すると主張しないでください。レンダリングまたはアセットステップが失敗した場合は、何が失敗したかを伝えてください。
  • エンジンの実際の機能(docs/STORYBOARD.md にリスト)を使用してください。シーンに docs/COVERAGE.md で欠落とマークされたもの(保持ツール、階段とフェンス、さらに多くのMob、スニーク/スイム/ライドクリップ…)が必要な場合は、事前にそれを伝え、存在する最も近いものを提案してください。サポートされていないJSONフィールドで偽装しないでください(それらは黙って無視されます)。
  • クローズアップでは比率を確認してください。ワイドショットだけでなく(肩が胴体に接している、頭が直接体の上にある、顔が読める)。
  • ユーザーのスキン/テクスチャはそのままにし、派生ファイルは新しい名前で隣に書き出します。
  • films/ と work/ の下はすべてgitignoreされています。リポジトリに同梱されるサンプルは examples/ にあります。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

関連スキル