漫画3Dストーリーショート(three.js + Remotion)
実証済み例: 歌に落ちた橋。1831年のブロートン橋と、74人の兵士が歩調を合わせて行進したことにまつわる、オリジナルの67秒のショート動画です。
- コード: Remotionプロジェクトの
src/videos/bridge/(コンポジションBridgeShort、1080x1920、30 fps)。 - スクリプト、音声、サウンド:
~/bridge-short/。 - スタイル調査:
references/。
スタイルリファレンスは非公開で調査されたチャンネルです(references/: STYLE_BIBLE.md、reports/*.md、frames/)。
- これらの動画は非公開の学習用資料です。アップロード、公開、送信は絶対に行わないでください。
- スクリプト、キャラクター、ショットをコピーしないでください。ストーリー、キャラクター、音声は常に独自のものです。
- ナレーションや説明文でチャンネル名を決して言わないでください。
適用されるユーザールール:
- キャプション: ショート動画ではデフォルトでオン。一度に1単語、中央揃え、太字、暗い輪郭、安全領域内、
words.jsonにタイミングを合わせます(「字幕」を参照)。ユーザーがそう言った場合にのみオフにします。他の画面上のラベルはありません。 - 英語のみ。
- 音声: 一定のトーン(無表情: ナレーターは決して反応せず、キャラクターが反応します)。
- ジョークは調査された実際の事実に基づきます。
- 標準ミックス: 音楽 +3 dB、SFX -6 dB、音声はそのまま。
- 最終出力は2K縦型:1440x2560、
--scale 1.3333。 - Opus maxがすべてのチェックを検証します。
- 各ステップの後に保存します。
- スクリプトが承認されたら「とにかく実行」します。
パイプライン
- トピックと事実. 物理的な原因と結果(視覚的にわかりやすいもの)があり、それを説明する簡単な日常的なアナロジーが存在する、驚くべき実話を1つ選びます。
- 事実とその出典を
SCRIPT.mdの先頭に記述します。
- 事実とその出典を
- スクリプト(約3.7語/秒、35-70秒)。事実ベースのショートには以下の「バイラルストーリーフォーマット」と「面白くする」を使用します。ブリッジビートフォーマットは災害ストーリーの代替手段です:
- フック: 不条理な事実を一文で(「74人の兵士が橋を渡っただけで鉄橋を倒した」)。
- 設定: 年、場所、誇り。
- 行動: 3つか4つのビートにわたるエスカレーション。それぞれ少しずつ大きくなります。
- スナップ: それが壊れる瞬間。
- 無表情の二行: 「幸運にも... / 不運にも...」。
- 解説: 日常的なアナロジーを使った1つの物理的概念(ブランコに乗る子供)。
- 結果: それが生み出したルール。
- コールバックツイスト: 結末。
- 視聴者がすでに見ているものを画面上で説明しないでください。
- 音声.
voice.wavを録音または生成し、その単語タイミングwords.jsonを(単語タイム付きの任意の音声認識を使用して)作成します。- それらをプロジェクトフォルダ(例:
~/bridge-short/voice/)に置きます。 - 単語タイミングを手動で修正します。すべては
words.jsonにタイミングが合わせられ、キャプションもそれから描画されます。
- それらをプロジェクトフォルダ(例:
- ショット計画 を
story.tsで行います:templates/bridge/(最終的なブリッジソース、Remotionプロジェクトのsrc/videos/bridge/と同じ)をsrc/videos/<name>/にコピーし、src/Root.tsxのBridgeShortの隣に新しいコンポジションを登録し、名前を変更します。SHOTS: id、a/bフレーム、light day/golden、crowd mode、tauストーリー時間。XFADE: 場所/時間の変更でのクロスフェード。FLASH_AT: フック後の白いフラッシュ。CAMS: ショットごとのキー{f, dur?, cut?, s: f => {pos, look, fov, roll}}。KICKS: インパクトフリップシェイク。DOF/dofAt: ビートごとのレンズブラー。FOREGROUND: 近接フレーミング小道具。- すべての視覚的反応は、対応する単語の0〜3フレーム前に発生します。
- 各文の主題を1つの連続した流れにチェーンします(
flow.ts、「連続フロー」を参照)。すべての動きに名前を付け、すべての停止にフレーミングサイズを付けます(「カメラの多様性」と「フレーミング」を参照)。 - すべての場所に独自のライトプリセットを与えます(「場所ごとの照明」を参照)。
- ワールド.
lights.ts: LIGHTS に加えて、ライトごとの LOOK 空/川/雲パレット。shade.ts: 2トーンシェーディングとuntone()。build.ts: 町、家、Kenney CC0 キットのプロップを再着色、カメラを遮るものの視線カリング付き。paint.ts: HD Canvas2D ペイントテクスチャ、継ぎ目は暗い色合いでペイント。world.ts: スカイシェーダー、フォグ = 地平線の色、川、フレームごとのポージング、ショットごとに固定された太陽、カメラ相対。
- キャラクター.
toon.ts: Canvas2DPen描画API、600x1000 デザインキャンバス、y = 975 のソール、ビーンヘッド、スティックリム、プラム可変幅アウトライン、顔ライブラリ。cast.ts: カメラ対面ビルボード、群衆、エフェクトカード、まばたき、歩行サイクル。すべてのビルボードはNOINKレイヤーに配置されます。cardshade.ts: シーンライトで照らされたカード、エミッシブなし。
- ポスト(
Bridge.tsx+ink.ts+lensblur.ts+grade.ts)。- コンポーザー順序: ink → lens pre → lens main → bloom → NEUTRAL トーンマップ → grade(MSAA 4)。
- すべてのピクセルパラメータは出力高さ / 1920 でスケーリングされます。
- サウンド(
~/bridge-short/audio/: timeline.py、sfx_gen.py、sfx.py、music.py、instruments.py、dsp.py、mix.py)。- イベントテーブル → 合成SFXに加えて、音声の下にダッキングされたオリジナルスコア。
- 出力: mix.wav(48 kHz、正確な長さ)、ステム、cues.md。
- サウンドを作成する前に、映像の時間定数をロックします。後でタイミングを変更する場合は、サウンドを再実行する必要があります。
- ルックチェック.
node scripts/bridge-stills.mjs out/<name>/x_ 100,400 0.5を実行します。BRIDGE_ENTRY=src/sandboxes/<n>/index.tsxを設定して、サンドボックスコピーをレンダリングします。python scripts/sbs_sheet.py out.jpg --ours ... --ref ...で参照フレームとの比較画像を作成します。- それらをOpus max検証者に送信します:1〜3枚の画像、200ワード以内の判定。
- すべてのショットに対してフレーミングチェック(
templates/bridge/framing.ts)を実行し、ショットごとに1枚の静止画(最初、中間、最後のフレーム)を含む1枚のコンタクトシートを作成します。「品質ゲート」を参照してください。
- 最終レンダリング.
npx remotion render src/index.ts <Comp> out/<name>/video.mp4 --codec h264 --crf 16 --scale 1.3333-map 0:v:0 -map 1:a:0でマルチプレクスします(Remotionは無音のオーディオトラックを書き込みます)。- QA:
python scripts/short_qa.py final.mp4 out/<name>/qa shots.jsonは、すべてのフレームについて黒、白、フリーズ、ポップフレーム、ラウドネス、シートをチェックします。 - 見つかった問題を修正し、詳細なOpus監査を実行します。
- 納品. 最終MP4ファイルを
SendUserFileで送信し、メモリを更新し、メモを書き込みます。
事前飛行(これを最初に行う)
templates/bridge/、references/、scripts/が存在することを確認します(存在しない場合、Remotionプロジェクトの隣に github.com/mromidev/claude-animated-shorts またはそのフォークをクローンします)。存在しない場合は、停止して取得します。テンプレートなしで一般的な three.js ルックを即興で作らないでください。- 最初に15秒のテストクリップ(フック + 2〜3ショット、キャプションとサウンド付き)を作成します。静止画をレンダリングし、品質ゲートを実行し、修正してから、完全なストーリーに拡張します。完全なレンダリングに直接進まないでください。
バイラルストーリーフォーマット: 「天才を笑う」(事実ベースのショートに使用)
毎回6つのビート:
- 奇妙な行動 文脈なし、1枚の絵で表示(フック、最初の3秒)。
- 笑い: 他のキャラクターが主人公を嘲笑う。
- 彼らは皆右を見る: 時間が経過し、主人公は間違っているか無害に見える。
- 手がかり: 見返りを予感させる1つの詳細。
- 見返り: 主人公が正しかったことを証明する出来事(視覚的なクライマックス)。
- 科学: メカニズム(内部 / 断面 / マクロビュー)を示し、それを1つの簡単な文で説明する。
- 事実の羅列ではなく、主人公がいる物語として語ります。1つの画像で見え、人々が笑うような奇妙な慣行を選びます。
- 最後の行は、簡潔な要約ではなく、議論やコメント(議論の余地のある何か)を開始します。
- タイトルのパターン: 「なぜXは...」「どのようにXは...」「Xが本当に意味していたもの」。タイトルに見返りのネタバレを含めないでください。
- ペーシング: 2〜3秒ごとに新しい主題、カットではなくカメラの移動(「連続フロー」を参照)で到達し、ほぼすべての動きやディゾルブに効果音(ウィッシュ、カチッ、群衆の笑い声)があり、音声の下に音楽があります。
- 豊かな場所、シンプルなキャラクター(丸い頭、棒状の腕): 60秒のショートには12〜16の異なる場所と20以上の小道具を計画し、各場所に独自の照明ムードを与えます。
- 最初に出典とともに事実を書きます。年と数字は自然に発音され(「えいせんはっぴゃくよんじゅうしち」)、キャプションは数字として表示されます。
- 例:
templates/SCRIPT_viral_example.md。
面白くする(コメディエンジン)
群衆は主人公を笑います。視聴者も笑うべきです。
- 無表情の声、不条理な絵. ナレーターは決して反応しません。キャラクターが反応します。この2つのギャップがジョークです。
- 4〜6秒ごとにギャグ、ショートごとに少なくとも3種類を使用します: ラインギャグ(控えめな表現、「幸運にも... / 不運にも...」)、ビジュアルギャグ(リアクション顔、背景の小さな細部、間違ったスケールの小道具)、サウンドギャグ(リアクションに合わせたばかげたSFX)。
- 3のルール: 2つの通常のビート、その後3つ目がパターンを破ります。
- ランニングギャグ: 1人の背景キャラクターまたはオブジェクト(鳩、サンドイッチを持った男)が3〜4回登場し、終盤で見返りを得ます。
- リアクションショット: カメラはパンチワードの3〜6フレーム後に顔(フローストップまたはラックフォーカス、カットではない)に落ち着き、8〜12フレーム保持します。顔ライブラリを使用します。少なくとも1つの「無関心」と1つの「ショック」を含めます。「リアクションと会話ビート」を参照してください。
- 自信過剰な主人公、尊大な群衆、過度に真面目な役人: キャラクターは些細なことを致命的に真剣に受け止めます。
- 1つのビート(見返り)だけで物理を誇張する: 押しつぶして伸ばす、砂塵、インパクトキック。
- コールバックエンディング: 最後の行は、起こったことを使用して最初の行(フック)をねじります。
- ジョークは実際の事実の範囲内に留めます: 面白い部分は真実の詳細です。実際の被害者やグループを決してパンチしないでください。ターゲットは過信と尊大さです。
字幕(単語ごとのキャプション)
- ソース:
words.json(音声の単語タイミング、手動修正)。任意の音声認識で動作します。templates/bridge/Captions.tsxのnormalizeWords()は、{word|text, start|start_time, end|end_time}を秒またはミリ秒で受け入れ、ElevenLabsの「スペーシング」エントリをスキップします。 - 音声認識テキストがスクリプト(数字、名前、スペル)と異なる場合は、テキストをSCRIPTの単語に置き換え、STTのタイミングを保持します。キャプションはスクリプトのスペル(「1847」)を表示します。音声は「えいせんはっぴゃくよんじゅうしち」と言っていてもです。
- コンポーネント:
templates/bridge/Captions.tsxをsrc/videos/<name>/にコピーし、<Captions words={WORDS} />をコンポジションの最後の子としてレンダリングします。three.js キャンバスの上のDOMオーバーレイとして、ポストプロダクションコンポーザーの外側に配置します(テキストにインク、ブラー、ブルーム、グレーディングは適用しません)。 - スタイル: 一度に1単語、フレーム高さの約68%(顔の下、安全領域内)で水平方向に中央揃え、太いサンセリフ、白い塗りつぶし、1080幅で9pxの暗い輪郭、ポップインスケール 0.8 → 1.08 → 1 over 6フレーム、背景ボックスなし、最大幅86%。数字、名前、パンチワードはアクセントカラー(
highlight)を使用します。ピクセルサイズは出力高さ / 1920 でスケーリングされます。 - 顔を決して覆わないでください: クローズアップでキャプション位置に顔がある場合は、
yPercent={(frame) => ...}を渡して、そのショットのために移動します。 - キャプションは、その単語が聞こえる1フレーム前に表示されます(
lead)。 - QA: すべてのショットのパンチワードで静止画をレンダリングし、キャプションが安全領域内にあり、顔を覆っていないことを確認します。