3DアーティストとしてBlenderを学ぶことは、通常はそのアドオン・エコシステムについて学ぶことを意味します。リグ付けのように何時間もかかってしまう作業も、Rigifyのようなアドオンによって数秒に短縮できます。同じことはほとんどのワークフローでも言えます。私たちはしばしば、同じような繰り返しの疑問を抱きます。「Blenderはこれを自動でできるのだろうか?」
答えは「はい」です。ポイントはプログラミング言語のPythonです。
Blenderには強力な内蔵スクリプトエンジンがあり、数行のコードでオブジェクトを作成し、カメラを配置し、さらにはフルレンダリングをトリガーできます。
自分でアドオンを作れるなら、アドオンにお金を払う必要はありません。そしてアドオンの本質は、カスタムのBlenderユーザーインターフェースで包まれた単なるスクリプトです。
Blenderでスクリプトを書いたことがない場合、bpyモジュールを見つける体験は、すでに知っているはずのツールの中にある「秘密の扉を開く」ようなものです。すると、突然インターフェースのあらゆる部分がプログラム可能になります。もはやボタンをクリックしているだけではなく、反復可能な仕組みを作るための指示を出しているのです。
自動化できる最も重要なワークフローの1つがレンダリングです。パイプラインを速くするだけでなく、レンダリング設定を一貫していて予測しやすい状態に保つのにも役立ちます。このチュートリアルでは、3Dテキストを自動でアニメーションさせ、フルHDの動画に変換するための基本的なプログラムによるレンダリングシステムを実装します。ゼロから始めて、BlenderでPythonを実行する方法、そしてシーンを制御する方法を探っていきます。最後には、一般的なアニメーション作業を自動化する方法の全体像をしっかり掴めるはずです。
ユースケース
プログラムによるレンダリングは、従来の手作業によるシーン構築をはるかに超えた、多様で強力なワークフローを開放します:
- データ駆動モーショングラフィックス — アニメーション化されたチャート、リアルタイムのAPI駆動による放送用グラフィックス、または自動生成されるソーシャル動画。
- 生成アート — コードから進化していくプロシージャルなパターン、ノイズフィールド、粒子実験、アルゴリズムによるイラスト。
- バッチレンダリングされたバリエーション — パーソナライズされた広告、製品の色違い、アスペクト比の自動トリミング、大量のソーシャル素材生成。
- プロシージャルな3Dコンテンツ — 地形ビルダー、パラメトリックモデリング、植生/ワールドの人口、3Dアセットのバリエーションを自動で生成。
- 生成UI & デザインシステム — ダイナミックなSVG、テンプレート化されたバナー、ブランドに一貫したグラフィックスを必要なときにレンダリング。
- VFXおよびアニメーションのスクリプト化 — 自動化されたリグ制御、群衆システム、粒子の増殖、反復可能なシミュレーション設定。
- シミュレーションの可視化 — 流体や煙のシミュレーション、交通や群衆のダイナミクス、科学的/物理ベースのレンダリング。
多くの3Dモデリング作業は反復的で時間がかかります。これらを自動化された、スクリプト駆動のパイプラインに統合することで、Pythonが面倒な部分を裏で処理し、アーティストは創造的なワールド構築により集中できます。
いずれの場合でも、開発ワークフローはほぼ同じです:
- セットアップ - 必要な入力データを定義し、シーンをクリーンアップ
- ジオメトリ生成 - タスクに必要な実際のアセットをモデリング
- アニメーション - トランスフォームとそれに関連するキーフレームを定義
- 出力 - 望む成果物(3Dモデル、動画、画像シーケンスなど)
そして、これがまさに私たちが3Dテキスト動画レンダリングの例で辿る道です。
このガイドで紹介している例の統合に関する完全なソースコードは、GitHubで確認できます:
🔗 https://github.com/cgwire/blender-programmatic-rendering
1. シーン設定
シーンを生成する前に、まずはきれいなスタート地点が必要です。Blenderを開くと、通常はキューブ、カメラ、ライトを含むデフォルトのシーンが読み込まれます。このチュートリアルでは後者2つだけを使います。
Blenderをプログラム的に使う最初のステップは、bpyモジュールをインポートすることです。これによりPythonからBlenderのデータ、ツール、レンダリングパイプラインへ直接フルアクセスできます:
import bpy
bpy.data.objects.remove(bpy.data.objects.get("Cube"), do_unlink=True)
ここではデフォルトのCubeオブジェクトを削除します。do_unlink=Trueというパラメータにより、Blenderはオブジェクトを削除するだけでなく、それを参照している可能性のあるどのシーンからもアンリンクします。
2. 3Dテキストの操作
次に、シーンへ3Dテキストオブジェクトを追加し、これを操作し、最終的にプログラムによってレンダリングする中核要素にします。
bpy.ops.object.text_add(location=(0, 0, 0))
text_obj = bpy.context.object
text_obj.name = "CaptionText"
text_obj.data.body = "Hello world!"このコードスニペットは、ワールド原点に新しいテキストオブジェクトを作成し、読みやすい名前を割り当て、表示テキストを"Hello world!"に設定します。
テキストにシーン内での存在感を持たせるために、ジオメトリを調整できます。サイズを大きくし、押し出し(エクストルード)を追加することで完全な3Dテキストになり、さらに両軸で中心揃えにしておくと、将来の変換やアニメーションが簡単になります:
text_obj.data.size = 0.6
text_obj.data.extrude = 0.05
text_obj.data.align_x = "CENTER"
text_obj.data.align_y = "CENTER"これらの調整により、テキストはきれいに中央揃えされ、適切にスケールされ、さらなる処理の準備が整います。

3. キーフレームを追加する
次に、 キーフレームを挿入してテキスト位置のシンプルなアニメーションを作成し、時間の経過に沿って動かします。
まず、タイムラインカーソルをフレーム1に移動し、テキストを開始位置に配置して、その位置をキーフレームとして記録します:
bpy.context.scene.frame_set(1)
text_obj.location = (-4.0, 0.0, 1.0)
text_obj.keyframe_insert(data_path="location", frame=1)次にフレーム40へ進め、X軸方向にテキストをシフトさせて、新しい位置を示すもう1つのキーフレームを挿入します:
bpy.context.scene.frame_set(40)
text_obj.location = (0.0, 0.0, 1.0)
text_obj.keyframe_insert(data_path="location", frame=40)これら2つのキーフレームが揃うと、Blenderは自動的にその間の移動を補間し、テキストがフレーム中央へ滑り込むような滑らかなアニメーションを作成します。

4. 動画のレンダリング
残っているのは、 Blenderのレンダリング設定を構成して、最終的な動画を出力するだけです。
まず、どのレンダリングエンジンを使うかを選びます:Eevee か Cycles です。
Eeveeはリアルタイムのラスタライズエンジンなので非常に高速で、プレビューやスタイライズされたアニメーションに最適です。一方Cyclesは、物理ベースのパストレーサでより現実的なライティングを生成しますが、レンダリング時間がはるかに長くなります。素早い反復と多くの自動化ワークフローでは、Eeveeが一般により良い選択肢です:
bpy.context.scene.render.engine = "BLENDER_EEVEE"次に、出力解像度を指定します:
bpy.context.scene.render.resolution_x = 1920
bpy.context.scene.render.resolution_y = 1080次にフレームレートとアニメーション範囲を設定します。ここでは24 fpsで60フレームのショットです:
bpy.context.scene.render.fps = 24
bpy.context.scene.frame_start = 1
bpy.context.scene.frame_end = 60Blenderは、最終動画をどのようにエンコードするかも知る必要があります。レンダリング速度のため、H.264の動画エンコーディングを使ってMP4として書き出します:
bpy.context.scene.render.image_settings.file_format = "FFMPEG"
bpy.context.scene.render.ffmpeg.format = "MPEG4"
bpy.context.scene.render.ffmpeg.codec = "H264"最後に、利便性のためカレントフォルダを使って出力ファイルの保存先を選びます:
bpy.context.scene.render.filepath = "//render.mp4"すべてが設定できたら、次の1つのコマンドでレンダリング処理を開始できます:
bpy.ops.render.render(animation=True)5. まとめる
コードは完成しているので、あとはそれをPythonファイルrender.pyに入れるだけです:
import bpybpy.data.objects.remove(bpy.data.objects.get("Cube"), do_unlink=True)
bpy.ops.object.text_add(location=(0, 0, 0)) text_obj = bpy.context.object text_obj.name = "CaptionText" text_obj.data.body = "Hello world!"
text_obj.data.size = 0.6 text_obj.data.extrude = 0.05 text_obj.data.align_x = "CENTER" text_obj.data.align_y = "CENTER"
bpy.context.scene.frame_set(1) text_obj.location = (-4.0, 0.0, 1.0) text_obj.keyframe_insert(data_path="location", frame=1)
bpy.context.scene.frame_set(40) text_obj.location = (0.0, 0.0, 1.0) text_obj.keyframe_insert(data_path="location", frame=40)
bpy.context.scene.render.engine = "BLENDER_EEVEE" bpy.context.scene.render.resolution_x = 1920 bpy.context.scene.render.resolution_y = 1080 bpy.context.scene.render.resolution_percentage = 100 bpy.context.scene.render.fps = 24 bpy.context.scene.frame_start = 1 bpy.context.scene.frame_end = 60
bpy.context.scene.render.image_settings.file_format = "FFMPEG" bpy.context.scene.render.ffmpeg.format = "MPEG4" # container bpy.context.scene.render.ffmpeg.codec = "H264" bpy.context.scene.render.ffmpeg.constant_rate_factor = "HIGH" bpy.context.scene.render.ffmpeg.gopsize = 12 bpy.context.scene.render.ffmpeg.audio_codec = "AAC" bpy.context.scene.render.filepath = "//render.mp4"
bpy.ops.render.render(animation=True)
レンダリングを開始するために、スクリプトを実行します:
python3 render.pyレンダリングが完了したら、作業ディレクトリを確認してください。完全にプログラムで生成されたアニメーションが、これで視聴できる状態になっているはずです。

結論
この手順解説では、Blenderの中に完全な自動化パイプラインを構築しました。クリーンなシーンを用意し、3Dテキストを作成・修正し、キーフレームでアニメーションさせ、スムーズな補間でシーケンスをレンダリングしたのです。必要な手作業は一切ありません。すべてPythonだけで処理されます!
Blender APIがどれほどの制御を提供してくれるかを見た今、これらのアイデアをさらに大きく広げられます。ワークフローを自動化し、データからグラフィックスを生成し、シーンを組み立てる内部ツールを作り、バリエーションをレンダリングし、あるいは1つのコマンドでまるごとアニメーションを作ることもできます... アニメーション制作チームをもっと生産的にするための道が尽きることはありません。


