アストラルプリズム

PC、スマホ、ゲームなどの備忘録と日記

blender python オブジェクトの原点を座標指定して移動する

手動だとカーソルを介してオブジェクトの原点を移動するんだけどカーソルを動かすの超めんどいのでMatrix_worldを使って移動する。

手順としては
・編集モードで全部の頂点(メッシュ)を新しく設定したい原点位置からの距離に移動
・オブジェクトモードでオブジェクト自体を新しい原点位置に移動
という感じ。

import bpy
import bmesh
from mathutils import Matrix,Vector

obj = bpy.context.object
#新しい原点座標(グローバル)
new_origin = Vector((1,5,3))
world_loc = new_origin
#ローカル座標に変換
local_loc = obj.matrix_world.inverted() @ world_loc
#位置だけのマトリックスワールド
mat = Matrix.Translation(-local_loc)

if obj.data.is_editmode:
    #オブジェクトが編集モードだった場合
    bm = bmesh.from_edit_mesh(obj.data)
    #メッシュを移動
    bm.transform(mat)
    bmesh.update_edit_mesh(obj.data, False, False)
else:
    #オブジェクトモードの場合
    #メッシュを移動
    obj.data.transform(mat)

obj.data.update()
#オブジェクト自体を移動
obj.matrix_world.translation =world_loc

参考リンク:
Q&Aなんだけど回答した人の例題がオブジェクトモードでも編集モードでもできるように作ってるし、スクリプトもコメント無くてもすっごく分かり易く書いてあってすっごい。

blender.stackexchange.com