Ich habe es endlich geschafft den 2. Teil von ARewO hochzuladen. Das Script ist jetzt in der Lage die Duplikate entlang eines Pfades zu platzieren und Armatures zu verwenden.

Falls Du den 1. Teil noch nicht gesehen hast, würde ich empfehlen, dies zu tun.

Hier ist das Skript:

  1. import bpy
  2. import math
  3.  
  4. loops = 30
  5. distanceX = 0
  6. distanceY = 0.4
  7. distanceZ = 0
  8. offset = 6
  9. offset_extra = 0
  10.  
  11. arm = bpy.context.active_object
  12. kinder = bpy.context.selected_objects
  13. placer = bpy.data.objects['Placer']
  14.  
  15. for i in range(loops):
  16. print(str(i))
  17. bpy.ops.object.duplicate_move(OBJECT_OT_duplicate={"linked":True})
  18. bpy.context.scene.frame_set(i)
  19. bpy.ops.object.make_single_user(type = 'SELECTED_OBJECTS', object = False, obdata = False, material = False, texture = False, animation = True)
  20. bpy.ops.object.select_all(action = 'DESELECT')
  21. for j in range(3):
  22. arm.location[j] = placer.matrix_world[j][3]
  23. animData = arm.animation_data
  24. action = animData.action
  25. fcurves = action.fcurves
  26. for k in range(len(kinder)):
  27. kinder[k].select = True
  28. for curve in fcurves:
  29. keyframePoints = curve.keyframe_points
  30. for keyframe in keyframePoints:
  31. keyframe.co[0] += offset #verschieben
  32. keyframe.handle_left[0] += offset
  33. keyframe.handle_right[0] += offset
  34. print("done")

Und hier die Erklärung:

  1. arm = bpy.context.active_object
  2. kinder = bpy.context.selected_objects
  3. placer = bpy.data.objects['Placer']
Das sind die wichtingen Variablen. Arm ist die Armature, sie muss dementsprechend das aktive Objekt sein, wenn man auf "run script" drückt. Kinder sind alle angewählten Objekte. Placer ist ein Objekt, dass sich durch den Raum bewegen sollte. Es muss also ein Objekt in der Szene existieren, das "Placer" heißt.

  1. for i in range(loops):
  2. print(str(i))
  3. bpy.ops.object.duplicate_move(OBJECT_OT_duplicate={"linked":True})
  4. bpy.context.scene.frame_set(i)
Dieser Teil ruft eine For-Schleife so oft auf, wie wir am Anfang "loops" deklariert haben.
Wir wollen eine "linked-copy", falls wir noch etwas an dem Objekt ändern möchten und da linked Datablocks wesentlich schneller rendern.

  1. bpy.ops.object.make_single_user(type = 'SELECTED_OBJECTS', object = False, obdata = False, material = False, texture = False, animation = True)
Die Animation kann allerdings nicht linked sein. Sonst würden die Keyframes jedesmal für alle Objekte verschoben werden, also müssen wir die Animation einen single user machen.

  1. for j in range(3):
  2. arm.location[j] = placer.matrix_world[j][3]]
Dieser Part ist etwas trickreich. Versucht mal ein Objekt an ein Empty zu parenten. Danach merkt ihr euch seine Position und bewegt das Empty. Die Position des Objekts im Raum ist eine andere, aber die im "n-menu" ist immer noch die selbe. Wenn ihr ein Objekt anwählt und in der Konsole C.active_object.matrix_world eingebt, seht ihr, dass die Matrix ein zweidimensionales Array ist. Deshalb benötigt sie 2 Indices.
for j in range(3) gibt also 3 mal die 4. Koordinate an, was für x, y und z der World Location steht.

  1. animData = arm.animation_data
  2. action = animData.action
  3. fcurves = action.fcurves
Das sind 3 Hilfsvariablen, die es leichter machen den Code nachzuvollziehen. Mann könnte auch alles in eine Zeile schreiben.

  1. for k in range(len(kinder)):
  2. kinder[k].select = True
Kinder ist die Variable, die oben angegeben wurde, also alle Objekte, die angewählt waren.

  1. for curve in fcurves:
  2. keyframePoints = curve.keyframe_points
  3. for keyframe in keyframePoints:
  4. keyframe.co[0] += offset #verschieben
  5. keyframe.handle_left[0] += offset
  6. keyframe.handle_right[0] += offset

Dieser Teil geht alle f-curves durch und darin jeweils alle Keyframes und verschiebt diese in x (Zeit) um den Wert, den wir oben angegeben haben.
  1. print("done")
Diese Zeile gibt an, dass unser Skript mit chirurgischer Präzision funktioniert hat.
Viel Spass beim Animieren, schickt uns links zu euren Verwendungen für ARewO.

Die fertige Blender-Datei gibt es hier zum Herunterladen