Blender × Claude — Pythonスクリプティング入門
Updated: 2026-05*
1. はじめに
本教材は、3DCGソフトウェアBlenderに対し、AIアシスタントClaudeを併用してPythonスクリプトを書き、3Dシーンの自動生成・編集・アニメーションを行う方法を解説する。マウス操作では時間のかかる繰り返し作業や、規則的な配置・パラメトリックな造形を、対話的にPythonコードを生成することで実現する。
1.1 参考サイト
- Blender Python API Documentation
- Blender 公式サイト
- Claude
- Anthropic Documentation
- Blender Manual — Scripting & Extending Blender
1.2 本教材の目的
本教材の到達目標は次の3点である。
第一に、BlenderのScriptingワークスペースを使い、bpyモジュールを用いた基本的なPythonスクリプトを実行できるようになることである。第二に、Claudeに対して「何を作りたいか」を適切な粒度で伝え、実行可能なスクリプトを生成させる手順を身につけることである。第三に、生成されたスクリプトのエラーや意図とのずれをClaudeと協働で修正するワークフローを習得することである。
1.3 想定する読者と前提
本教材はメディアアート・デザイン領域の学生を主たる対象とし、Blenderの基本操作(オブジェクトの追加、Object ModeとEdit Modeの切替、レンダリング)は一通り経験済みであることを前提とする。Pythonに関する事前知識は不要である。Claudeはブラウザ版(claude.ai)で十分に活用でき、本教材では特別な開発環境を要求しない。
2. 環境準備
BlenderとClaudeをそれぞれ独立に起動し、両者の間を人間がコピー&ペーストで橋渡しする構成を採る。MCP(Model Context Protocol)等によるBlender-Claude直接連携も存在するが、本教材ではまず手動運用に絞って解説する。
2.1 Blenderのバージョン
Blender 5.1 以降を推奨する。bpyのAPIはバージョン間で変更されるため、Claudeに依頼する際には必ず使用中のバージョンを明示する。バージョンは画面右上のメニューから確認できる。
2.2 Scriptingワークスペース
Blender画面上部のタブからScriptingを選択する。デフォルトでは画面が次のように分割される。
- 中央の大きい領域:Text Editor
- 内容:複数行のスクリプトを記述・保存・実行する領域
- 左下:Python Console
- 内容:1行ずつインタラクティブにPythonを実行する領域
- 右下:Info(実行ログ)
- 内容:マウス操作で行った全アクションが、対応するPythonコマンドとしてログ表示される
画面上部には3D ViewportとOutliner / Propertiesが配置される。
2.3 Pythonコンソールの動作確認
Python Console領域にカーソルを置き、次のコードを1行ずつ入力してEnterを押下する。
import bpy
bpy.ops.mesh.primitive_cube_add()3Dビューポートに新たなCubeが追加されれば、Pythonからのオブジェクト操作が成功している。
2.4 Claudeの利用準備
ブラウザでclaude.aiを開き、新規チャットを作成する。Blender用スクリプト生成を継続的に行う場合は、ProjectsまたはStyleを用意し、Blenderのバージョンや作業文脈を毎回再入力せずに済むようにしておくと効率が高い。
※ Project機能を使う場合、Project Instructionsに「Blender 5.x 用の bpy スクリプトを書く。コードブロックのみを返し、説明は最小限にする」等の指示を入れておくと、応答がスクリプト中心になる。
3. bpyの基礎
bpyはBlender Python APIのトップレベルモジュールであり、Blender内のすべての要素にアクセスする入口となる。本章では、Claudeにスクリプトをリクエストするうえで最低限知っておくべきbpyの構造を整理する。
3.1 主要サブモジュール
bpy.ops- 役割:BlenderのUIから実行できる「操作(Operator)」をコードから呼び出す
- 例:
bpy.ops.mesh.primitive_cube_add()
bpy.data- 役割:シーン内の全データ(Mesh、Material、Objectなど)にアクセスする
- 例:
bpy.data.objects["Cube"]
bpy.context- 役割:現在選択中のオブジェクト、アクティブなシーンなど「文脈情報」を扱う
- 例:
bpy.context.active_object
bpy.types- 役割:Blenderの内部型定義へアクセスする(型ヒントやプロパティ確認時に使用)
3.2 Info領域からのコード抽出
Blenderでマウス操作を行うと、Info領域に対応するPythonコマンドが自動でログ表示される。例えば、Add Mesh → Cubeとメニュー操作を行うと、Info領域に次のような行が出力される。
bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, align='WORLD', location=(0, 0, 0))この出力を選択してコピーすれば、自分が行ったGUI操作のPython表現が即座に得られる。Claudeへ依頼する際の参考情報としても有用である。
3.3 Text Editorからの実行
複数行のスクリプトはText Editorで扱う。Text Editor上部のNewボタンで新規テキストを作成し、コードを貼り付けたうえでRun Script(▶アイコン)をクリックする。ショートカットはAlt + Pである。
4. ClaudeにBlender用スクリプトを書かせる
Claudeに対して「何を、どのバージョンで、どの状態のシーンに対して行いたいか」を明確に伝えることが、出力品質を決定する。本章では効果的なプロンプトの構成要素を整理する。
4.1 プロンプトの基本構造
最低限、次の4要素を含めることが望ましい。
第一に、Blenderのバージョン(例:Blender 5.1)である。第二に、現在のシーンの状態(空のシーンか、特定のオブジェクトが既にあるか)である。第三に、達成したい結果を具体的に記述する。第四に、出力形式の希望(Text Editorに貼り付けてRun Scriptで実行できる形式、等)である。
参考)プロンプト例
Blender 5.1 を使用している。
シーンは空(デフォルトのCube・Camera・Lightは削除済み)である。
半径10の円周上に等間隔で12個のSphereを配置するスクリプトを書いてほしい。
全スクリプトを1つのコードブロックでまとめ、Text Editor の Run Script で実行できる形式とする。4.2 スクリプトの実行手順
Claudeから返ってきたコードを、次の手順でBlenderに反映する。
第一に、Claudeの応答内のコードブロックをコピーする。第二に、BlenderのText EditorでNewを押下し、コードをペーストする。第三に、Run Script(またはAlt + P)で実行する。第四に、3Dビューポートで結果を確認する。
4.3 エラー時の対処
スクリプト実行時にエラーが発生した場合、Blender画面下部のステータスバーに赤字でエラーメッセージが表示される。Window → Toggle System Consoleでシステムコンソール(Windows)を開くか、ターミナルからBlenderを起動していれば(macOS / Linux)、完全なエラートレースバックを確認できる。
このエラーメッセージ全文をClaudeに貼り付け、「次のエラーが出た。修正してほしい」と伝えれば、多くの場合修正版が返ってくる。
※ エラーメッセージは省略せずに、行番号やトレースバック全文を含めて貼り付ける。最終行のみのコピーでは情報が不足することがある。
4.4 シーンの初期化
実験中はシーンが汚れていきやすいため、スクリプトの冒頭で初期化処理を入れておくとよい。次のパターンは Text Editor から実行しても context エラーが起きにくく、初心者でも安全に使える。
import bpy
# 既存オブジェクトを全削除
for obj in list(bpy.data.objects):
bpy.data.objects.remove(obj, do_unlink=True)
# 孤立したMeshデータも削除
for block in list(bpy.data.meshes):
if block.users == 0:
bpy.data.meshes.remove(block)※ bpy.ops.object.select_all(action='SELECT') + bpy.ops.object.delete() の組み合わせは、マウスフォーカスが3D Viewport上にないと RuntimeError: context is incorrect で失敗することがある。bpy.data 経由の上記パターンは context に依存しないため、Text Editor から確実に動作する。
5. 実践1 — オブジェクトを規則的に配置する
最も基礎的なケースとして、複数のオブジェクトを規則的に並べる例を扱う。
5.1 グリッド状に配置する
Claudeに対し、次の指示を与えるところから始める。
参考)プロンプト
Blender 5.1、空のシーンを想定。
10×10のグリッド状にCubeを配置するスクリプトを書いてほしい。
Cube間の間隔は2.0とする。返ってくるスクリプトはおおむね次のような構造になる。
import bpy
spacing = 2.0
grid_size = 10
for i in range(grid_size):
for j in range(grid_size):
x = i * spacing
y = j * spacing
bpy.ops.mesh.primitive_cube_add(size=1.0, location=(x, y, 0))5.2 高さをランダムに変える
続けて、Claudeに次のように追加依頼する。
参考)追加プロンプト
各CubeのZ軸高さを 0〜3 の範囲でランダムにしてほしい。
seed値を42に固定する。randomモジュールを使う形に書き換えられたスクリプトが返ってくる。再現性のためにrandom.seed()を指定している点に注意する。
5.3 サインカーブで波打たせる(おまけ)
Z軸高さを乱数ではなくmath.sin関数で決定すれば、波状の地形が得られる。Claudeに「Z軸の高さを sin(x * 0.5) + cos(y * 0.5) で決定するように修正」と依頼すれば、対応するスクリプトに書き換えてくれる。
6. 実践2 — マテリアルを割り当てる
オブジェクトに対して、色やシェーダー設定をPythonから一括で適用する例を扱う。
6.1 Principled BSDFの基本
Blenderの標準シェーダーであるPrincipled BSDFを、Pythonから設定する場合のノード構造は次のように整理できる。
- Material(マテリアル本体)
- use_nodes:True
- node_tree:内部にShader Nodeを保持
- Principled BSDF
- Base Color:(R, G, B, 1.0)
- Roughness:0.0〜1.0
- Metallic:0.0〜1.0
- Material Output
- 入力Surface ← Principled BSDFのBSDFソケット
- Principled BSDF
6.2 全オブジェクトに色をランダム割り当て
参考)プロンプト
シーン内の全てのMesh Objectに対し、ランダムな色のマテリアルを割り当てるスクリプトを書いてほしい。
Principled BSDF を使い、Base Color のみをランダム化する。
seed値は42に固定する。生成されるスクリプトの骨子は次のようになる。
import bpy
import random
random.seed(42)
for obj in bpy.context.scene.objects:
if obj.type != 'MESH':
continue
mat = bpy.data.materials.new(name=f"Mat_{obj.name}")
mat.use_nodes = True
bsdf = mat.node_tree.nodes.get("Principled BSDF")
r = random.random()
g = random.random()
b = random.random()
bsdf.inputs["Base Color"].default_value = (r, g, b, 1.0)
if obj.data.materials:
obj.data.materials[0] = mat
else:
obj.data.materials.append(mat)※ bsdf.inputs["Base Color"]の値は必ず長さ4のタプル(RGBA)で与える。長さ3で渡すとエラーとなる。
6.3 EmissionをONにして光らせる(任意)
「Base Colorと同じ色で Emission Color を設定し、Emission Strength を 2.0 にして」とClaudeに追加依頼すれば、自己発光するマテリアルになる。Cyclesレンダラと併用するとライト要らずの構成が組める。
7. 実践3 — アニメーションを付与する
オブジェクトの位置・回転・スケールに対し、キーフレームをPythonから挿入する例を扱う。
7.1 単一オブジェクトの上下動
参考)プロンプト
Blender 5.1、現在選択中のオブジェクトに対し、
フレーム1〜120の間で Z軸方向に sin(frame * 0.1) * 2 で上下動するキーフレームを
打つスクリプトを書いてほしい。生成されるスクリプトの骨子は次のとおりである。
import bpy
import math
obj = bpy.context.active_object
for frame in range(1, 121):
bpy.context.scene.frame_set(frame)
obj.location.z = math.sin(frame * 0.1) * 2
obj.keyframe_insert(data_path="location", index=2, frame=frame)index=2はlocationの第3要素(Z)を意味する。X、Y、Zそれぞれにキーフレームを打つ場合は0, 1, 2を指定する。
7.2 全Cubeに位相差をつけて波動を作る
実践1で作ったグリッド配置に対し、位置に応じた位相差を付与すると波打つアニメーションになる。
参考)プロンプト
シーン内の全Cubeに対し、フレーム1〜240の間で
Z高さを sin(frame * 0.1 + (x + y) * 0.3) で変化させるキーフレームを打ってほしい。
xとyは各CubeのワールドX,Y座標を使う。7.3 補間モードをLINEARに変更(おまけ)
キーフレームの補間はデフォルトでBEZIER(滑らか)になる。機械的な動きにしたい場合はLINEARやCONSTANTに変更する。Claudeに「全fcurveの補間モードを LINEAR に変更」と依頼すれば、対応するスクリプトを追加してくれる。
8. 実践4 — Geometry NodesをPythonから操作
BlenderのGeometry Nodesは強力なプロシージャル造形機構である。Geometry Nodes自体はノードベースのインターフェースで構築するが、Modifierとしての追加や、入力ソケットの値設定はPythonから可能である。
8.1 Modifierの追加
参考)プロンプト
選択中のオブジェクトに Geometry Nodes Modifier を追加し、
新規のNodeTreeを割り当てるスクリプトを書いてほしい。
Blender 5.1 を想定する。生成スクリプトの骨子は次のとおりである。
import bpy
obj = bpy.context.active_object
mod = obj.modifiers.new(name="GeoNodes", type='NODES')
# 新規 NodeTree を作成
node_tree = bpy.data.node_groups.new(name="MyGeoNodes", type='GeometryNodeTree')
mod.node_group = node_tree
# 入出力ソケットの定義(4.0以降の新API、5.x でも継続)
node_tree.interface.new_socket(name="Geometry", in_out='INPUT', socket_type='NodeSocketGeometry')
node_tree.interface.new_socket(name="Geometry", in_out='OUTPUT', socket_type='NodeSocketGeometry')
# Input / Output ノードを追加
input_node = node_tree.nodes.new(type='NodeGroupInput')
output_node = node_tree.nodes.new(type='NodeGroupOutput')
input_node.location = (-200, 0)
output_node.location = (200, 0)
# 入力と出力を接続
node_tree.links.new(input_node.outputs[0], output_node.inputs[0])※ node_tree.interface.new_socket() はBlender 4.0で導入され、5.x でもそのまま使える。3.x系ではnode_tree.inputs.new()を使っていたため、ネット上の古い記事をそのまま貼ると動かないことがある。Claudeに「Blender 5.x の新しい interface API を使うように」と明示すると確実である。
8.2 ノードを追加して接続する
既存のGeometry Nodes Modifierに対し、Distribute Points on FacesとInstance on Pointsを挿入し、メッシュ表面に大量のオブジェクトをインスタンス化するワークフローも、Claudeに記述させることができる。ノード名と入出力ソケット名を正確に伝えるほど、出力スクリプトの精度が上がる。
9. Claudeとの協働パターン
Blenderスクリプティングにおいて、Claudeを単発のコード生成器ではなく、対話的な協働者として活用するための実践的パターンを整理する。
9.1 段階的に依頼する
複雑な要件を一度に与えるより、最小実装→拡張→改良の順に分けて依頼する方が、各段階でコードを検証でき、最終的な品質も高くなる。
例として「100個のCubeをランダムに配置し、Z軸の動きで波打つアニメーションを付ける」という要件は、(1) Cubeをランダム配置 → (2) マテリアル付与 → (3) Z軸の単純な上下動を全Cubeに付与 → (4) 位置に応じた位相差を加えて波動化、の4段階に分割する。各段階の出力をBlenderで確認してから次の依頼に進めば、どこで意図とずれたかを切り分けやすい。
9.2 エラーログを貼って改善依頼する
エラーが発生したら、トレースバック全文と直前に実行したスクリプトの両方を貼り付ける。「以下のスクリプトを実行したら、以下のエラーが出た」と前後関係を明示すれば、Claudeは原因をピンポイントで指摘し、修正版を返してくれる。
9.3 既存スクリプトの改造を依頼する
過去に書いたスクリプトをClaudeに貼り付け、「このスクリプトに、〜の機能を追加して」と依頼するパターンも有効である。ゼロから書かせるより、既存の構造を維持したまま局所的な変更が得られるため、デバッグが容易になる。
9.4 リファレンスとして使う
「bpy.context.active_object と bpy.context.object の違いは何か」「Blender 5.x で Geometry Nodesのソケットを追加する正しいAPIはどれか」といった調査的な質問にもClaudeは有用である。ただしBlender APIはバージョン更新が頻繁であり、回答が古い情報に基づいている可能性もあるため、最終的には公式ドキュメントで確認することが望ましい。
10. おわりに
本教材ではBlenderとClaudeを組み合わせ、Pythonスクリプトによる3Dシーンの自動生成・編集・アニメーション・プロシージャル造形までを扱った。重要な点は、Claudeを「コードを書いてくれる便利な存在」と捉えるよりも、「Blender APIの知識を持つ協働者」として、自分の意図を言語化しながら対話する習慣を身につけることである。
bpyの全機能を暗記する必要はない。何ができるかの当たりがついていれば、具体的な構文や引数はClaudeに任せてよい。そのうえで、生成されたコードを読み、エラーを伝え、改造を依頼する一連のサイクルを回すことで、Blender自体への理解も自然と深まっていく。
