MRが楽しい

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

Blender2.8で利用可能なpythonスクリプトを作る その62(頂点グループへのウェイト設定)

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

頂点グループへのウェイト設定

指定オブジェクトの頂点グループ名にウェイトの設定を行います。
指定の頂点グループ名がオブジェクトに存在しない場合は頂点グループを新規作成します。
・Script_ops_weighting_object_vertexgroup.py

# bpyインポート
import bpy

# 指定オブジェクトにウェイト付けを行う
# 1.指定オブジェクトに対象の頂点グループがあるか確認する
# 2.対象の頂点グループがない場合、頂点グループを追加する
# 3.指定オブジェクトの全頂点に指定のウェイト値を割り当てる
def ops_weighting_object_vertexgroup(
  arg_object:bpy.types.Object, arg_vertexgroup_name:str, arg_weight:float) -> bool:
    """指定オブジェクトにウェイト付けを行う
    1.指定オブジェクトに対象の頂点グループがあるか確認する
    2.対象の頂点グループがない場合、頂点グループを追加する
    3.指定オブジェクトの全頂点に指定のウェイト値を割り当てる

    Args:
        arg_object (bpy.types.Object): 指定オブジェクト
        arg_vertexgroup_name (str): 追加頂点グループ名
        arg_weight (float): 指定ウェイト値

    Returns:
        bool: 実行正否
    """

    # オブジェクトの頂点グループを取得する(get関数は対象が存在しない場合 None が返る)
    vertexgroup = arg_object.vertex_groups.get(arg_vertexgroup_name)

    # 対象の頂点グループが存在しない場合は新規作成する
    if vertexgroup == None:
        # オブジェクトに新規頂点グループを追加する
        vertexgroup = arg_object.vertex_groups.new(name=arg_vertexgroup_name)

    # 対象の頂点グループをアクティブにする
    arg_object.vertex_groups.active_index = 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 = arg_weight

    # 頂点グループのウェイト値を選択頂点に割り当てる
    bpy.ops.object.vertex_group_assign()

    # オブジェクトモードに戻る
    bpy.ops.object.mode_set(mode='OBJECT', toggle=False)

    return

# 関数の実行例
target_obj = bpy.data.objects.get("Cube")
vertexgroup_name = "CubeGroup"
ops_weighting_object_vertexgroup(
    arg_object=target_obj,
    arg_vertexgroup_name=vertexgroup_name,
    arg_weight=1.0
)

f:id:bluebirdofoz:20200824171833j:plain

Operatorを利用しない頂点グループへのウェイト設定

指定オブジェクトの頂点グループ名にウェイトの設定を行います。
指定の頂点グループ名がオブジェクトに存在しない場合は頂点グループを新規作成します。
スクリプトは Operator を利用せず、ウェイト設定を行います。
・Script_weighting_object_vertexgroup.py

# bpyインポート
import bpy

# 指定オブジェクトにウェイト付けを行う
# 1.指定オブジェクトに対象の頂点グループがあるか確認する
# 2.対象の頂点グループがない場合、頂点グループを追加する
# 3.指定オブジェクトの全頂点に指定のウェイト値を割り当てる
def weighting_object_vertexgroup(
  arg_object:bpy.types.Object, arg_vertexgroup_name:str, arg_weight:float) -> bool:
    """指定オブジェクトにウェイト付けを行う
    1.指定オブジェクトに対象の頂点グループがあるか確認する
    2.対象の頂点グループがない場合、頂点グループを追加する
    3.指定オブジェクトの全頂点に指定のウェイト値を割り当てる

    Args:
        arg_object (bpy.types.Object): 指定オブジェクト
        arg_vertexgroup_name (str): 追加頂点グループ名
        arg_weight (float): 指定ウェイト値

    Returns:
        bool: 実行正否
    """

    # オブジェクトの頂点グループを取得する(get関数は対象が存在しない場合 None が返る)
    vertexgroup = arg_object.vertex_groups.get(arg_vertexgroup_name)

    # 対象の頂点グループが存在しない場合は新規作成する
    # 頂点グループ操作のマニュアル
    # (https://docs.blender.org/api/current/bpy.types.VertexGroup.html)
    if vertexgroup == None:
        # オブジェクトに新規頂点グループを追加する
        vertexgroup = arg_object.vertex_groups.new(name=arg_vertexgroup_name)

    # 全ての頂点を走査する
    # 頂点操作のマニュアル
    # (https://docs.blender.org/api/current/bpy.types.MeshVertex.html)
    for vert in arg_object.data.vertices:
        # 頂点グループの各頂点インデックスの位置にウェイトを設定する
        # REPLACE:交換、ADD:加算、SUBTRACT:減算
        # (https://docs.blender.org/api/current/bpy.types.VertexGroup.html#bpy.types.VertexGroup.add)
        vertexgroup.add([vert.index], arg_weight, 'REPLACE')

    return

# 関数の実行例
target_obj = bpy.data.objects.get("Cube")
vertexgroup_name = "CubeGroup"
weighting_object_vertexgroup(
    arg_object=target_obj,
    arg_vertexgroup_name=vertexgroup_name,
    arg_weight=1.0
)

f:id:bluebirdofoz:20200824171824j:plain