我正在尝试编写一个Blender python脚本,该脚本复制一个对象,然后更新约束,以使icosphere.002
具有与Cube.002
相同的旋转度
该循环需要重复421
次。然而,当涉及到第十个循环时,该值变为.0010
。但是,如果我将对象约束从Cube.00
更改为Cube.
,它将尝试寻找Cube.1
import bpy
for i in range(1, 421):
bpy.ops.object.duplicate_move_linked(
OBJECT_OT_duplicate={"linked": True, "mode": 'TRANSLATION'},
TRANSFORM_OT_translate={
"value": (0, 0, 0),
"constraint_axis": (False, False, False),
"constraint_orientation": 'GLOBAL',
"mirror": False,
"proportional": 'DISABLED',
"proportional_edit_falloff": 'SMOOTH',
"proportional_size": 1,
"snap": False,
"snap_target": 'CLOSEST',
"snap_point": (0, 0, 0),
"snap_align": False,
"snap_normal": (0, 0, 0),
"gpencil_strokes": False,
"texture_space": False,
"remove_on_cancel": False,
"release_confirm": False,
"use_accurate": False
})
bpy.context.object.constraints["Copy Rotation"].target = (
bpy.data.objects["Cube.00" + str(i)])
答案 0 :(得分:1)
您可以使用["Cube.{0:03}".format(i)]
,它将填充必要数量的零(在这种情况下为3),例如:
>>> "Cube.{0:03}".format(1)
'Cube.001'
>>> "Cube.{0:03}".format(12)
'Cube.012'
>>> "Cube.{0:03}".format(123)
'Cube.123'
在Python 3.6及更高版本中,您可以这样做(f字符串,请参见PEP 498):
f"Cube.{i:03}" # where i is your index variable
答案 1 :(得分:0)
由于在复制对象时您没有对它们做任何事情,因此您不需要使用大多数默认选项。复制对象后,它将成为活动对象,因此您可以从bpy.context.object.name[-3:]
获得其数字后缀。
import bpy
cntxt = bpy.context
objlist = bpy.data.objects
for i in range(420):
bpy.ops.object.duplicate(linked=True)
suffix = cntxt.object.name[-3:]
cntxt.object.constraints['Copy Rotation'].target = objlist['Cube.'+suffix]
您可以命名第一个对象Cube.000
,以使后缀始终可用。
还要注意的是运算符add extra overhead,因此特别是对于长循环而言,最好直接使用数据。请注意,创建项目直接为您提供了创建的项目,而运算符使您仅依赖上下文,这意味着您将更少地依赖命名,而更多地依赖于所创建的确切项目。
import bpy
scn = bpy.context.scene
objlist = bpy.data.objects
obj = objlist['Icosphere.000']
for i in range(420):
new_obj = obj.copy()
new_obj.data = obj.data.copy()
scn.objects.link(new_obj)
cr = new_obj.constraints.new('COPY_ROTATION')
cr.target = objlist['Cube.{0:03}'.format(i)]