MRが楽しい

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

Blender2.8で利用可能なpythonスクリプトを作る その20(メッシュ情報から頂点の選択)

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

f:id:bluebirdofoz:20200426221023j:plain

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")

f:id:bluebirdofoz:20200426221005j:plain