円形にオブジェクトを配置する方法について調べました。
bpyにより定型文にしておけば、作業効率を上げつつワークフローが資産にもなるので備忘録的にまとめておきます。
動作確認環境 : Blender 4.2
Arrayモディファイアによる円形配置手順
円形にオブジェクトに配置する手順は以下です。
- Plain Axes(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行目 :
次の処理につなげるためにアクティブオブジェクトを指定しておきます。
以上