Blenderのグラフィカルなユーザーインターフェースは間違いなく素晴らしいですが、どうしても「やるのが面倒」に感じる作業がいくつかあります。チームにプレビューを共有すること、新しいプロジェクトで延々と設定を調整すること、そして同じ手順を何度も繰り返すことです。時には、ただ「それを実行するボタン」が欲しくなるでしょう。スクリプトは、それを実現する鍵です!
この記事では、Pythonというプログラミング言語を使ってBlenderのスクリプト機能を掘り下げます。最初のスクリプトの書き方、実行方法、そしてBlenderのスクリプトモジュールがどのように整理されているかを学びます。最後まで読めば、制作パイプラインを最適化し始めるための理解がしっかり得られます。
スクリプトで何ができる?
Blenderのスクリプトは、趣味の人のためのちょっとした小技というだけではありません。あらゆる規模のスタジオにとって必須のものです。
制作現場では、スピードと一貫性がすべてです。スタジオは常に厳しい締切、大量のアセットライブラリ、そして複数のワークステーション間で多数のショットやシーンを完全に同期させ続ける必要に直面します。これを手作業でやるのは遅く、ミスが起きやすく、高コストです。だからこそ自動化が非常に重要になるのです!
スクリプトは「コードを書く」ことが目的ではありません。あなた自身に創造的なショートカットや超能力を与えることが目的です。Pythonを使えば、時間を奪う退屈で繰り返しの多い作業を自動化したり、手順的ジオメトリ(プロシージャルな幾何)やマテリアル、さらには環境そのものを数行で生成したりできます。制作フローに合わせて自分だけのツールやメニューを設計でき、シーンを完全にコントロールし、 レンダー設定、カメラ、ライトを思い通りに扱えます。スクリプトならさらに、Blenderを外部ツールやAPIと連携できるため、より大きなパイプラインの中でも強力な役割を果たします。
前提条件
始める前に、次のものが用意できていることを確認してください:
- Blender - blender.orgから最新バージョンをダウンロードしてインストールします。
- Python - Blenderのネイティブスクリプトモジュールを使い、OSのターミナルからプログラムを実行するために、Pythonプログラミング言語が必要です。
このガイドで紹介している例の統合について、完全なソースコードはGitHubで確認できます:
🔗 https://github.com/cgwire/intro-blender-scripting
1. 新しいスクリプトを作成する
Blenderの中でスクリプト作業スペースを開きます。Newをクリックすると、新しいスクリプトを作成できるテキストエディタのパネルが表示されます。ここでPythonコードを書けます。特に、結果をリアルタイムで確認できる点が便利です:

制作パイプラインでは、コマンドラインインターフェースからスクリプトを実行するほうが、たいていはより役に立ちます。幸い、PythonにはBlender用のモジュールが同梱されています。このチュートリアルでは、グラフィカルユーザーインターフェースを行き来する手順を省くために、OSのターミナルから直接Pythonプログラムを実行します。まずは必要なBlenderモジュールをインストールしましょう:
pip install bpy==3.6.0 --extra-index-url <https://download.blender.org/pypi/>テストとして、Pythonで新しい空のBlenderファイルを作成してみましょう:
import bpy
bpy.ops.wm.save_as_mainfile(filepath="./new_empty_file.blend")
まず、BlenderのPython APIモジュールbpyをインポートします。これにより、Blenderのほぼすべてを操作できます(オブジェクト、マテリアル、レンダリングなど)。次に、現在のワークスペースを新しいファイルとして保存します。
ターミナルでプログラムを次のように実行できます:
python3 script.py新しく作成したファイルは、BlenderのCLIから開くこともできます:
blender new_empty_file.blendおめでとうございます!これで最初のスクリプトは完了です。次は、もっと実用的な例として「3Dテキストの生成」に進みましょう。
2. Hello Worldテキストの例
スター・ウォーズのオープニングアニメーションを作りたいと想像してみてください。つまり、角度をつけた状態でテキストがゆっくり上にスクロールしていくあの演出です。

編集しやすいように、これを効率よく行うにはどうすればいいでしょう?もちろんスクリプトを使います!では、簡単な例としていくつかの3Dテキストを生成してみましょう。
新しいファイルを作成し、シーン内のすべてのオブジェクトを削除して、最初はスッキリした状態から始めます:
import bpy
bpy.ops.object.select_all(action='SELECT') bpy.ops.object.delete(use_global=False)
bpy.ops.object.select_all(action='SELECT'): 現在シーン内にあるすべてのオブジェクトを選択します。bpy.ops.object.delete(use_global=False): 選択されたすべてのオブジェクトを削除します。
シーンに新しいテキストオブジェクトを追加するには、次の2つの指示だけで十分です:
bpy.ops.object.text_add(enter_editmode=False, location=(0, 0, 0))
text_obj = bpy.context.objectbpy.ops.object.text_add(...): 3Dワールド(XYZ座標)の(0, 0, 0)にテキストオブジェクトを追加します。text_obj = bpy.context.object: 新しく作成したテキストオブジェクトへの参照を、変数text_objに保存します。何かを新しく追加すると、Blenderはそれをアクティブオブジェクトにします。アクティブオブジェクトはbpy.context.objectでアクセスできます。
テキストの文字列を「Hello World」に変更します:
text_obj.data.body = "Hello World"text_obj.dataはText DataBlockを指し、テキストオブジェクトの実際の内容や設定です。.body = "Hello World"で、表示する文字列を「Hello World」に設定します。
次に、テキストに少し厚みを出して、X軸とY軸の中央に配置します:
text_obj.data.extrude = 0.05
text_obj.data.align_x = 'CENTER'
text_obj.data.align_y = 'CENTER'extrude = 0.05: テキストの奥行きを与え、平面の2Dテキストから、少し押し出された3Dテキストにします。align_x = 'CENTER': テキストを水平方向に中央揃えします。align_y = 'CENTER': テキストを垂直方向に中央揃えします。
他にも多くのオプションは、 Blenderのテキストオブジェクトのプロパティに関するドキュメント
最後に、BlenderのテキストはデフォルトでXY平面に平たく置かれるため、地面に寝かせた状態ではなく、カメラのほうを向くように回転させます:
text_obj.rotation_euler0 = 1.5708 # 90 degrees in radiansrotation_euler0: X軸まわりの回転を指します。1.5708ラジアン ≈ 90度。
結果を保存するには、先ほどの指示を使います:
bpy.ops.wm.save_as_mainfile(filepath="./text.blend")まとめると、最終的なコードは次のようになります:
import bpybpy.ops.object.select_all(action='SELECT') bpy.ops.object.delete(use_global=False)
bpy.ops.object.text_add(enter_editmode=False, location=(0, 0, 0)) text_obj = bpy.context.object
text_obj.data.body = "Hello World"
text_obj.data.extrude = 0.05 text_obj.data.align_x = 'CENTER' text_obj.data.align_y = 'CENTER'
text_obj.rotation_euler0 = 1.5708
bpy.ops.wm.save_as_mainfile(filepath="./text.blend")
3. スクリプトの実行方法(スクリプト読み込み)
前述のとおり、ヘッドレスモードでスクリプトを実行する構文は、基本的にどんなPythonプログラムと同じです:
python3 text.py以上です!これで、最初の実用的なBlenderスクリプトを実行できました。自動化、パイプライン、バッチ処理にとても役立ちます。
あとはtext.blendファイルを開いて結果を確認するだけです:

また、特定の.blendファイルを開き、そのコンテキスト内でスクリプトを実行することもできます:
bpy.ops.wm.open_mainfile(filepath='my_scene.blend')まずmy_scene.blendを読み込み、その後に残りのスクリプトをそれに対して実行します。
場合によっては、独自の引数を渡したいこともあります:
python3 args.py – --text "CLI Hello"args.pyの中では、このようにして引数にアクセスできます:
import sysargv = sys.argv argv = argvargv.index("--") + 1: # get args after --
print("Custom args:", argv)
基本はここまでですが、まだまだ発見できることはたくさんあります。
4. スクリプトモジュールを解説
Blenderは、さまざまなモジュールを通じてスクリプト機能を公開しています。それぞれのモジュールが何をするのかを理解すると、何をスクリプトできるのか、そしてドキュメントをどう検索してコード化するかがわかってきます。
まず、コアとなるbpyモジュールです:
bpy.context(コンテキストアクセス) - Blenderの現在の状態(アクティブオブジェクト、シーン、モード、選択中のオブジェクトなど)に関する情報を提供します。たとえばbpy.context.objectでアクティブオブジェクトが取得できます。bpy.data(データアクセス) - メッシュ、オブジェクト、マテリアル、カメラなど、Blenderのデータブロックに直接アクセスできます。例:bpy.data.objects"Cube"でCubeオブジェクトを取得します。bpy.msgbus(メッセージバス) - Blenderのデータの変更を監視し、フレーム変更イベントへの購読のようなコールバックをトリガーするためのpub/subシステムです。bpy.ops(オペレーター) - オブジェクトの追加、削除、レンダリングといったUI操作を模倣する関数を公開します。例:bpy.ops.mesh.primitive_cube_add()でキューブを追加します。bpy.types(タイプ) - 拡張やカスタマイズのために、Blenderのデータのコアクラス(例:Object、Mesh、Material)を定義し、カスタムパネルやオペレーターを作成できます。bpy.utils(ユーティリティ) - クラス登録、アドオン処理、システムのパスアクセスなどのためのヘルパー関数を提供します。例:bpy.utils.register_class(MyOperator)。bpy.path(パスユーティリティ) - 相対パスの解決や絶対パスの作成など、ファイルパスを扱うためのツールです。例:bpy.path.abspath("//textures/wood.png")。bpy.app(アプリケーションデータ) - バージョン、ビルド情報、実行モードなど、Blender自身に関する情報を提供します。例:bpy.app.versionは(3, 6, 2)を返します。bpy.props(プロパティ定義) - オペレーター、パネル、アドオンのために、数値、文字列、列挙型などのカスタムプロパティを定義するのに使われます。例:my_prop: bpy.props.IntProperty(name="My Number")。
次に、さらに専門的なライブラリもあります:
aud(オーディオシステム) - サウンドの再生、ファイルの読み込み、オーディオのミキシングのためのBlenderのオーディオライブラリです。例:Pythonで直接Blenderに.wavファイルを再生します。bgl(OpenGLラッパー) - カスタム3Dビューポート描画のための低レベルOpenGLラッパー(gpuに置き換えられています)。たとえばカスタムオーバーレイを描画するために使います。bl_math(追加の数学関数) - 補間、距離計算、ジオメトリ操作などのための追加の数学ヘルパー。たとえば点同士の距離を計算します。blf(フォント描画) - ビューポートオーバーレイやパネル内でテキストを描画するためのBlenderのフォント描画モジュールです。例:blf.draw(font_id, "Hello World")。bmesh(BMeshモジュール) - プロシージャルモデリングやトポロジー操作のために、Blenderのメッシュ編集システムへ直接低レベルにアクセスできます。例:編集モードで頂点や面を作成または変更する。bpy_extras(追加ユーティリティ) - インポート/エクスポート対応、数学の変換、view3dユーティリティなどのヘルパー関数を含みます。例:座標変換を簡略化します。freestyle(Freestyleモジュール) - 写真のようなレンダリングではないエッジ描画のための、BlenderのFreestyleラインレンダリングを制御します。例:ラインスタイルや可視性ルールの調整。gpu(GPUモジュール) - カスタムシェーダーやビューポートオーバーレイを可能にする最新のGPU描画API(bglの後継)。例:カスタムGLSLシェーダーで描画する。gpu_extras(GPUユーティリティ) - 完全なGLSLコードなしで図形描画を簡単にするためのGPU描画ヘルパー関数。例:シンプルな長方形を描画する。idprop.types(IDプロパティアクセス) - 辞書/配列形式でBlenderのカスタムIDプロパティに構造化されたアクセスを提供します。例:オブジェクト上のカスタムメタデータを操作する。imbuf(画像バッファ) - 画像バッファを扱い、読み込み、保存、ピクセルレベルの操作を可能にします。例:プロシージャルな画像生成。mathutils(数学タイプ & ユーティリティ) -Vector、Matrix、Quaternion、および幾何ユーティリティを提供するBlenderの数学ライブラリ。例:Vector((1,0,0)).cross(Vector((0,1,0))) → (0,0,1)。
結論
PythonによるBlenderスクリプトは、ワークフローを拡張し、パーソナライズするための最も強力な方法の一つです。
この記事では、スクリプトの作成と実行方法、3D空間で最初の「Hello World」を表示する方法、そしてbpyモジュールを使ってBlenderを思い通りに動かす方法を見てきました。
一見するとスクリプトは難しそうに感じるかもしれませんが、見てきたように、ほんの数行でもまったく新しい可能性への扉が開きます!
あとはあなたの番です。退屈な作業は自動化し、制作スタジオのパイプライン用のツールは最初から作り上げましょう。できます!


