夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

BlenderでPythonを使用して特定の範囲内にある頂点を領域選択するスクリプトを書く

本日はBlenderモデリング枠です。

モデリング中に例えばミラーモディファイアを使用するためにX軸がマイナスの座標にある頂点を一括選択して削除したいなど領域で頂点を選択したいという場合は多いです。

今回はPythonスクリプトを書いてBlenderで領域選択するような機能を作っていきます。

〇Blenderで頂点を領域選択する

Blenderであるオブジェクトの頂点を座標によって領域選択するためには次のようなステップを踏みます。

①現在選択されているオブジェクトを取得

②編集モードでなければ編集モードへ切り替える

③すべての頂点の中で範囲内のものを選択する。

②に関しては昨日の記事を参考にしてください。

redhologerbera.hatenablog.com

〇アクティブなオブジェクトを取得

現在選択されているアクティブなオブジェクトを取得するためには次のコードを実行します。

obj = bpy.context.active_object

これによってobjにアクティブなオブジェクトを取得できます。

〇全頂点から領域内のものを選択

全頂点を処理するためfor文を使用します。

コードは次のようになります。

for v in bm.verts:
    # 頂点の座標をグローバル座標系で取得
    coord = obj.matrix_world @ v.co
    # 座標が範囲内にあるかチェック
    if min_coord[0] <= coord.x <= max_coord[0] and \
       min_coord[1] <= coord.y <= max_coord[1] and \
       min_coord[2] <= coord.z <= max_coord[2]:
        # 頂点を選択
        v.select = True

〇コード一覧

完成したコードは次のようになります。

import bpy
import bmesh

# 現在アクティブなオブジェクトを取得
obj = bpy.context.active_object

# 編集モードに切り替え
bpy.ops.object.mode_set(mode='EDIT')

# BMeshオブジェクトを取得
me = obj.data
bm = bmesh.from_edit_mesh(me)

# 座標範囲を設定
min_coord = (0, 0, 0)
max_coord = (2, 2, 2)

# 全ての頂点をループして、範囲内のものを選択
for v in bm.verts:
    # 頂点の座標をグローバル座標系で取得
    coord = obj.matrix_world @ v.co
    # 座標が範囲内にあるかチェック
    if min_coord[0] <= coord.x <= max_coord[0] and \
       min_coord[1] <= coord.y <= max_coord[1] and \
       min_coord[2] <= coord.z <= max_coord[2]:
        # 頂点を選択
        v.select = True

# 選択を更新
bmesh.update_edit_mesh(me)

# ビューポートを更新するために一時的にオブジェクトモードに切り替える
bpy.ops.object.mode_set(mode='OBJECT')
bpy.ops.object.mode_set(mode='EDIT')

最後に更新を行い処理内容を適応しています。

座標指定に任意の値を入れて実行します。

min_coord = (0, 0, 0)
max_coord = (2, 2, 2)

これを実行することで次のように領域で選択を行うことができます。

今回は原点からXYZ正の値に選択を行っています。

本日は以上です。