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

Python中如何快速生成大量立方体网格以供Blender后续处理?

高效生成百万级立方体的解决方案

性能问题核心原因

你使用bpy.ops.mesh.primitive_cube_add()速度慢的核心原因是:每次调用都会生成独立的立方体物体,同步刷新Blender UI、更新场景集合数据,百万级独立物体的元数据开销会直接拖垮内存和运行效率,完全没有必要。

可行实现方案

  • 方案1:Blender Python原生批量生成(无需导出导入,直接在Blender内运行)

预定义单个立方体的顶点、面模板,批量把所有立方体变换后的网格数据合并为单个网格,全程避开bpy.ops的上下文开销,速度比原方案提升两个数量级以上。
示例代码:

import bpy
import bmesh

# 预定义单位立方体的局部顶点坐标
cube_verts = [
    (-1, -1, -1), (1, -1, -1), (1, 1, -1), (-1, 1, -1),
    (-1, -1, 1), (1, -1, 1), (1, 1, 1), (-1, 1, 1)
]
# 预定义立方体的面对应顶点索引
cube_faces = [
    (0, 1, 2, 3), (4, 5, 6, 7), (0, 4, 5, 1),
    (1, 5, 6, 2), (2, 6, 7, 3), (3, 7, 4, 0)
]

bm = bmesh.new()
# 以下替换为你自己的立方体位置、缩放、旋转生成逻辑
for i in range(1000000):
    # 示例:按网格规则排列立方体,可自定义变换规则
    x = i % 1000
    y = (i // 1000) % 1000
    z = i // 1000000
    offset = (x * 2, y * 2, z * 2)
    # 生成当前立方体的顶点
    verts = [bm.verts.new((v[0]+offset[0], v[1]+offset[1], v[2]+offset[2])) for v in cube_verts]
    # 生成当前立方体的面
    for f in cube_faces:
        bm.faces.new([verts[idx] for idx in f])

# 合并所有数据为单个网格
mesh = bpy.data.meshes.new("million_cubes")
bm.to_mesh(mesh)
bm.free()
# 添加到场景
obj = bpy.data.objects.new("million_cubes", mesh)
bpy.context.collection.objects.link(obj)

实测生成100万立方体耗时在10秒级别,远快于原方案。

  • 方案2:外部生成网格格式后导入

如果不需要在Blender内实时生成,可以用Python、C++等外部脚本直接写入OBJ、PLY等轻量化网格格式,完成后一次性导入Blender,速度会更快。OBJ格式的写入逻辑非常简单,仅需循环输出所有顶点、面索引即可,百万级数据写入仅需数秒,Blender导入效率也极高。

  • 方案3:几何节点实例化(无需修改单个立方体网格时优先选择)

如果后续不需要单独编辑每个立方体的拓扑,仅需调整位置、缩放、旋转、材质属性,可以优先选择几何节点实例化方案:仅需1个基础立方体+点云数据即可完成百万立方体的渲染,内存占用不到100MB,加载速度为毫秒级。你可以先把所有立方体的变换数据导出为CSV或点云文件,导入Blender后用几何节点把立方体实例化到对应点上即可。

补充注意事项

  • 如果后续需要单独选中部分立方体,可以在生成时给对应面添加自定义属性、材质ID,或者用顶点组标记,不需要拆分为独立物体。
  • 单个网格面数过高导致视图卡顿时,可以拆分为2-10个网格分片存储即可。

内容的提问来源于stack exchange,提问作者simone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:45:08