Der Animation Replicator with Offset Teil 2

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:
[code:python]import bpy
import math

loops = 30
distanceX = 0
distanceY = 0.4
distanceZ = 0
offset = 6
offset_extra = 0

arm = bpy.context.active_object
kinder = bpy.context.selected_objects
placer = bpy.data.objects['Placer']

for i in range(loops):
    print(str(i))
    bpy.ops.object.duplicate_move(OBJECT_OT_duplicate={"linked":True})
    bpy.context.scene.frame_set(i)
    bpy.ops.object.make_single_user(type = 'SELECTED_OBJECTS', object = False, obdata = False, material = False, texture = False, animation = True)
    bpy.ops.object.select_all(action = 'DESELECT')
    for j in range(3):
        arm.location[j] = placer.matrix_world[j][3]
    animData = arm.animation_data
    action = animData.action
    fcurves = action.fcurves
    for k in range(len(kinder)):
        kinder[k].select = True
    for curve in fcurves:     
        keyframePoints = curve.keyframe_points
        for keyframe in keyframePoints:
            keyframe.co[0] += offset #verschieben
            keyframe.handle_left[0] += offset
            keyframe.handle_right[0] += offset
print("done")[/code]

Und hier die Erklärung:
[code:python]arm = bpy.context.active_object
kinder = bpy.context.selected_objects
placer = bpy.data.objects['Placer'][/code]Das sind die wichtigen 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, das sich durch den Raum bewegen sollte. Es muss also ein Objekt in der Szene existieren, das "Placer" heißt.

[code:python]for i in range(loops):
    print(str(i))
    bpy.ops.object.duplicate_move(OBJECT_OT_duplicate={"linked":True})
    bpy.context.scene.frame_set(i)[/code]Dieser Teil ruft so oft eine For-Schleife 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.

[code:python]    bpy.ops.object.make_single_user(type = 'SELECTED_OBJECTS', object = False, obdata = False, material = False, texture = False, animation = True)[/code]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.

[code:python]    for j in range(3):
        arm.location[j] = placer.matrix_world[j][3]][/code]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 dieselbe. 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.

[code:python]    animData = arm.animation_data
    action = animData.action
    fcurves = action.fcurves[/code]Das sind 3 Hilfsvariablen, die es leichter machen, den Code nachzuvollziehen. Mann könnte auch alles in eine Zeile schreiben.

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

[code:python]    for curve in fcurves:     
        keyframePoints = curve.keyframe_points
        for keyframe in keyframePoints:
            keyframe.co[0] += offset #verschieben
            keyframe.handle_left[0] += offset
            keyframe.handle_right[0] += offset[/code]
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.
[code:python]print("done")[/code]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