スポンサーリンク

Blender 2.8 のPythonで Rotateする

Blender 2.8のPythonで、オブジェクトを回転しようとして以下のようなコードを適当にコピペしたところ、

import bpy

bpy.ops.transform.rotate(value=0.4,axis=(1.0,1.0,0.0))

TypeError: Converting py args to operator properties: : keyword "axis" unrecognized
Error: Python script failed, check the message in the system console

みたいな感じのエラーが出て修正できない。

によると、どうやらaxisはなくなったようで、しかもシンプルな方法がない(?)らしい。

上記記事では以下のようなrotate_object関数を自作して対応している。

import bpy


from math import radians
from mathutils import Matrix

# objに現在のアクティブなオブジェクトを指定する
obj = bpy.context.active_object

def rotate_object(rot_mat):
    # decompose world_matrix's components, and from them assemble 4x4 matrices
    orig_loc, orig_rot, orig_scale = obj.matrix_world.decompose()
    #
    orig_loc_mat   = Matrix.Translation(orig_loc)
    orig_rot_mat   = orig_rot.to_matrix().to_4x4()
    orig_scale_mat = (Matrix.Scale(orig_scale[0],4,(1,0,0)) @ 
                      Matrix.Scale(orig_scale[1],4,(0,1,0)) @ 
                      Matrix.Scale(orig_scale[2],4,(0,0,1)))
    #
    # assemble the new matrix
    obj.matrix_world = orig_loc_mat @ rot_mat @ orig_rot_mat @ orig_scale_mat 

# Matrix.Rotationで回転行列を作成
# Matrix.Rotation( ラジアンの回転角 , 4 , 回転軸 )
# 4 は4x4行列の意味
# 回転軸は(x,y,z)形式の他に 'X' や 'Y' や'Z' のように軸名を指定することもできる
rotate_object( Matrix.Rotation( radians(45), 4, (1,1,1) ) )

実行例

比較

Blender 2.8で以下を実行

rotate_object( Matrix.Rotation( 0.349, 4, (1.0,1.0,0.0) ) )

Blende 2.79で以下を実行

bpy.ops.transform.rotate(value=0.349,axis=(1.0,1.0,0.0))
元のモデル

Blender 2.8
Blender 2.79

同じ結果が出力できた

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: