本日は 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 )
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 )