Dann will ich mal proaktiv sein und ein kleines Tutorial zur Szene bringen. Ich bin kein Python-Experte, ich nutze es lediglich, um mir die Arbeit etwas zu erleichtern. Darum sind meine Ausführungen auch nur persönliche Erfahrungen, aber bislang hat noch alles funktioniert
Die Szene im Anhang ist leicht "geupdatet" enthält einen "Fix" und den Code für eine bessere Formatierung.
Wer sich an XPresso rantraut, sollte sich auch nicht vor Python fürchten, jedenfalls nicht vor dem Level, der für diese Szene gefordert ist. Denn hier übenimmt Python lediglich die Funktion unzählicher Mathe- und Vergleichsnodes. Keine Gefahr, also rein in die Szene!
Wir wollen eine Digitaluhr animieren, von einem bestimmten Zeitpunkt an vorwärts. Dazu erzeugen wir ein paar Textsplines, die unsere Anzeige repräsentieren: eins für die Stunden, eins für die Minuten und eins für die Sekunden, dazu noch zwei mit Doppelpunkten als Trennzeichen.
Achtung! Im aktuellen Tutorial berücksichten wir nicht, dass bei den Zeitangaben einer Digitaluhr führende Nullen verwendet werden, also z. B. 09:05:06 Uhr statt 9:5:6 Uhr angezeigt wird. Das können wir später fixen (in der Szene geht es schon, die Erklärung kommt im dritten Teil des Kurz-Tuts).
Wir erzeugen ein XPresso-Tag (an welchem Objekt ist unerheblich) und fangen an, darin ein paar Nodes zu verteilen: drei Real-Konstanten und ein Time-Node. Die Konstanten nennen wir
start-stunde,
start-minute und
start-sekunde. Warum Real und nicht Integer, die Zahlen, die wir darin speichern, sind doch ganze Zahlen!? Wir werden mit diesen Zahlen im Python-Node allerdings wie mit reellen Zahlen rechnen, darum erzeugen wir sie gleich als solche.
Den Konstanten ordnen wir nun die gewünschte Startuhrzeit zu, im Beispiel
23,
59,
51.
Jetzt brauchen wir noch einen Time-Node mit zwei Ausgängen:
Frame und
Frames per second. Wozu? Später ...
Nun ist der gefürchtete Python-Node an der Reihe. Er bekommt die 5 Real-Eingänge
stunde_o,
minute_o,
sekunde_o,
frame und
fps, dann die 3 Integer-Ausgänge
stunde,
minute,
sekunde. Hier wird die Zieluhrzeit ausgegeben, fertige Zahlen, die einfach nur noch angezeigt werden, ohne weitere Rechnerei, daher passt Integer.
Und jetzt geht es wirklich los. Wie sieht der Code im Python-Node aus und warum?
Die erste Zeile lautet
import c4d, math. Damit stellt Python eine Reihe Funktionen zusätzlich zu seinen Grundfunktionen zur Verfügung. "
c4d" steht schon drin (wir brauchen es eigentlich nicht, da wir z. B. keine eigenen Objekte erzugen oder deren Eigenschaften verändern wollen), "
math" fügen wir hinzu.
Mit
def main() beginnt der eigentliche Code-Körper,
Unsere erste Aktion ist das Festlegen von ein paar globalen Variablen, das sind hier die Variablen für die Werte, die wir in den Node einlesen und ausgeben.
global stunde_o, minute_o, sekunde_o, stunde, minute, sekundeWie wollen wir nun vorgehen?
Wir haben eine Startuhrzeit und wollen diese innerhalb einer Animation verändern. Das heißt, wir nehmen diese Startuhrzeit, addieren die laufende Animationszeit und zeigen das Ergebnis an.
Nun basieren Uhrzeiten auf der Zahl 60, mit der es sich verdammt schlecht rechnen lässt. Gewohnt sind wir unser gutes, altes Dezimalsystem, also wandeln wir die Startuhrzeit in genau dieses Format um.
Die Startzeit ist also die in den Konstanten gespeicherte Stunde plus die Minuten geteilt durch 60 plus die Sekunden geteilt durch 3600 (60x60).
startzeit = stunde_o + minute_o/60.0 + sekunde_o/3600.0Wie wir sehen, ist die Schreibweise genau so, wie wir sie in der Schule gelernt haben, nichts davon ist Hexerei oder Raketenwissenschaft.
Der nächste Schritt ist, die bisher vergangene Animationszeit zu berechnen. Wir können hier "Echtzeit" verwenden, oder auch einen beliebigen Wert, damit die Uhrzeit schneller oder langsamer läuft. Die Variable nennen wir "animzeit", wir zählen sie in Sekunden. Wäre "animzeit = frame", würde die Uhr mit jedem neuen Bild um eine Sekunde weitergehen. Um die Uhr mit der "Echtzeit" zu synchronisieren, müssen wir also "frame" (die aktuelle Bildnummer) durch "fps" (Anzahl der Bilder je Sekunde) teilen.
animzeit = frame/fpsNun ermitteln wir die neue Uhrzeit für die Anzeige. Dazu Addieren wir unsere Startuhrzeit und die aktuelle Animationszeit. Dabei teilen wir die Animationszeit, die in Sekunden vorliegt, durch 3600, um sie in Stunden umzurechnen (ihr erinnert euch, die Startuhrzeit liegt in Stunden mit Nachkommastellen im Dezimalformat vor).
uhrzeit = startzeit + animzeit/3600.0Der Rest ist lediglich ein Zurückrechnen auf Stunden, Minuten und Sekunden, wenn ihr wollt, reiche ich die Erklärung dazu noch nach, aber jetzt ist erst mal weiter Sonntag.
BB
Der Keks