MRが楽しい

MRやVRについて学習したことを書き残す

Blenderで利用可能なpythonスクリプトを作る その21(ウェイトの設定とクリーン)

本日は Blender の技術調査枠です。
Blenderで利用可能なpythonスクリプトを作ります。
bluebirdofoz.hatenablog.com

ウェイトの設定

指定オブジェクトに頂点グループを追加して、オブジェクトの全頂点にウェイト1を割り当てます。
・weighting_object.py

# bpyインポート
import bpy

# 指定オブジェクトにウェイト付けを行う
# 1.指定オブジェクトに対象の頂点グループがあるか確認する
# 2.対象の頂点グループがない場合、頂点グループを追加する
# 3.指定オブジェクトの全頂点にウェイト 1 を割り当てる
# 引数   arg_objectname:指定オブジェクト名
#        arg_vertexgroup:追加頂点グループ名
# 戻り値
def weighting_object_vertexgroup(
  arg_objectname='Default', arg_vertexgroup='DefaultGroup'):
  # 指定オブジェクトを取得する
  selectob=bpy.context.scene.objects[arg_objectname]
  # 指定オブジェクトをアクティブにする
  bpy.context.scene.objects.active=selectob
  # オブジェクトの頂点グループを取得する(get関数は対象が存在しない場合 None が返る)
  vertexgroup=selectob.vertex_groups.get(arg_vertexgroup)
  # 対象の頂点グループが存在しない場合は新規作成する
  if vertexgroup == None:
    # オブジェクトに新規頂点グループを追加する
    selectob.vertex_groups.new(name=arg_vertexgroup)
  # 対象の頂点グループをアクティブにする
  selectob.vertex_groups.active_index=selectob.vertex_groups[arg_vertexgroup].index
  # 編集モードに移行する
  bpy.ops.object.mode_set(mode='EDIT', toggle=False)
  # 全頂点を選択状態にする
  bpy.ops.mesh.select_all(action='SELECT')
  # 頂点グループの設定ウェイト値を 1 にする
  bpy.context.scene.tool_settings.vertex_group_weight=1.0
  # 頂点グループのウェイト値を選択頂点に割り当てる
  bpy.ops.object.vertex_group_assign()
  # オブジェクトモードに戻る
  bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
  return


# 関数の実行例
weighting_object_vertexgroup(arg_objectname='Cube', arg_vertexgroup='CubeGroup')

f:id:bluebirdofoz:20190703092530j:plain

ウェイトの削除(クリーン)

指定オブジェクトの頂点グループを対して、オブジェクトの全頂点のウェイト付けを削除します。
一旦、全頂点にウェイト0を割り当て、クリーン操作を実行します。
・weighting_object.py

# bpyインポート
import bpy

# 指定オブジェクトのウェイト付けを削除する
# 1.指定オブジェクトに対象の頂点グループがあるか確認する
# 2.対象の頂点グループがない場合、処理しない
# 3.指定オブジェクトの全頂点にウェイト 0 を割り当てる
# 4.ウェイト 0 の設定を除去するため、クリーン操作を実行する
# 引数   arg_objectname:指定オブジェクト名
#        arg_vertexgroup:追加頂点グループ名
# 戻り値
def weightclear_object_vertexgroup(
  arg_objectname='Default', arg_vertexgroup='DefaultGroup'):
  # 指定オブジェクトを取得する
  selectob=bpy.context.scene.objects[arg_objectname]
  # 指定オブジェクトをアクティブにする
  bpy.context.scene.objects.active=selectob
  # オブジェクトの頂点グループを取得する(get関数は対象が存在しない場合 None が返る)
  vertexgroup=selectob.vertex_groups.get(arg_vertexgroup)
  # 対象の頂点グループが存在しない場合は処理しない
  if vertexgroup == None:
    # 処理終了
    return
  # 対象の頂点グループをアクティブにする
  selectob.vertex_groups.active_index=selectob.vertex_groups[arg_vertexgroup].index
  # 編集モードに移行する
  bpy.ops.object.mode_set(mode='EDIT', toggle=False)
  # 全頂点を選択状態にする
  bpy.ops.mesh.select_all(action='SELECT')
  # 頂点グループの設定ウェイト値を 0 にする
  bpy.context.scene.tool_settings.vertex_group_weight=0.0
  # 頂点グループのウェイト値を選択頂点に割り当てる
  bpy.ops.object.vertex_group_assign()
  # ウェイト 0 を除去するクリーン操作を実行する
  bpy.ops.object.vertex_group_clean(group_select_mode='ALL',limit=0.0,keep_single=False)
  # オブジェクトモードに戻る
  bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
  return


# 関数の実行例
weightclear_object_vertexgroup(arg_objectname='Cube', arg_vertexgroup='CubeGroup')

f:id:bluebirdofoz:20190703092541j:plain