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.
- 00:00 - 01:40 Beispiele und Überblick
- 01:40 - 03:50 Kurze Erklärung, wie das Skript erweitert wird
- 03:50 - 05:30 Wie man den Pfad erstellt, an dem die Objekte platziert werden
- 05:30 - 12:10 Die World Matrix
- 12:10 - 17:30 Die Objekte entlang des Pfades anordnen
- 17:30 - 25:10 Vorteile von Linked Copys
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