问题
当同一个模型交给另外的上下游调整之后,由于模型新增了顶点组,需要做顶点组的数据传递
脚本
import bpy import bmesh
def transfer_vertex_groups(source_obj, target_obj): """ 将源物体的顶点组信息传递给目标物体 :param source_obj: 源物体(包含顶点组) :param target_obj: 目标物体(将接收顶点组) """ if not (source_obj and target_obj) or source_obj.type != 'MESH' or target_obj.type != 'MESH': print("错误:需要两个有效的网格物体") return
bpy.ops.object.mode_set(mode='OBJECT')
bm_source = bmesh.new() bm_source.from_mesh(source_obj.data) bm_source.verts.ensure_lookup_table()
bm_target = bmesh.new() bm_target.from_mesh(target_obj.data) bm_target.verts.ensure_lookup_table()
if len(bm_source.verts) != len(bm_target.verts): print("警告:顶点数量不匹配,可能无法精确传递")
for vg_src in source_obj.vertex_groups: vg_dst = target_obj.vertex_groups.get(vg_src.name) if not vg_dst: vg_dst = target_obj.vertex_groups.new(name=vg_src.name)
for i, vert_src in enumerate(bm_source.verts): if i >= len(bm_target.verts): break
try: weight = vg_src.weight(vert_src.index) vg_dst.add([bm_target.verts[i].index], weight, 'REPLACE') except: pass
bm_source.free() bm_target.free()
print(f"顶点组数据已从 {source_obj.name} 传递到 {target_obj.name}")
if len(bpy.context.selected_objects) == 2: source = bpy.context.selected_objects[0] target = bpy.context.selected_objects[1] transfer_vertex_groups(source, target) else: print("请先选择两个网格物体(先选源物体,再选目标物体)")
|
需要选中源物体(from),然后选择目标物体(To)
脚本中包含了一个
可以选择是否清除原本的顶点组,或是直接同步/追加当前的顶点组