テキストベースでBlenderでモデリングするにあたり、オブジェクト及びメッシュを回転させる操作は頻繁に行います。

また、回転の中心の設定についていくつか種類があるので、処理をまとめておくことで少しでも使いやすくしておきます。


動作確認環境 : Blender 4.2


bpyでオブジェクト・メッシュ回転処理


オブジェクトやメッシュの回転の際、回転の中心として指定できるものには次のような種類があります。
POINT!
  • MEDIAN_POINT
    • オブジェクトの中点(複数オブジェクトの中心)
  • ACTIVE_ELEMENT
    • アクティブなオブジェクトの中心
  • CURSOR
    • 3Dカーソル位置
  • INDIVIDUAL_ORIGINS
    • 個々のオブジェクトの中心
  • BOUNDING_BOX_CENTER
    • バウンディングボックスと呼ばれるオブジェクトを囲う枠の中心
これらを「bpy.context.scene.tool_settings.transform_pivot_point」へ設定することで回転の中心を変えることができます。

その他オプションや詳細は以下公式ページを見てください。

▼公式ページ
Transform Operators - Blender Python API

Python :
def object_rotate_func(
        object_list=["mesh"]                        # オブジェクトリスト
    ,   transform_pivot_point='INDIVIDUAL_ORIGINS'  # 回転の中心(ピボットポイント)
    ,   radians_num=0                               # 回転角度(度)
    ,   orient_axis="Z"                             # 回転軸
    ,   orient_type="GLOBAL"                        # 回転軸座標
):
    # 現在のモード保存
    current_mode = bpy.context.object.mode
    # Mesh選択時(Default)
    if (object_list[0] != "mesh"):
        # Mode切り替え
        bpy.ops.object.mode_set(mode='OBJECT')
        # 全オブジェクト選択解除
        bpy.ops.object.select_all(action='DESELECT')
        # アクティブオブジェクト選択
        my_active_element = active_element_select(object_name_list=object_list)
        # オブジェクトのオリジンをジオメトリの中心に移動
        # オブジェクト中心(回転の中心)をオブジェクトに追従させる
        bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_MASS', center='BOUNDS')
    # ピボットポイント設定
    # bpy.context.scene.tool_settings.transform_pivot_point = 'MEDIAN_POINT'        # オブジェクトの中点(複数オブジェクトの中心)
    # bpy.context.scene.tool_settings.transform_pivot_point = 'ACTIVE_ELEMENT'      # アクティブなオブジェクトの中心
    # bpy.context.scene.tool_settings.transform_pivot_point = 'CURSOR'              # 3Dカーソル位置
    # bpy.context.scene.tool_settings.transform_pivot_point = 'INDIVIDUAL_ORIGINS'  # 個々のオブジェクトの中心
    # bpy.context.scene.tool_settings.transform_pivot_point = 'BOUNDING_BOX_CENTER' # バウンディングボックスと呼ばれる枠の中心
    bpy.context.scene.tool_settings.transform_pivot_point = transform_pivot_point
    # 回転
    bpy.ops.transform.rotate(
        value=math.radians(radians_num)
    ,   orient_axis=orient_axis
    ,   orient_type=orient_type
    )
    # 元のモードに戻す
    bpy.ops.object.mode_set(mode=current_mode)

5行目 :
回転の軸を指定

6行目 :
回転軸がどの座標のことを指すのかを指定する
  • GLOBAL:シーン全体で固定されたX/Y/Z軸
  • LOCAL:オブジェクトが持つ内部の軸
  • NORMAL:面や辺の法線

20行目 :
思った通りにオブジェクトが回転しない場合は、オブジェクトを移動した際にオブジェクトの中心点が追従していないために意図通りの回転をしていないことがあるので、ここで選択しているオブジェクトの中心に回転の中心を移動させる

27行目 :
回転の中心を設定

17行目 :
▼active_element_select


30行目 :
回転角度を角度で設定できるように、ラジアン(弧度法)と度(度数法)の変換を行っている。


回転処理の使用例


キューブを生成して、Y軸方向に傾ける操作のDemoで使用例を示します。


Python :
def Base_create():
    # Mode 切り替え
    bpy.ops.object.mode_set(mode='OBJECT')

    # 立方体生成
    bpy.ops.mesh.primitive_cube_add(
        size=1              # 1ペンの長さ
    ,   location=(0, 0, 0)  # 配置場所
    ,   scale=(1,1,1)       # x, y, y サイズ x軸方向に1倍, y軸方向に1倍, z軸方向に1倍
    )
    bpy.context.object.name = "MyCube_001"

    # 回転
    object_rotate_func(
        object_list=["MyCube_001"]
    ,   transform_pivot_point="INDIVIDUAL_ORIGINS"
    ,   radians_num=45
    ,   orient_axis="Y"
    ,   orient_type="GLOBAL"
    )

Base_create()

ピボット:オブジェクトの中心
角度:45度
回転軸:Y軸
回転軸座標:グローバル


以上
このエントリーをはてなブックマークに追加
コメントを閉じる

コメント

コメントフォーム
記事の評価
  • リセット
  • リセット