面、辺、頂点の要素選択の応用として、オブジェクトの半分の頂点を選択します。

ミラーリングするときなどに使用できるかと思います。


動作確認環境 : Blender 4.2


bpyでオブジェクト片側頂点選択


オブジェクトの片側半分だけ、頂点を選択します。
下画像は、球から半分の頂点を選択して削除したオブジェクトの例です。

手法としては単純で、
  • オブジェクトを一度原点に移動
  • X軸が負の領域(x<0)にある頂点を全て選択
することで、左半分を選択するといったものです。

Python:
def select_left_half_vertices(obj_name):
    # 現在のモード保存
    current_mode = bpy.context.object.mode
    obj = bpy.data.objects[obj_name]
    # Mode切り替え
    bpy.ops.object.mode_set(mode='OBJECT')
    active_element_select(object_name_list=obj_name)

    # アクティブオブジェクトの現在地保存
    original_location = bpy.context.object.location.copy()
    # オブジェクトを原点移動
    bpy.context.object.location = (0.0, 0.0, 0.0)
    bpy.context.view_layer.update()
    # 全適用
    initialize_transform_apply(object_name_list=[bpy.context.object.name])
    bpy.ops.object.mode_set(mode='EDIT')
    # 全頂点選択解除
    bpy.ops.mesh.select_all(action='DESELECT')
    bpy.ops.mesh.select_mode(type='VERT')

    # 頂点位置取得
    bm = bmesh.from_edit_mesh(obj.data)
    for vert in bm.verts:
        if vert.co.x < -0.00001: # 調整
            vert.select = True
    # 変更反映
    bmesh.update_edit_mesh(obj.data)

    # Mode切り替え
    bpy.ops.object.mode_set(mode='OBJECT')
    # オブジェクトを元の位置に戻す
    bpy.context.object.location = original_location
    bpy.context.view_layer.update()
    # 全適用
    initialize_transform_apply(object_name_list=[bpy.context.object.name])
    # 元のモードに戻す
    bpy.ops.object.mode_set(mode=current_mode)

09~15行目, 31~35行目 :
原点に移動後、元の位置に戻す

7行目 :
▼active_element_select


15,35行目 :
▼initialize_transform_apply


22~27行目 :
座標情報から頂点を選択


オブジェクト片側頂点選択使用例


球を追加して、オブジェクトの半分を削除するDemoです。

Python:
def Base_create():
    # Mode切り替え
    bpy.ops.object.mode_set(mode='OBJECT')

    # UV球追加
    bpy.ops.mesh.primitive_uv_sphere_add(
        radius=1
    ,   enter_editmode=False
    ,   align='WORLD'
    ,   location=(0, 0, 2)
    ,   scale=(0.5, 0.5, 0.5)
    ,   segments=16
    ,   ring_count=12
    )
    bpy.context.object.name = "My_sphere"

    # オブジェクト移動
    bpy.ops.transform.translate(
        value=(1, 0, 0)
    ,   orient_type='GLOBAL'
    )

    # Mode切り替え
    bpy.ops.object.mode_set(mode='OBJECT')
    bpy.ops.object.mode_set(mode='EDIT')
    bpy.ops.mesh.select_mode(type='VERT')
    
    # 左半分の頂点すべて選択
    select_left_half_vertices("My_sphere")

    # 選択頂点削除
    bpy.ops.mesh.delete(type='VERT')

Base_create()

以上

このエントリーをはてなブックマークに追加
コメントを閉じる

コメント

コメントフォーム
記事の評価
  • リセット
  • リセット