# Claude Opus 5.5にコードを書かせて3Dプロモーション映像を作る：1250行のコード、手作業のアニメーションは1フレームもなし

まず{完成版|かんせいばん}を見てください：102{秒|びょう}、60fps、{中国語|ちゅうごくご}のナレーションと{字幕|じまく}つきです。

https://img.leeguoo.com/media/2a4bad30-a008-48db-98a9-5beb68e3bfa3/motion-use-promo.mp4

{画面|がめん}の中のすべての{物体|ぶったい}、すべてのカメラ{移動|いどう}、すべての{音符|おんぷ}は、コードで{計算|けいさん}されています。AEは使っていません。キーフレームアニメーションも、{素材|そざい}ライブラリも、テキストから{動画|どうが}を{生成|せいせい}するモデルも使っていません。これを作ったのはClaude Code上で動くClaude Opus 5.5で、レンダリングには私たちがオープンソースで{公開|こうかい}している[motion-use](https://github.com/leeguooooo/motion-use)を使いました。

## 私が与えたもの

{要件|ようけん}は一文だけです：three.jsを使ってmotion-useのために、1〜2{分|ふん}の、ナレーションつきで、{原理|げんり}と何ができるかを{説明|せつめい}するプロモーション{映像|えいぞう}を作ること。{途中|とちゅう}で私がフィードバックしたのは一度だけです：最初のフレームが{黒画面|くろがめん}で、READMEのプレーヤーがそれをカバーにすると見栄えが悪い、という点です。すると第0フレームを{完全|かんぜん}なオープニング{画面|がめん}に{変更|へんこう}しました。

## それがやったこと

**まず{確認|かくにん}し、それから{台本|だいほん}を書く。** ナレーション内のmotion-useに関する一文一文について、まずリポジトリのソースコードから{根拠|こんきょ}を探しました：レンダラーがどうフレームごとに{位置|いち}を合わせるか、フォントをどう{裁断|さいだん}するか、{検収|けんしゅう}で何をテストするか。{出典|しゅってん}は[演出記録](https://github.com/leeguooooo/motion-use/blob/main/examples/motion-use-promo/DIRECTOR.md)に書かれています。

**ナレーションがタイムラインを決める。** まず9{段落|だんらく}のナレーションを書き、{音声|おんせい}を{生成|せいせい}し、各{段落|だんらく}の{実際|じっさい}の長さを測り、その長さに合わせてショットのウィンドウを決めました。motion-useのルールはとても{厳格|げんかく}です：ナレーションがショットを超えるとレンダリングはそのまま{失敗|しっぱい}し、勝手に切り詰めてはくれません。

**一本の線で{物語|ものがたり}全体を語る。** オープニングのあの{要件|ようけん}の一文が地面に落ち、溶けて一本の{発光|はっこう}するタイムラインになります。その後、絵コンテカードがその線に沿って立ち上がり、再生ヘッドがその上を行き来し、フレームがそこから立ち上がって{並列|へいれつ}に{抽出|ちゅうしゅつ}され、ナレーションブロックがショットウィンドウに収まり、完成映像はその線に沿って{検収|けんしゅう}スキャンリングを通り抜けます。前作のフェルトの小さな怪物がガイド役です。

**3Dシーンは約1000行のthree.js**：鏡面の床に黒い{漆|うるし}の層を重ね、フェルト{素材|そざい}にはsheenと半透明の毛羽シェル層を使い、Bloomで{光|ひかり}のにじみを作っています。すべての{姿勢|しせい}は時間の{純粋|じゅんすい}な{関数|かんすう}で、どの時点でもその1フレームだけを{個別|こべつ}に{計算|けいさん}できます。

**音楽と{効果音|こうかおん}はPythonで{合成|ごうせい}した{波形|はけい}**：96 BPMをベースに、タイピング音、シャッター音、エラー音、通過{通知|つうち}を{画面|がめん}イベントのタイミングに合わせて置き、メロディはナレーションの{隙間|すきま}にだけ入れています。

## それが自分で見つけた問題

ここが一番おもしろいところです。書き終えてそのまま出すのではなく、何度もフレームを{抽出|ちゅうしゅつ}し、{画像|がぞう}を見て、{修正|しゅうせい}しました：

- 初版ではほとんどの{段落|だんらく}でカメラが遠すぎ、文字が小さすぎ、絵コンテカードがBloomで白い{塊|かたまり}になっていました。
- フィルム右半分のフレームが消えていましたが、床の{反射|はんしゃ}にはまだ見えていました。半透明の{底板|そこいた}のソート順がフレームを覆っていると{判断|はんだん}し、{描画|びょうが}順を固定して直しました。
- カメラが各キーフレームで少し止まり、オープニングに0.8{秒|びょう}の{静止|せいし}が発生していました。そこで{補間|ほかん}を{連続|れんぞく}的なものに変えました。
- 前作では、{草稿|そうこう}の約30フレームに黒い四角が出ていました。調べると、一部のピクセルがNaNになり、それがBloomのぼかしで{拡散|かくさん}して大きな{塊|かたまり}になっていたためでした。そこで{後処理|あとしょり}チェーンの先頭にビット単位で{検出|けんしゅつ}するクリーニング手順を加えました。この{修正|しゅうせい}も今回の映像に引き継がれています。

{納品|のうひん}前に、motion-useは完成映像全体をデコードし、{実測|じっそく}の長さ、フレームレート、ラウドネスを確認し、ナレーションが本当にミックスされているかもチェックします（ショットごとに{波形|はけい}の{相関|そうかん}を{比較|ひかく}）。この映像では、{故障|こしょう}フレームは0、9{段落|だんらく}のナレーションはすべて{検出|けんしゅつ}に合格し、ラウドネスは-14.5 LUFSでした。

## できていないこと

- ナレーションはAI{音声|おんせい}です（edge-tts）。
- それ自身は音を聞けないため、音楽についてはスペクトラムとラウドネスの{測定|そくてい}だけを行い、聞こえ方は人が{判断|はんだん}する必要があります。
- 現時点では中国語版だけです。

## 自分で試す

motion-useはオープンソースです。インストール後、あなたのcoding agentにそのskillを読ませれば、同じ{流れ|ながれ}で映像を作れます：

```bash
curl -fsSL https://raw.githubusercontent.com/leeguooooo/motion-use/main/install.sh | sh
motion-use doctor
```

この映像の{完全|かんぜん}なソースコードは[examples/motion-use-promo](https://github.com/leeguooooo/motion-use/tree/main/examples/motion-use-promo)にあり、Bilibili版は[こちら](https://www.bilibili.com/video/BV1yhpe6bEwt)です。
