Blender Python の基本
前回に引き続き、Blener Pythonプログラミングに関しての内容です。いよいよプログラムの中身に入っていきます。
基本的なこと
2.7以前の書き方は使えません。
前回で説明した Pythonコンソール,テキストエディタのウィンドウでは日本語等2バイト文字の入力、表示はできなそうです。(2013/3/19 追記:Windows版ではできないですがLinuxでは可能だと情報をいただきました)外部エディタで編集したものを読み込んで実行する場合は、日本語も利用できます。UTF-8で書けば、コメントや文字列リテラルに日本語を含められます。*1
APIについて
Blender Pythonでは、bpyモジュールが組み込まれていて、Blenderに関する操作はその中で定義されています。
下記のようにインポートして利用できます。*2
import bpy
bpyの中でさらにいくつかのサブモジュールに分かれています。よく利用すると思われるものを下に挙げます。それぞれのモジュールがどのような役割なのか構成が分かれば、期待した処理を行うモジュールを見つけやすいのではないでしょうか。
- bpy.ops
Blenderの操作に関するもの(opsはOperatorsの意味)。opsの中でさらにカテゴリごとにサブモジュール化されています。例:オブジェクト関連の操作は bpy.ops.object, メッシュ関連は bpy.ops.meshなど
- bpy.context
今現在アクセスしている状態に依存するメンバにアクセスできます。基本的に読み取り専用
- bpy.data
すべてのBlenderおよびPythonのデータの情報にアクセスできます
- bpy.types
モードの切り替え・取得
- bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
現在のモードを指定したものに切り替える
modeに指定できるのは'OBJECT','EDIT','SCULPT','VERTEX_PAINT','WEIGHT_PAINT','TEXTURE_PAINT','PARTICLE_EDIT','POSE' のいずれかの文字列です。
- bpy.context.mode
現在のモードを取得する(読み取り専用)。
戻り値は文字列で返ってきます。
オブジェクトモード → 'OBJECT'
編集モード(メッシュ) → 'EDIT_MESH'
編集モード(アーマチュア) → 'EDIT_ARMATURE'
頂点ペイント → 'PAINT_VERTEX'
等々...
上のmode_setで渡す文字列と若干違います。
モードを設定するのはBlenderに対する操作なので bpy.ops、取得は現在のコンテキストの状態を取得するので bpy.context からアクセスします。
- bpy.ops.object.add(type='EMPTY', view_align=False, enter_editmode=False, location=(0.0, 0.0, 0.0), rotation=(0.0, 0.0, 0.0), layers=(False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
現在のシーンにオブジェクトを追加する
Blender上からの操作では、3D ViewウィンドウでShift+Aからのオブジェクトの追加に当たるコマンドです。
すべての引数は省略可能で、指定するときは type=hogehogeのようなキーワード引数形式で指定する必要があります。
typeには追加するオブジェクトの種類を'MESH', 'CURVE', 'SURFACE', 'META', 'FONT', 'ARMATURE', 'LATTICE', 'EMPTY', 'CAMERA', 'LAMP', 'SPEAKER'のいずれかを指定します。
bpy.ops.objectにはempty_add, camera_add,armature_addなど、typeの引数だけが外れた特定の種類のオブジェクトを追加するメソッドもあります。詳しくはbpy.ops.objectのAPIリファレンスを参照してください。
- bpy.ops.mesh.primitive_xxx_add(view_align=False, enter_editmode=False, location=(0.0, 0.0, 0.0), rotation=(0.0, 0.0, 0.0), layers=(False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
基本形状のメッシュオブジェクトの追加
指定可能な形状は下記のとおりです。
- bpy.ops.mesh.primitive_circle_add 円
- bpy.ops.mesh.primitive_cone_add 円錐
- bpy.ops.mesh.primitive_cube_add 立方体
- bpy.ops.mesh.primitive_cylinder_add 円柱
- bpy.ops.mesh.primitive_grid_add グリッド
- bpy.ops.mesh.primitive_ico_sphere_add ICO球
- bpy.ops.mesh.primitive_monkey_add モンキー
- bpy.ops.mesh.primitive_plane_add 平面
- bpy.ops.mesh.primitive_torus_add トーラス
- bpy.ops.mesh.primitive_uv_sphere_add UV球
例: 座標(1, 0, 0)の場所にに z軸周りに45°傾けた立方体を追加する
bpy.ops.mesh.primitive_cube_add(location=(1, 0, 0), rotation=(0, 0, pi * 0.25))
情報の取得系の操作
- bpy.context.object
現在アクティブなオブジェクトを返す。
アクティブなオブジェクトが存在しないときはNoneを返す。
- bpy.context.selected_objects
編集されているオブジェクトをリスト形式で返す。
オブジェクトはbpy.types.Object型で返ってきます。
bpy.types.Object クラスのメンバーはたくさんあるので一部だけ紹介します。下記に紹介したものは取得と代入が可能です。
- name
名前
- location
座標
- scale
スケール
- select
選択されているか否か
- hide
非表示状態か否か