Blender Python中循环创建桌子重叠问题求助(附代码)
问题分析与修正代码
核心问题
所有桌子重叠的原因是**table_pos没有在循环内更新**:你在循环外把table_pos定义成了固定元组(x,y,z),之后循环里修改x和y的值,但table_pos不会自动同步变化,每次创建桌子都用初始位置(1,1,1),自然会重叠。另外循环里的i +=1完全多余,for i in range(5)会自动完成迭代计数。
修正后的代码
import bpy # 清空场景 bpy.ops.object.select_all(action='SELECT') bpy.ops.object.delete(use_global=False) table_size = (10, 10) # x、y方向的宽和长 x = 1 y = 1 z = 1 leg_len = 8 leg_thickness = 1 leg_pos = (table_size[0]- leg_thickness, table_size[1]- leg_thickness, -(leg_len)) for i in range(5): # 每次循环都用当前x、y值更新table_pos table_pos = (x, y, z) # 创建桌面 bpy.ops.mesh.primitive_cube_add(size=2, location = table_pos) bpy.ops.transform.resize(value=(table_size[0], table_size[1], 0.2)) # 创建四条桌腿 bpy.ops.mesh.primitive_cylinder_add(location= table_pos) bpy.ops.transform.resize(value=(leg_thickness, leg_thickness, leg_len)) bpy.ops.transform.translate(value=(-leg_pos[0], leg_pos[1], leg_pos[2])) bpy.ops.mesh.primitive_cylinder_add(location=table_pos) bpy.ops.transform.resize(value=(leg_thickness, leg_thickness, leg_len)) bpy.ops.transform.translate(value=(leg_pos[0], leg_pos[1], leg_pos[2])) bpy.ops.mesh.primitive_cylinder_add(location=table_pos) bpy.ops.transform.resize(value=(leg_thickness, leg_thickness, leg_len)) bpy.ops.transform.translate(value=(leg_pos[0], -leg_pos[1], leg_pos[2])) bpy.ops.mesh.primitive_cylinder_add(location=table_pos) bpy.ops.transform.resize(value=(leg_thickness, leg_thickness, leg_len)) bpy.ops.transform.translate(value=(-leg_pos[0], -leg_pos[1], leg_pos[2])) print("当前桌子位置: ", table_pos) print("当前x、y值: ", x, y) # 更新下一张桌子的位置 x += 10 y += 10
额外优化建议
用bpy.ops操作虽然直观,但批量创建物体时效率较低,推荐直接通过bpy.data创建物体并修改属性,避免依赖上下文:
import bpy # 清空场景 bpy.ops.object.select_all(action='SELECT') bpy.ops.object.delete(use_global=False) table_size = (10, 10) x = 1 y = 1 z = 1 leg_len = 8 leg_thickness = 1 leg_offset = (table_size[0]- leg_thickness, table_size[1]- leg_thickness, -leg_len) for _ in range(5): # 创建桌面 bpy.data.meshes.new(name="TableTop") table_top = bpy.data.objects.new("TableTop", bpy.data.meshes["TableTop"]) bpy.context.collection.objects.link(table_top) bpy.ops.object.select_all(action='DESELECT') table_top.select_set(True) bpy.context.view_layer.objects.active = table_top bpy.ops.mesh.primitive_cube_add(size=2, location=(x,y,z)) table_top.scale = (table_size[0], table_size[1], 0.2) # 创建桌腿 leg_locations = [ (x - leg_offset[0], y + leg_offset[1], z + leg_offset[2]), (x + leg_offset[0], y + leg_offset[1], z + leg_offset[2]), (x + leg_offset[0], y - leg_offset[1], z + leg_offset[2]), (x - leg_offset[0], y - leg_offset[1], z + leg_offset[2]), ] for idx, loc in enumerate(leg_locations): bpy.data.meshes.new(name=f"TableLeg_{idx}") leg = bpy.data.objects.new(f"TableLeg_{idx}", bpy.data.meshes[f"TableLeg_{idx}"]) bpy.context.collection.objects.link(leg) leg.location = loc leg.scale = (leg_thickness, leg_thickness, leg_len) x += 10 y += 10
内容的提问来源于stack exchange,提问作者Yahya
相关产品推荐
相关产品推荐

