2016-12-05 3 views
0

Ich verwende Blender, um ein menschliches Modell zu erstellen, und ich habe zwei Modelle, von denen eines mit einer Liste von Scheitelpunktgruppen und eine andere Kopie des gleichen Modells mit einer anderen Gruppe von Scheitelpunktgruppen versehen ist. Ich frage mich, ob es überhaupt eine Kopie des gleichen Modells mit diesen beiden Gruppen von Vertexgruppen gibt. Oder eine Möglichkeit, die Scheitelpunktgruppen von einem Modell in ein anderes zu kopieren, ohne die bereits vorhandenen Scheitelpunktgruppen zu ersetzen.Wie Scheitelpunktgruppen von einem Objekt zu einem anderen hinzufügen, ohne sie zu ersetzen?

+0

Tut [diese Hilfe] (http://blender.stackexchange.com/a/16273/935)? – sambler

+0

Dies ersetzt die Scheitelpunktgruppe in einer mit denen in dem anderen Objekt ... Ich möchte an die vorhandenen Scheitelpunktgruppen anhängen oder hinzufügen – NikhilSN

Antwort

0

Im Mixer ist ein Addon enthalten, das Vertex-Gewichte vom aktiven Objekt in die anderen ausgewählten Objekte kopieren kann. Wie Sie erwähnen, überschreibt das Addon vorhandene Scheitelgewichtungen mit übereinstimmenden Namen.

Indem ich den Code nehme, der die Kopie des Scheitelwerts aus dem Addon macht und eine kleine Anpassung vornimmt, so dass ein neuer Name für die Zielknotengruppe verwendet wird, wenn der Name bereits existiert, bekomme ich das folgende kleine Skript.

Fügen Sie es in Blenders text editor und klicken Sie auf Skript ausführen. Die Scheitelpunktgruppen in active object werden in andere ausgewählte Objekte kopiert.

import bpy 

active = bpy.context.active_object 

for ob in bpy.context.selected_objects: 
    me_source = active.data 
    me_target = ob.data 

    # sanity check: do source and target have the same amount of verts? 
    if len(me_source.vertices) != len(me_target.vertices): 
     print('ERROR: objects {} and {} have different vertex counts.'.format(active.name,ob.name)) 
     continue 

    vgroups_IndexName = {} 
    for i in range(0, len(active.vertex_groups)): 
     groups = active.vertex_groups[i] 
     vgroups_IndexName[groups.index] = groups.name 
    data = {} # vert_indices, [(vgroup_index, weights)] 
    for v in me_source.vertices: 
     vg = v.groups 
     vi = v.index 
     if len(vg) > 0: 
      vgroup_collect = [] 
      for i in range(0, len(vg)): 
       vgroup_collect.append((vg[i].group, vg[i].weight)) 
      data[vi] = vgroup_collect 
    # write data to target 
    if ob != active: 
     # add missing vertex groups 
     for vgroup_idx, vgroup_name in vgroups_IndexName.items(): 
      #check if group already exists... 
      already_present = 0 
      for i in range(0, len(ob.vertex_groups)): 
       if ob.vertex_groups[i].name == vgroup_name: 
        vgroup_name = vgroup_name+'_from_'+active.name 
        vgroups_IndexName[vgroup_idx] = vgroup_name 
      # ... if not, then add 
      if already_present == 0: 
       ob.vertex_groups.new(name=vgroup_name) 
     # write weights 
     for v in me_target.vertices: 
      for vi_source, vgroupIndex_weight in data.items(): 
       if v.index == vi_source: 

        for i in range(0, len(vgroupIndex_weight)): 
         groupName = vgroups_IndexName[vgroupIndex_weight[i][0]] 
         groups = ob.vertex_groups 
         for vgs in range(0, len(groups)): 
          if groups[vgs].name == groupName: 
           groups[vgs].add((v.index,), 
            vgroupIndex_weight[i][1], "REPLACE") 
+0

Danke für Ihre Hilfe: D – NikhilSN

Verwandte Themen