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
相关产品推荐
相关产品推荐

