Blender 製品ビデオ は何をしますか?
無音でも伝わる、45〜75秒の製品フィルムを作成する手法と実用的な例です。 フォトリアルなセット(芝生、木製のゲート、本物の空)が一つの視覚的メタファーを担います。 短いテキストオーバーレイが、絵だけでは伝えきれないことを補います。 フィルムの最後は、カラーブロックの平らなグリッドに変形し、それが反転して見出しと行動喚起を綴ります。
すべてがコードです。セットも、アニメーションも、コンポジットも。GUIで開くものは何もありません。
このフォルダの内容
| パス | 説明 |
|---|---|
film.json | パレット、タイミング付きオーバーレイテキスト、エンディングの行。最初に編集します。 |
scripts/blender/build.py | セット:ヘアパーティクル草の丘、ゲート、曇りガラスのブロック、空、ヘイズ、レンダリング設定。 |
scripts/blender/mascot.py | キャラクターの例:フェンスポストに座れるほど小さいボクセルフクロウ。 |
scripts/blender/film.py | ショット、カメラ、フレームごとのアニメーション。plates と layers をレンダリングします。 |
scripts/post/comp.py | コンポジッター:プレート+レイヤー、2Dカメラ移動、テキスト、グレーディング、2Dブロックエンディング、ffmpegエンコード。 |
assets/ | 2つの空プレート(ゴールデン、曇り)。ご自身のものに置き換えてください。 |
examples/ | このパイプラインで作成されたフィルムのフレーム。 |
サンプルフィルムは「The Gate」です:同一のブロックが開いたゲートを通って一定のペースで転がり、その後あらゆるサイズで到着し、群れを成します。ゲートが閉まり、その後ブロックは通過、カウント、または停止されます。構造のリファレンスとして扱い、メタファーを製品に合ったものに置き換えてください。
ワークフロー
以下の順序で行ってください。各番号のステップで承認を得てから、次のステップでレンダリング時間を費やしてください。
- ブリーフ. それぞれ一文で:誰のためか、問題は何か、転換点、約束、行動喚起。尺(45〜75秒)、アスペクト比、再生場所を決定します。ミュート再生を前提とします。
- メタファー. 問題に対する物理的なイメージを一つ、製品に対するそのイメージの変化を一つ選びます。一つの場所、一つのメインプロップ、一種類の動くオブジェクト。説明が必要なら、選び直します。
- ビートシート. 6〜8ショット。それぞれ:持続時間、動くもの、オーバーレイの行(8語未満、一つのアイデア)、カメラ位置とレンズ。問題の幕は涼しい曇りの光で、製品の幕は暖かい光で。表にして承認を得ます。
- **キャラクター(オプション). ** 小さな主人公は視線の置き場を提供します。モデリング前に、フラットなスケッチで3〜4のオプションを提示します。セットに対するサイズを決めます:メインプロップに収まるようにします。単純なプリミティブから構築します(フクロウは1cmの立方体です)。
- コードでセットを構築.
build.pyを適応させます。メインプロップを原点に置き、単位はメートルにします。各ショットのスチルを低サンプルでレンダリングし、アニメーション前にすべてを確認します。 - アニメーション.
film.pyでは、各ショットにsetup_X(オブジェクトを一度作成)とupdate_X(t)(すべてをフィルムの秒tの位置に配置)があります。時間の純粋関数であり、キーフレームはないため、任意のフレームを単独でレンダリングでき、クラッシュしたレンダリングは中断したところから再開できます。 - 2パスレンダリング.
python scripts/blender/film.py platesを実行し、次に... layersを実行します。以下を参照。 - コンポジット.
python scripts/post/comp.py out.mp4 --draftで高速チェック(6フレームごと)、その後--draftなしで実行。エンディング調整中は--only-endingを使用します。 - 視聴. 各オーバーレイの中間点でスチルを取得し、確認します:テキストは読めるか、テキストが示すものがフレーム内に見えるか、ショット間で不自然な飛びがないか。修正し、影響を受けるショットのみ再レンダリングします(
layers/内のそのファイルを削除します)。
2パスレンダリング
フォトリアルな草は遅いです。動くオブジェクトは安価です。そのため、これらは分離してレンダリングされます。
- プレート. 各ショットの完全なセット(草、プロップ、空)のスチル一枚。例では1280x720、36サンプルです。光が変化するショットには2枚のプレートがあり、コンポジッターがクロスフェードします。
- レイヤー. 動くもののみ。透明な背景で、低解像度・低サンプルです。地面はシャドウキャッチャーなので、オブジェクトは影を落とします。静的プロップはホールドアウトなので、オブジェクトはその背後を正しく通過します。空はライティングのために残りますが、カメラからは隠れます。
- コンポジッター. レイヤーをプレートの上に重ね、ショットごとにスローな2Dプッシュまたはドリフトでカメラ移動を偽装します。固定された3Dカメラがプレートを再利用可能にしているのです。
3つの要素がコストを抑えます:
- ループ. ショットが安定した流れの場合、動きを周期的にし(0.84m/sで0.84m間隔は毎秒繰り返す)、1周期だけレンダリングします。
film.pyとcomp.pyのLOOPがこれらのショットをリストアップします。 - 2コマ撮影. レイヤーは1フレームおきにレンダリングされ(
STEP = 2)、保持されます。ストップモーションのように見え、小さなブロック状のオブジェクトに適しています。 - 再開. 各フレームは、そのファイルが存在すればスキップされます。
規模の参考:サンプルフィルム(51秒の3Dと12.5秒のエンディング)は、8枚のプレートと456フレームのレイヤーで構成されています。CPUのみでレンダリングされました。
2Dエンディング
comp.py が直接描画します。Blenderは使いません。パレットの色を使った64x36の角丸四角形のグリッドが、最後の3Dフレームの上に6列幅で飛び込み、カメラが64列すべて表示されるまで引き、その後斜めの波で各ブロックが反転(垂直方向に0まで潰れて戻り、中間点で色が変わる)して最終色になります。最終色は3x5ピクセルのフォントから取得されるため、ブロックがテキストになります。
コピーを計画する際の制限:最大4行、各行12文字(11文字の方が見栄えが良い)、大文字、数字、および . - / !。これらを film.json の ending に、グリッド行とパレットキーとともに設定します。
film.json の編集
palette: 7つの16進数カラー。primary、accent、warm、soft、deep、paper(エンディングの背景とデフォルトブロック)、alarm(「何かがおかしい」色)。overlays:[開始, 終了, "テキスト", x](フィルム秒単位)。xはオプションで、被写体が中央揃えのテキストで隠れる位置にある場合の水平位置(0〜1)。複数行には\nを使用します。ending: ブロックが綴る行。font: オーバーレイ用の .ttf または .otf へのパス。Inter、DejaVu、Helvetica、Arialがない場合にフォールバックします。
ショットの持続時間は film.py と comp.py の両方の先頭にある SHOTS にあります。同じ値にしてください。
セットアップ
python -m venv venv && . venv/bin/activate
pip install bpy==5.3.0 numpy pillow # bpyはBlender wheel。一致するPythonが必要です
# ffmpegがPATHに含まれている必要があります
TEST=1 python scripts/blender/film.py plates # 480x270、各ショット1フレーム、数分
TEST=1 python scripts/blender/film.py layers
python scripts/post/comp.py draft.mp4 --draft
FILM_OUT=/some/dir で plates/ と layers/ をこのフォルダではなくそこに書き出します。FILM_CONFIG で異なる film.json を指定します。GRASS_NEAR と GRASS_MID(パーセント)で草を間引きます。
desktop版Blenderをwheelの代わりに使用する場合:blender -b -P scripts/blender/film.py -- plates。
時間を大きくロスする落とし穴
- 草の長さ. ヘアパーティクルシステムの
normal_factorを設定するとhair_lengthがリセットされます。hair_lengthは最後に設定するか、すべての毛が数メートルになってフィールドがモーションブラーで見えなくなります。 - ペアレンティング. ペアレンティングは
matrix_parent_inverseを設定しない限り子を移動させます。ヒンジ付きのパーツがプロップから飛び出します。 - 空. UVシリンダー上の空画像は歪みます。大きなシリンダーにはミラーパネルを使用するか、カメラがパンしない場合は平面を使用します。実際の光には物理的な太陽を維持します。
- 被写体の上のテキスト. 各オーバーレイをその下のフレームと照合します。カメラを動かす前に
xでテキストを移動します。 - ズームインで見えなくなるもの. オーバーレイが何かを指定している場合(「Blocked.」など)、2Dクロップにそれがまだ含まれていることを確認します。
- 色のウォッシュアウト. AgX下の塗装面は、ブランドの16進数カラーよりも暗いベース色が必要です。スクリーンや正確な色として読ませる必要があるものは、エミッションにします。
- GPUなし. フレーム単位で予算化します:1レイヤーフレームの時間を計測し、乗算してから、解像度、サンプル数、またはショットの長さを収まるまで削減します。時間を計っていないレンダリングは開始しないでください。
- コンテナの再起動. 長時間のレンダリングは中断されます。ファイル存在チェックによるスキップがあなたを救います。
このパイプラインがやらないこと
これらを期待する前に、関係者に正直に伝えてください。
- 動く3Dカメラ。ショットは固定され、その上に2D移動があります。本当のパララックスは毎フレームセットをレンダリングする必要があり、GPUが必要です。
- モーションブラーとレイヤー上の24fpsモーション。ハードウェアが許せば、サンプル数を上げ、
STEP = 1に設定し、render.use_motion_blurをオンにします。 - オブジェクトは草の上に置かれ、草の中には入りません。なぜなら草はプレート内にあるからです。
- 音声。このフィルムは無音で機能するように作られています。必要に応じて後で音楽や効果音を追加してください。
- 3Dワールド内のスクリーン、UI、ロゴ。意図的に除外しています:フォトリアルなフィールドに製品UIを置くと偽物に見えます。製品のビジュアルは2Dエンディングか別のカットに入れてください。
ファイナル品質パス用
両パスとも1920x1080以上、128サンプル以上でデノイズあり、GPUレンダリング(OptiXまたはMetal)、STEP = 1、モーションブラーオン、comp.py の W, H を一致するように上げます。フレーム番号でマシン間でフレームを分割します。すべてのフレームは独立しています。