MRが楽しい

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

Blenderで利用可能なpythonスクリプトを作る その15(オブジェクトのトランスフォームの変更とクリア)

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

オブジェクトのトランスフォームを変更する

オブジェクトのトランスフォーム(位置/回転/拡大縮小)を変更します。
位置/回転は指定値を加算し、拡大縮小は指定値を乗算します。
回転は孤度法への変換が必要なため、import math を利用します。

・transform_add.py

# mathインポート(孤度法計算のため)
import math
# bpyインポート
import bpy

# 指定オブジェクトのトランスフォームを変更する
# 引数   arg_objectname:指定オブジェクト名
#        arg_location:指定位置値(加算)
#        arg_rotation:指定回転値(加算)
#        arg_scale:指定拡大縮小値(乗算)
# 戻り値
def add_object_transform(arg_objectname='Default',
  arg_location=(0,0,0),arg_rotation=(0,0,0),arg_scale=(1,1,1)):
  # 指定オブジェクトを取得する
  selectob=bpy.context.scene.objects[arg_objectname]
  # 位置を変更する
  selectob.location.x += arg_location[0]
  selectob.location.y += arg_location[1]
  selectob.location.z += arg_location[2]
  # 回転を変更する
  # 弧度法で設定する必要があるため、度数法の入力を変換する
  selectob.rotation_euler.x += 2*math.pi/360*arg_rotation[0]
  selectob.rotation_euler.y += 2*math.pi/360*arg_rotation[1]
  selectob.rotation_euler.z += 2*math.pi/360*arg_rotation[2]
  # 拡大縮小を変更する
  selectob.scale.x *= arg_scale[0]
  selectob.scale.y *= arg_scale[1]
  selectob.scale.z *= arg_scale[2]
  return


# 関数の実行例
add_object_transform(arg_objectname='Cube',
  arg_location=(0.0,3.0,0.0),arg_rotation=(90,0,0),
  arg_scale=(2.0,2.0,2.0))

f:id:bluebirdofoz:20190614120421j:plain

オブジェクトのトランスフォームをクリアする

オブジェクトのトランスフォーム(位置/回転/拡大縮小)をクリアします。
位置は(0,0,0)、回転は(0,0,0)、拡大縮小は(1,1,1)になります。
適用と異なり、オブジェクトは実際にその位置に移動します。

・transform_clear.py

# bpyインポート
import bpy

# 指定オブジェクトのトランスフォームをクリアする
# 引数   arg_objectname:指定オブジェクト名
#        arg_location:位置クリア
#        arg_rotation:回転クリア
#        arg_scale:拡大縮小クリア
# 戻り値
def clear_object_transform(arg_objectname='Default',
  arg_location=True,arg_rotation=True,arg_scale=True):
  # 他のオブジェクトに操作を適用しないよう全てのオブジェクトを走査する
  for ob in bpy.context.scene.objects:
    # 非選択状態にする
    ob.select=False
  # 指定オブジェクトを取得する
  selectob=bpy.context.scene.objects[arg_objectname]
  # 指定オブジェクトを選択状態にする
  selectob.select=True
  # 位置をクリアする
  if arg_location:
    bpy.ops.object.location_clear(clear_delta=False)
  # 回転をクリアする
  if arg_rotation:
    bpy.ops.object.rotation_clear(clear_delta=False)
  # 拡大縮小をクリアする
  if arg_scale:
    bpy.ops.object.scale_clear(clear_delta=False)
  # 処理を完了したら非選択状態にする
  selectob.select=False
  return


# 関数の実行例
clear_object_transform(arg_objectname='Cube')

f:id:bluebirdofoz:20190614120432j:plain