MRが楽しい

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

Blender2.9で利用可能なpythonスクリプトを作る その77(頂点座標のローカル座標またはグローバル座標を取得する)

本日は Blender の技術調査枠です。
Blender2.9で利用可能なpythonスクリプトを作ります。

頂点座標のローカル座標またはグローバル座標を取得する

サンプルデータ

動作確認のため、以下のような異なるスケールを重ねて設定した階層構造下の Mesh オブジェクトを作成しました。
f:id:bluebirdofoz:20210812224458j:plain
f:id:bluebirdofoz:20210812224525j:plain

ローカル座標を取得する

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)

f:id:bluebirdofoz:20210812224543j:plain

グローバル座標を取得する

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)

f:id:bluebirdofoz:20210812224557j:plain

参考ページ

本記事は以下の記事のスクリプトを再編したものです。
bluebirdofoz.hatenablog.com