面、辺、頂点の要素選択の応用として、オブジェクトの半分の頂点を選択します。
ミラーリングするときなどに使用できるかと思います。
動作確認環境 : 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()
以上