You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:31:18