編集モード【第 8 回 Python × Blender】
これまでの第 1~7 回の記事でお話ししてきた Blender のモードはオブジェクトモード(Object Mode)と呼ばれるものです。
このモードでは一つないしは複数のオブジェクトを作ったり、選択して(同時に)操作することができます。例えば複数のオブジェクトを移動したり、回転させたり、拡大・縮小することができました。
これらの操作は基本的に Blender の Python API の一つであるbpy
モジュールによって行われていました。
そして、このオブジェクトモードは Blender のデフォルトのモードとなっています。
対して一つのオブジェクトの一つないしは複数の頂点を操作し、より詳細な変形を行うモードが編集モード(Edit Mode)で、このモードでは Blender の 3D アートのツールとしての側面が輝きだします。
そしてこの編集モードにおける操作のほとんどを取り仕切るのが Blender の Python API の一つであるbmesh
モジュールです。
docs.blender.org
これまでに学んできたオブジェクトモードで用いられるbpy
モジュールと、これから学ぶ編集モードで用いられるbmesh
モジュールの機能を用いれば、どんな 3D の形状も作れるようになります。
今回の記事はこのbmesh
モジュールの解説に入る前に、オブジェクトモードと編集モードの切り替え方と注意点、 2 つのモードのPython スクリプトによる切り替え方を解説することです。
編集モードとその注意点
通常の Blender インターフェースで編集モード(Edit Mode)に切り替えるには、3D Viewport Header → Interaction Mode Menu → Edit Mode のように切り替えます。オブジェクトモードにも同様にして戻すことができます。
編集モードの注意点としては、編集モードではアクティブ化されているただ一つのオブジェクトしか編集できません。
それゆえに、他のオブジェクトを編集したい場合には一度オブジェクトモードに戻ってから、その編集したいオブジェクトをアクティブ化し直して、また編集モードに切り替える必要があります。
オブジェクトのアクティブ化が分からない方は以下の記事をご覧ください。
tamaki-py.hatenablog.com
アクティブ化されているオブジェクトの名前は Interactive Console でbpy.context.object
で確認できることも思い出しておきましょう。
Python スクリプトによるモード切り替え
- 編集モードに切り替え:
bpy.ops.object.mode_set(mode="EDIT")
- オブジェクトモードに切り替え:
bpy.ops.object.mode_set(mode="OBJECT")
を用いれば大丈夫です。Interactive Console にこのコマンドを打ち込むか、Text Editor でbpy
モジュールをimport
してこの上記のコマンドを用いましょう。
そこで以下のモード切り替えを行う関数を、前回のカスタムモジュールut.py
に追記しましょう。
# モード切り替え関数. 編集モードに切り替える mode=="EDIT" の時は, アクティブなオブジェクトの全ての頂点・辺・面を非選択状態にする。オブジェクトモードに切り替えるときには mode=="OBJECT" とする. def mode(mode_name): bpy.ops.object.mode_set(mode=mode_name) if mode_name == "EDIT": bpy.ops.mesh.select_all(action="DESELECT")
カスタムモジュールut.py
のコードは以下の記事で公開しています。
tamaki-py.hatenablog.com
デフォルトの Blender プロトコルでは編集モードへの切り替え時に、アクティブなオブジェクトのどの頂点・辺・面を選択状態にするのかが不明瞭なのだそうです。
そこで上記のコードでは、編集モードへの切り替え時にbpy.ops.mesh.select_all(action="DESELECT")
としてアクティブなオブジェクトの全ての頂点・辺・面を非選択状態にしています。
逆に編集モードからオブジェクトモードに戻るときには、Blender は直近の編集モードに入る直前のオブジェクトのアクティブ化状態ないしは選択状態を回復します。
少し注意点ですが、ある同じ Blender セッションでut.py
のようなカスタムモジュールを編集しながら利用する際には、Python のimportlib
モジュールをimport
し、importlib.reload(ut)
とカスタムモジュールut.py
をリロードしておきましょう。