MRが楽しい

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

Blender3.0で利用可能なpythonスクリプトを作る その132(グローバル座標を指定オブジェクトのローカル座標に変換する)

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

グローバル座標を指定オブジェクトのローカル座標に変換する

グローバル座標を指定オブジェクトのローカル座標に変換するには、オブジェクトが持つワールド空間変換行列の逆行列を取得して変換を行います。
docs.blender.org
docs.blender.org

サンプルスクリプト

グローバル座標での(0,0,1)座標を指定オブジェクトのローカル座標に変換するサンプルスクリプトです。
変換された座標が正しいか確認するため、最後にオブジェクトのローカル座標に変換した座標を反映しています。
・Script_convert_location_local.py

# bpyインポート
import bpy
# 型インポート
from mathutils import Vector

# グローバル座標(ワールド座標)を指定オブジェクトのローカル座標系に変換して返す
def convert_location_local(arg_targetobject:bpy.types.Object, arg_worldlocation:Vector) -> Vector:
    """グローバル座標(ワールド座標)を指定オブジェクトのローカル座標系に変換して返す

    Keyword Arguments:
        arg_targetobject {bpy.types.Object} -- 対象オブジェクト
        arg_traslation {Vector} -- グローバル座標

    Returns:
        Vector -- ローカル座標
    """

    # オブジェクトのワールド空間変換行列の逆行列を取得する
    # (https://docs.blender.org/api/current/bpy.types.Object.html#bpy.types.Object.matrix_world)
    # (https://docs.blender.org/api/current/mathutils.html#mathutils.Quaternion.inverted)
    mwi = arg_targetobject.matrix_world.inverted()

    # ローカル座標に変換して返却する
    return mwi @ arg_worldlocation


# 関数の実行例
# グローバル座標での(0,0,1)座標を指定オブジェクトのローカル座標に変換する
world_location = Vector((0, 0, 1))
target_obj = bpy.data.objects.get("Cube")
local_location = convert_location_local(target_obj, world_location)
# 返却値をコンソールに表示して確認する
print(type(local_location))
print(local_location)
# 実際にオブジェクトのローカル座標に返却値を設定して移動座標を確認する
target_obj.location = local_location

・実行前


・実行後