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

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更新,仅在最后将合并结果写入新对象

补充说明

  1. 若需保留材质、UV或顶点组:
    • 材质:可收集所有源对象的材质槽,批量添加到新对象中,按需处理同名材质冲突
    • UV/顶点组:bm.from_mesh会自动导入这些数据,需注意同名数据的覆盖问题
  2. 针对100k级对象,建议分批次合并(比如每1000个对象合并为一个中间对象,再合并所有中间对象),避免内存占用过高
  3. 运行前建议关闭Blender的自动保存、实时视图刷新功能,进一步提升合并速度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:22:10