Blender 3.4如何快速合并数千个圆柱、球体?Join()操作过慢
高效合并大量网格对象的Python方案(Blender 3.4+)
核心思路
避开依赖上下文的bpy.ops操作符(这类操作符会触发UI刷新、上下文验证等冗余步骤,大量对象时极慢),直接操作网格数据块,通过内存中批量合并顶点、边、面的方式完成,同时处理每个对象的空间变换。
实现代码
import bpy import bmesh def merge_large_number_of_objects(target_objects): # 过滤非网格对象 mesh_objects = [obj for obj in target_objects if obj.type == 'MESH'] if not mesh_objects: print("没有可合并的网格对象") return None # 创建空网格与对象 new_mesh = bpy.data.meshes.new(name="Merged_Mesh") new_obj = bpy.data.objects.new(name="Merged_Object", object_data=new_mesh) bpy.context.collection.objects.link(new_obj) # 初始化bmesh用于合并操作 bm = bmesh.new() for obj in mesh_objects: # 将对象网格导入bmesh,并应用世界空间变换(位置/旋转/缩放) bm.from_mesh(obj.data) bmesh.ops.transform(bm, matrix=obj.matrix_world, verts=bm.verts) # 将合并后的bmesh数据写入新网格 bm.to_mesh(new_mesh) bm.free() # 可选:删除源对象(取消注释启用) # for obj in mesh_objects: # bpy.data.objects.remove(obj) return new_obj # 使用示例:合并当前选中的所有对象 selected_objects = bpy.context.selected_objects merged_obj = merge_large_number_of_objects(selected_objects) if merged_obj: print(f"合并完成,新对象:{merged_obj.name}")
关键优化点
- 直接操作bmesh:跳过
bpy.ops的上下文开销,全程在内存中处理网格数据 - 空间变换处理:对每个对象的顶点应用世界矩阵,确保合并后位置、旋转、缩放完全正确
- 无冗余刷新:全程不触发UI更新,仅在最后将合并结果写入新对象
补充说明
- 若需保留材质、UV或顶点组:
- 材质:可收集所有源对象的材质槽,批量添加到新对象中,按需处理同名材质冲突
- UV/顶点组:
bm.from_mesh会自动导入这些数据,需注意同名数据的覆盖问题
- 针对100k级对象,建议分批次合并(比如每1000个对象合并为一个中间对象,再合并所有中间对象),避免内存占用过高
- 运行前建议关闭Blender的自动保存、实时视图刷新功能,进一步提升合并速度
内容的提问来源于stack exchange,提问作者tcd_abemis
相关产品推荐
相关产品推荐

