BlenderScripting事始め
書いた人: formerpaper.icon
なお、著者はJava/Dart位しか使えないのでJavaの知識で書いてしまっているため用語のミスがあれば指摘して下さい。
用語定義
オブジェクト:Blenderのオブジェクトを指します。またそのインスタンスも指します。
Object:オブジェクト指向とかのプログラミング言語的なオブジェクトを指します。
アクティブ:3DViewで普通に選択したときの黄色めのオレンジの状態
選択:複数選択したときのアクティブ以外の赤に近いオレンジの状態
知っておくと便利なこと
Window限定らしいですが「ウィンドウ→システムコンソール切替え」でコンソールが出ます。何行目でエラーになったとかがここに出ます。しばらく知らなかったので不便だな!!!って思っていました。
全体向け
import bpy 最初に唱えておかなければいけない呪文。Blenderの機能の定義をimportして使える状態にする。
bpy.ops.object.editmode_toggle() 編集モードの切り替え
bpy.ops.paint.weight_paint_toggle() ウェイトペイントモード切替
選択関連
アクティブ=1オブジェクトのみ、選択=複数選択可能
bpy.context.view_layer.objects.active = オブジェクト オブジェクトをアクティブにする
オブジェクト.select_set(True) オブジェクトを選択する
取得関連
変数 = bpy.context.view_layer.objects.active ↑の逆でアクティブなオブジェクトを取得
変数 = bpy.data.objects['名前'] 名前のオブジェクトを取得
変数 = bpy.context.selected_objects[インデックス] 選択しているオブジェクトのインデックス番目(0開始)のオブジェクトを取得
bpy.context.object.modifiers["DataTransfer"] 指定した"名前"のモディファイアを取得
編集モードでのみ動作する系
変数 = アーマチュアオブジェクト.data.edit_bones.get('名前') 指定した名前のボーンを取得
ボーン.parent = 親に指定したいボーン Parentにボーンを突っ込む
ボーン.use_connect = True ↑で指定したParentに接続する(点線では無くちゃんとつなげる)
ウェイトペイントモードでのみ動作する系
bpy.ops.object.vertex_group_limit_total(group_select_mode='ALL',limit=4) 合計を4に制限(インフルエンス数の制限)
bpy.ops.object.vertex_group_normalize_all(lock_active=False) 全てをノーマライズ(アクティブロック無し)
アクティブなオブジェクトに対する操作
bpy.ops.object.modifier_add(type='DATA_TRANSFER') typeで指定したモディファイアを追加
bpy.ops.object.modifier_apply(modifier="DataTransfer") 指定した"名前"のモディファイアを適用
bpy.ops.object.duplicate({"object": オブジェクト,"selected_objects": [オブジェクト(複数可能)]}, linked=True/False) 複製。linkedは多分ディープコピーかシャローコピーか。基本False(ディープコピー)が求めている動作だと思う
bpy.ops.object.vertex_group_add() 頂点グループを追加
bpy.ops.object.vertex_group_remove(all=True) 頂点グループを削除、all=Trueで全部。ただし1つも対象がいないとエラー吐くので判定が面倒なら先に1つ適当にグループ追加してからall=True。
アクティブ&選択オブジェクトに対する操作
bpy.ops.object.join() Join。アクティブなオブジェクトに選択しているオブジェクトをJoin。
bpy.ops.object.parent_set(type='ARMATURE_AUTO', xmirror=True) 自動のウェイトで親設定(ミラーON)
作ったもの
TODO:いろいろ
code:template.py
import bpy