手動だとカーソルを介してオブジェクトの原点を移動するんだけどカーソルを動かすの超めんどいので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なんだけど回答した人の例題がオブジェクトモードでも編集モードでもできるように作ってるし、スクリプトもコメント無くてもすっごく分かり易く書いてあってすっごい。