三日坊主のエンジニアBlog

Androidアプリ,Webアプリなどをやってるプログラマの雑記帳

Blender Python の基本

前回に引き続き、Blener Pythonプログラミングに関しての内容です。いよいよプログラムの中身に入っていきます。

前提条件

基本的なこと

  • スクリプトはPython 3.3の文法で書きますスクリプトは Python 3.0 の文法で記述します。 (2013/3/19 バージョンが間違っていたので訂正します)

 2.7以前の書き方は使えません。

 前回で説明した Pythonコンソール,テキストエディタのウィンドウでは日本語等2バイト文字の入力、表示はできなそうです。(2013/3/19 追記:Windows版ではできないですがLinuxでは可能だと情報をいただきました)外部エディタで編集したものを読み込んで実行する場合は、日本語も利用できます。UTF-8で書けば、コメントや文字列リテラルに日本語を含められます。*1

APIについて

 Blender Pythonでは、bpyモジュールが組み込まれていて、Blenderに関する操作はその中で定義されています。
下記のようにインポートして利用できます。*2

import bpy

bpyの中でさらにいくつかのサブモジュールに分かれています。よく利用すると思われるものを下に挙げます。それぞれのモジュールがどのような役割なのか構成が分かれば、期待した処理を行うモジュールを見つけやすいのではないでしょうか。

 Blenderの操作に関するもの(opsはOperatorsの意味)。opsの中でさらにカテゴリごとにサブモジュール化されています。例:オブジェクト関連の操作は bpy.ops.object, メッシュ関連は bpy.ops.meshなど

  • bpy.context

 今現在アクセスしている状態に依存するメンバにアクセスできます。基本的に読み取り専用

  • bpy.data

 すべてのBlenderおよびPythonのデータの情報にアクセスできます

  • bpy.types

 Blender用のPythonクラス型が定義されています

モードの切り替え・取得

  • 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.objectAPIリファレンスを参照してください。

  • 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

 非表示状態か否か 

実装例のサンプル

ソースコード

import bpy

for i in range(4):
  bpy.ops.mesh.primitive_cone_add()  # 円錐のメッシュを追加
  cone = bpy.context.object          # 直前で追加されたメッシュが取得される
  cone.location = (i * 2, 0.0, 0.0)  # メッシュの座標をx軸方向にずらしながら設定する

実行結果
f:id:Synd:20130211213439p:plain

その他にもさまざまなメンバーがあるのでAPIリファレンスを確認してください。


次回につづきます。

*1:ただ、海外製のソフトウェアではマルチバイト文字関連のバグは付き物なのであまり多様はしたくはないですが

*2:Pythonコンソールウィンドウでは、bpyモジュールが最初からインポートされています。