本日は Blender の技術調査枠です。
Blender2.9で利用可能なpythonスクリプトを作ります。
頂点座標のローカル座標またはグローバル座標を取得する
サンプルデータ
動作確認のため、以下のような異なるスケールを重ねて設定した階層構造下の Mesh オブジェクトを作成しました。
ローカル座標を取得する
Mesh オブジェクトの全頂点のローカル座標を取得します。
・Script_get_mesh_verts.py
# bpyインポート import bpy # メッシュ操作のため import bmesh # 指定オブジェクトの頂点座標(ローカル座標)を返す def get_mesh_verts(arg_objectname="Default") -> list: """指定オブジェクトの頂点座標(ローカル座標)を返す Keyword Arguments: arg_objectname {str} -- 指定オブジェクト名 (default: {"Default"}) Returns: list -- 座標(ローカル座標)リスト """ # 返却用のリストを作成する vert_list = [] # 指定オブジェクトを取得する # (get関数は対象が存在しない場合 None が返る) selectob = bpy.data.objects.get(arg_objectname) # 指定オブジェクトが存在するか確認する if selectob == None: # 指定オブジェクトが存在しない場合は処理しない return vert_list # 不要なオブジェクトを選択しないように # 全てのオブジェクトを走査する 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: # 頂点の座標情報(ローカル座標)をリストに追加する vert_list.append(v.co) return vert_list # 関数の実行例 vert_list = get_mesh_verts("Cube") for vert_pos in vert_list: # 頂点位置の情報をコンソールに表示する print(vert_pos)
グローバル座標を取得する
Mesh オブジェクトの全頂点のグローバル座標を取得します。
・Script_get_mesh_globalverts.py
# bpyインポート import bpy # メッシュ操作のため import bmesh # 指定オブジェクトの頂点座標(グローバル座標)を返す def get_mesh_globalverts(arg_objectname="Default") -> list: """指定オブジェクトの頂点座標(グローバル座標)を返す Keyword Arguments: arg_objectname {str} -- 指定オブジェクト名 (default: {"Default"}) Returns: list -- 座標(グローバル座標)リスト """ # 返却用のリストを作成する vert_list = [] # 指定オブジェクトを取得する # (get関数は対象が存在しない場合 None が返る) selectob = bpy.data.objects.get(arg_objectname) # 指定オブジェクトが存在するか確認する if selectob == None: # 指定オブジェクトが存在しない場合は処理しない return vert_list # 不要なオブジェクトを選択しないように # 全てのオブジェクトを走査する 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/bpy.types.Object.html#bpy.types.Object.matrix_world) matrix_world = selectob.matrix_world # 頂点を走査する # 頂点アクセスのマニュアル # (https://docs.blender.org/api/current/bmesh.types.html?highlight=bmedge#bmesh.types.BMVert) for v in meshdata.verts: # 頂点の座標情報(グローバル座標)をリストに追加する vert_list.append(matrix_world @ v.co) return vert_list # 関数の実行例 globalvert_list = get_mesh_globalverts("Cube") for globalvert_pos in globalvert_list: # 頂点位置の情報をコンソールに表示する print(globalvert_pos)
参考ページ
本記事は以下の記事のスクリプトを再編したものです。
bluebirdofoz.hatenablog.com