本日は Blender の技術調査枠です。
Blender2.8で利用可能なpythonスクリプトを作ります。
メッシュ情報から特定座標の頂点を選択する
bmesh をインポートしてメッシュ情報にアクセスできます。
頂点の座標情報を取得してX軸がマイナス値の頂点を選択状態にします。
・mesh_verts_check.py
# bpyインポート import bpy # メッシュ操作のため import bmesh # X軸がマイナス値の頂点を選択状態にする def mesh_verts_check(arg_objectname="Default") -> bool: """X軸がマイナス値の頂点を選択状態にする Keyword Arguments: arg_objectname {str} -- 指定オブジェクト名 (default: {"Default"}) Returns: bool -- 実行正否 """ # 指定オブジェクトを取得する # (get関数は対象が存在しない場合 None が返る) selectob = bpy.data.objects.get(arg_objectname) # 指定オブジェクトが存在するか確認する if selectob == None: # 指定オブジェクトが存在しない場合は処理しない return False # 不要なオブジェクトを選択しないように # 全てのオブジェクトを走査する for ob in bpy.context.scene.objects: # 非選択状態に設定する ob.select_set(False) # 指定のオブジェクトのみを選択状態にする selectob.select_set(True) # 対象オブジェクトをアクティブに変更する bpy.context.view_layer.objects.active = selectob # 編集モードに移行する # モード切替のマニュアル # (https://docs.blender.org/api/current/bpy.ops.object.html#bpy.ops.object.mode_set) bpy.ops.object.mode_set(mode='EDIT', toggle=False) # メッシュデータを取得する # メッシュアクセスのマニュアル # (https://docs.blender.org/api/current/bmesh.types.html?highlight=bmedge#bmesh.types.BMesh) meshdata = bmesh.from_edit_mesh(selectob.data) # 選択モードを頂点選択モードにする meshdata.select_mode = {'VERT'} # 頂点を走査する # 頂点アクセスのマニュアル # (https://docs.blender.org/api/current/bmesh.types.html?highlight=bmedge#bmesh.types.BMVert) for v in meshdata.verts: # X軸の値が -0.001 以下の頂点を取得する if v.co.x < -0.001: # 頂点位置の情報をコンソールに表示する print(v.co) # 頂点を選択状態にする v.select_set(True) else: # 頂点を非選択状態にする v.select_set(False) return True # 関数の実行例 mesh_verts_check("Sphere")
X軸がマイナス値の頂点を削除してミラーモディファイアを設定する
頂点選択からの削除とモディファイア設定を組み合わせた処理です。
X軸がマイナス値の頂点を削除してミラーモディファイアを設定します。
・set_mirror_modifier.py
# bpyインポート import bpy # メッシュ操作のため import bmesh # X軸がマイナス値の頂点を削除してミラーモディファイアを設定する def set_mirror_modifier(arg_objectname="Default") -> bool: """X軸がマイナス値の頂点を削除してミラーモディファイアを設定する Keyword Arguments: arg_objectname {str} -- 指定オブジェクト名 (default: {"Default"}) Returns: bool -- 実行正否 """ # 指定オブジェクトを取得する # (get関数は対象が存在しない場合 None が返る) selectob = bpy.data.objects.get(arg_objectname) # 指定オブジェクトが存在するか確認する if selectob == None: # 指定オブジェクトが存在しない場合は処理しない return False # 不要なオブジェクトを選択しないように # 全てのオブジェクトを走査する for ob in bpy.context.scene.objects: # 非選択状態に設定する ob.select_set(False) # 指定のオブジェクトのみを選択状態にする selectob.select_set(True) # 対象オブジェクトをアクティブに変更する bpy.context.view_layer.objects.active = selectob # 編集モードに移行する # モード切替のマニュアル # (https://docs.blender.org/api/current/bpy.ops.object.html#bpy.ops.object.mode_set) bpy.ops.object.mode_set(mode='EDIT', toggle=False) # メッシュデータを取得する # メッシュアクセスのマニュアル # (https://docs.blender.org/api/current/bmesh.types.html?highlight=bmedge#bmesh.types.BMesh) meshdata = bmesh.from_edit_mesh(selectob.data) # 選択モードを頂点選択モードにする meshdata.select_mode = {'VERT'} # 頂点を走査する for v in meshdata.verts: # X軸の値が -0.001 以下の頂点を取得する if v.co.x < -0.001: # 頂点位置の情報をコンソールに表示する print(v.co) # 頂点を選択状態にする v.select_set(True) else: # 頂点を非選択状態にする v.select_set(False) # 選択した頂点を削除する bpy.ops.mesh.delete(type='VERT') # オブジェクトモードに移行する bpy.ops.object.mode_set(mode='OBJECT', toggle=False) # 「ミラー」モディファイアを追加する bpy.ops.object.modifier_add(type='MIRROR') # 作成モディファイアを取得する selectmod = selectob.modifiers['Mirror'] # X軸でミラー selectmod.use_axis[0] = True selectmod.use_axis[1] = False selectmod.use_axis[2] = False # オブション設定(結合,クリッピング,頂点グループ) selectmod.use_mirror_merge = True selectmod.use_clip = True selectmod.use_mirror_vertex_groups = True # 結合距離 selectmod.merge_threshold = 0.001 return True # 関数の実行例 set_mirror_modifier("Sphere")