Wie die meisten Webseiten nutzen wir Cookies. Nähere Informationen dazu, wie wir mit diesen Cookies umgehen, können Sie in unseren Datenschutzbestimmungen lesen.   Einverstanden
 
 

3D Forum > animierte Digitaluhr erstellen

animierte Digitaluhr erstellen

24.02.2021 18:53
 
PalaxSo. 28 Feb. 2021, 11:07 Uhr
Hallo Keks,

vielen Dank für Deine Unterstützung. Ich werde mir das jetzt in Ruhe ansehen. Bin allerdings absoluter Anfänger in diesen Dingen, daher kann es etwas dauern und meine Fragen besonders blöd erscheinen smile.

Viele Grüße

Peter
 
KullerkeksSo. 28 Feb. 2021, 16:25 Uhr
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 smile

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, sekunde

Wie 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.0

Wie 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/fps

Nun 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.0

Der 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
 
KullerkeksSo. 28 Feb. 2021, 21:56 Uhr
Weiter im Text, hab gerade noch etwas Zeit gehabt.

Wir haben nun den Wert für "uhrzeit", den wir in die Textsplines füttern wollen. Nehmen wir ihn auseinander!

Vom Ergebnis brauchen wir zuerst einmal die Stunden, die den ganzzahligen Teil von "uhrzeit" ausmachen. Hier hilft uns Python mit "trunc" aus der Mathe-Bibliothek. "trunc" kommt von "truncate", was "etwas abschneiden" bedeutet. In unserem Fall schneidet es alle Nachkommastellen ab. "trunc" rufen wir (vorerst) mit "math.trunc" auf.

stunde = math.trunc(uhrzeit)

Um nun die Minuten zu bestimmen, ermitteln wir den Nachkommateil mit "uhrzeit-stunde" und multiplizieren ihn mit 60.

rest1 = (uhrzeit-stunde)*60.0

Den Ganzzahlteil der Minuten gibt uns wieder "trunc":

minute = math.trunc(rest1)

Jetzt schnell noch die Sekunden ermitteln:

rest2 = (rest1-minute)*60.0
sekunde = math.trunc(rest2)


Natürlich kommt es nach dem Addieren vor, dass ein Wert einen unmöglichen Betrag erreicht, zum Beispiel, wenn wir zu 59 Sekunden eine weitere Sekunde hinzurechnen. Das gleichen wir jetzt aus.

Falls ein Sekundenwert 60 geworden ist, darf er noch nicht in Rente gehen, denn wir passen ihn an:

if sekunde==60:
sekunde = 0
minute +=1


Was heißt das? Wenn "sekunde" den Wert 60 hat, ist eine weitere Minute vorbei. Dann setzen wir "sekunde" auf den Wert 0 zurück, erhöhen aber gleichzeitig den Minutenwert um 1. "minute +=1" könnten wir auch als "minute = minute + 1" schreiben.

if minute==60:
minute = 0
stunde +=1

if stunde==24:
stunde = 0


Diese letzten Codezeilen schließen den Abgleich eventueller Überläufe ab. De Reihenfolge ist dabei essentiell, zuerst korrigieren wir die Sekunden, dann die Minuten und zuletzt die Stunden.

Als letzten Akt verbinden wir die Ausgänge des Python-Nodes mit den Text-Eingängen der Textsplines. Fertig.

Fragen, Ideen, Wünsche?
Versuche ich, im Rahmen meiner bescheidenen Kenntnisse und freien Zeit abzuarbeiten.

Der Keks
 
KullerkeksMo. 01 Mär. 2021, 00:31 Uhr
Bevor ich nicht mehr daran denke: die Formatierung!

Die Datei im ersten Teil des Tutorials wurde entsprechend aktualisiert. Zum Vergleich bleibt im Viewport oben die "alte" Darstellung erhalten. Die neuen Textstrings zu erzeugen und die Ausgangsports zu ergänzen sollte inzwischen kein Problem mehr sein (nicht vergessen, die globalen Variablen zu ergänzen!).

Was also machen wir, wenn eine Ausgabezahl einstellig ist? Die beste Lösung, die mir dazu einfiel, waren Strings.

Strings sind im Gegensatz zu Zahlenvariablen in der Lage, beliebige Textketten zu speichern. Wir wandeln zuerst einmal die numerischen Variablen stunde, minute und sekunde in Strings um:

stunde_t = str(stunde)
minute_t = str(minute)
sekunde_t = str(sekunde)


Optisch (wenn wir es ausgeben würden) sähe stunde_t genau wie stunde aus. Der Unterschied besteht allein im Datentyp - und was wir damit machen können.
Addieren wir 3 und 5 als numerische Variablen erhalten wir 8. Addieren wir 3 und 5 als Strings erhalten wir 35. Die Zeichen werden also unabhängig ihres eventuellen numerischen Wertes einfach aneinandergefügt. So könnten wir auch 3 und D als Strings zu 3D verketten. Strings können so gut wie jedes Zeichen enthalten.

if len(stunde_t)==1:
stunde_t = "0"+stunde_t

if len(minute_t)==1:
minute_t = "0"+minute_t

if len(sekunde_t)==1:
sekunde_t = "0"+sekunde_t


Diese Zeilen machen Folgendes:
Wenn die Länge (len) des Strings gleich 1 ist (also z. B. bei einer 3), wird diese 3 durch eine vorangestellte 0 ergänzt. Aus 3 wird 03, eine 14 würde unangetastet gelassen (denn 14 als String hat eine Zeichenlänge von 2).

Nun geben wir die Strings noch an die Textsplines und diesmal sind wir wirklich fertig smile

Der Keks


PS
Kommt es zu Rundungsfehlern (die Uhr geht einen Frame vor oder nach), Zeile 24 mit

sekunde = math.trunc(round(rest2,2))

ersetzen.
 
PalaxMo. 01 Mär. 2021, 06:42 Uhr
Hallo Keks,

vielen, vielen Dank für Deine Erläuterungen und die Zeit, welche Du Dir dafür genommen hast. Das hilft mit auf alle Fälle, um in das Thema einzutauchen und selbiges besser zu verstehen.

Damit Du siehst wofür das Ganze verwendet wird, hier einmal einen kleinen Einblick in mein kleines Projekt:

 
 
PalaxMo. 01 Mär. 2021, 06:49 Uhr
leider ist die Darstellungsqualität in diesem Bild nicht so gut wie im Original - was der deutlich niedrigeren Auflösung geschuldet ist. Der Rechner hat im Übrigen etwas mehr als eine Stunde gebraucht, um das Bild zu rendern (war dann 108 MB groß). Vermutlich hängt das mit den Spiegelungen im Glas zusammen.

Wenn ich diese Woche die Zeit finde, lade ich noch ein Bild des Rovers von außen hoch. Allerdings ist er noch nicht texturiert.

Viele Grüße

Peter
 
HerbieMo. 01 Mär. 2021, 12:18 Uhr
Schon vor vielen Jahren habe ich mich damit beschäftigt. Hier eine funktionierende XPresso-Schaltung:

 
GastMo. 01 Mär. 2021, 21:35 Uhr
Danke für eure Mühen, ich sehe mir das alles mal demnächst etwas näher an. Vielleicht kann ich die Anzeigetafel damit etwas aufpolieren.

LG Mahlstrom
 
KullerkeksDi. 02 Mär. 2021, 05:09 Uhr
Hallo Palax,
schönes Projekt hast du da in Arbeit.
Wenn du noch Hilfe brauchst (Anpassung, XPresso- oder Python-Tipp) frag ruhig. Es macht immer mal wieder Spaß, nach langer Pause wieder in Animationen reinzuschnuppern.

Der Keks
 
PalaxDi. 02 Mär. 2021, 06:49 Uhr
Hallo zusammen,

vielen Dank für Eure Unterstützung und Danke Herbie für die. Das hilft mir als Einsteiger in das Thema wirklich weiter. Hier das Bild des Rovers von außen. Er ist allerdings noch nicht texturiert und ich habe erst nach dem Rendern des Bildes gesehen, dass der Fuß durch die Wandung schaut . Da das Rednern des Bildes fast zwei Stunden gedauert hat, habe ich es so gelassen - ich denke Ihr seht mir das nach . Irgendwie kommt mir die Renderzeit - trotz 4k-Rendering echt lange vor.

Viele Grüße

Peter

 
 
 

 


 
 
© 3D-Ring - deutsche 3D Software Community, Archiv 2001 - 2006