円形にオブジェクトを配置する方法について調べました。

bpyにより定型文にしておけば、作業効率を上げつつワークフローが資産にもなるので備忘録的にまとめておきます。


動作確認環境 : Blender 4.2


Arrayモディファイアによる円形配置手順


円形にオブジェクトに配置する手順は以下です。
  1. Plain Axes(Empty)オブジェクトの追加
  2. Emptyオブジェクトを回転
  3. Arrayモディファイアでオブジェクトを配置
ここで追加したEmptyオブジェクトを中心として円形に配置されます。オブジェクトの配置間隔は、Emptyオブジェクトの回転角度によって指定します。

Arrayモディファイアについては以下の記事も参照してみてください。

▼配列(Array)モディファイア基本


Emptyオブジェクトは、「Shift+A」→「Empty」→「Plain  axes」から追加できます。

以下はbpyでEmptyオブジェクトのPlain  axesを追加する例です。

Python :
bpy.ops.object.empty_add(
        type='PLAIN_AXES'
    ,   align='WORLD'
    ,   location=(0, 0, 0)
    ,   scale=(1, 1, 1)
)



bpyによるオブジェクト円形配置実装例


ArrayモディファイアとEmptyオブジェクトを用いたICO球の円形配置例を次に示します。

Python :
def Base_create():
    bpy.ops.object.mode_set(mode='OBJECT')

    # ICO球追加
    bpy.ops.mesh.primitive_ico_sphere_add(
        radius=1
    ,   enter_editmode=False
    ,   align='WORLD'
    ,   location=(2, 2, 0)
    ,   scale=(0.5, 0.5, 0.5)
    )
    # 名前設定
    bpy.context.object.name = "sphere_00"

    # Shift+A -> Empty -> Plain axes
    bpy.ops.object.empty_add(
        type='PLAIN_AXES'
    ,   align='WORLD'
    ,   location=(0, 0, 0)
    ,   scale=(1, 1, 1)
    )
    # 回転
    # 隣り合うオブジェクト幅設定
    object_rotate_func(
        object_list=["Empty"]
    ,   transform_pivot_point="CURSOR"
    ,   radians_num=20                  # 360°を整数で割り切れる数にする 360/20=18
    ,   orient_axis="Z"
    ,   orient_type="GLOBAL"
    )

    # アクティブオブジェクト
    active_element_select(object_name_list=["sphere_00"])

    # 配列モディファイア追加
    bpy.ops.object.modifier_add(type='ARRAY')
    # モディファイア名変更
    bpy.context.object.modifiers["Array"].name = "Array_00"
    # Relative Offset -> False
    bpy.context.object.modifiers["Array_00"].use_relative_offset = False
    # Object Offset -> True
    bpy.context.object.modifiers["Array_00"].use_object_offset = True
    # 基準Object
    bpy.context.object.modifiers["Array_00"].offset_object = bpy.data.objects["Empty"]
    # 複製個数
    bpy.context.object.modifiers["Array_00"].count = 18

    # All Transforms(全トランスフォーム)
    bpy.ops.object.transform_apply(
        location=True               # オブジェクト位置適用
    ,   rotation=True               # オブジェクト回転適用
    ,   scale=True                  # オブジェクトスケール適用
    )
    # モディファイア適用
    bpy.ops.object.modifier_apply(modifier="Array_00")

    # オブジェクト削除
    active_element_select(object_name_list=["Empty"])
    # オブジェクト削除
    bpy.ops.object.delete()

    # アクティブオブジェクト選択
    myobject = bpy.data.objects.get("sphere_00")
    myobject.select_set(True)  # 選択
    # アクティブオブジェクト
    bpy.context.view_layer.objects.active = myobject

Base_create()

24行目 :
▼object_rotate_func


27行目 :
オブジェクトを何度ずらして配置するかを指定します。

33行目 :
▼active_element_select


58行目 :
オブジェクトの配置に用いた"Empty"オブジェクトは必要なくなったので削除しておきます。

63行目 :
次の処理につなげるためにアクティブオブジェクトを指定しておきます。


以上

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

コメント

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