Mit TigerJython kann man mit wenig Aufwand eine Animationssequenz in einer Video-Datei im MP4-Format abspeichern. Diese Video-Datei kann mit einem beliebigen MP4-Player abgespielt werden (VLC Media Player, Quick-Time-Player oder Video-Apps auf Smartphones, leider nicht mit dem aktuellen Windows Media Player).
Üblicherweise werden 25 Bilder pro Sekunden abgespielt. Beim Erzeugen der Bilder spielt es aber keine Rolle, wie lange die Berechnung eines einzelnen Bildes mit dem Computer dauert. Mit einem Video-Player werden die Bilder automatisch auf dem Bildschirm gerendert und Bild um Bild flackerfrei abgespielt.
Beispiel 1: Das Zeichnen eines Sternes wird aufgenommen und als mp4-Video gespeichert
Man erzeugt zuerst ein VideoRecorder-Objekt, welches sich mit getFrame() auf das aktuelle Turtlefenster bezieht.
rec = VideoRecorder(getFrame(), "star.mp4", "320x240", -140, -60)
Mit dem dritten Parameter wird die Video-Auflösung festgelegt, in diesem Beispiel ist die Auflösung 320x240. Auch folgende Auflösungen können gewählt werden: 640x480, 720x480, 800x600, 1280x720, 960x540, 1280x1024, 1920x1080. Da die Grösse des Turtlefensters (hier 600x600) in der Regel mit der Video-Auflösung (Grösse des Videofensters) nicht übereinstimmt, muss man mit den letzten zwei Parametern den Bereich im Turtlefenster wählen, der aufgenommen wird. Der Bezugspunkt ist die linke, obere Ecke des Aufnahmefensters. |
# VideoEx1.py from gturtle import * makeTurtle() rec = VideoRecorder(getFrame(), "star.mp4", "320x240", -140, -90) repeat 9: forward(150) left(160) rec.captureImage(10) rec.finish() print("all done") |
Programmcode markieren
|
Erklärungen zum Programmcode:
rec = VideoRecorder() : erzeugt ein VideoRecorder-Objekt | |
rec.captureImage(5) : die Aufnahme wird nach jeder gezeichneter Linie vorgenommen, wobei hier jeweils 5 gleiche Bilder aufgenommen werden. Da 25 Bilder pro Sekunde abgespielt werden, Sind 25/5 = 5 neue Linien proSekunde sichtbar. | |
rec.finish() : beendet die Aufnahme |
Beispiel 2: Random Walk mit Video-Recorde aufnehmen
Random Walk (siehe Kapitel Zufallszahlen) wird in einer Videodatei gespeichert. Die Turtle startet an der Home-Position und bewegt sich wiederholt um 20 Schritte in einer beliebigen Richtung. Die Aufnahme wird beendet, wenn die Turtle zum ersten Mal den Rand des Geheges erreicht. Die Aufnahmeeinstellungen sind viel einfacher, wenn die Grösse des Turtlefensters mit der Grösse des Videofensters übereinstimmt. Mit dem Befehl Options.setPlaygroundSize(640, 480) kann nach dem Programmstart die Grösse des Turtlefensters geändert werden. Wenn die gleiche Videoauflösung vorliegt, so wird das ganze Turtlefenster aufgenommen und eine Positionierung des Aufnahmefensters ist nicht mehr notwendig. |
Bei der Programmausführung ist es wichtig abzuwarten, bis das Programm beendet ist und im unteren Teil des TigerJython-Fensters all done erscheint. Erst dann ist die Aufnahme beendet und die Videodatei korrekt gespeichert. Man soll daher keine Programme mit einer endlosen while-Schleife mit einem Video-Rekorder aufnehmen. Beim Random Walk erreicht die Turtle trotz der Zufallsbewegung irgendwann den Rand des Geheges, manchmal muss man ein wenig Geduld haben.
# VideoEx2.py from gturtle import * import random Options.setPlaygroundSize(640, 480) makeTurtle() rec = VideoRecorder(getFrame(), "randomwalk.mp4", "640x480") hideTurtle() dot(10) openDot(400) n = 0 r = 0 while r < 200: z = random.random() angle = z * 360 heading(angle) forward(20) r = distance(0, 0) print("Steps: " + str(n)) n += 1 rec.captureImage(3) rec.finish() print("all done") |
Programmcode markieren
|
Erklärungen zum Programmcode:
Options.setPlaygroundSize(640, 480): setzt die Grösse des Turtlefensters auf die gegebene Grösse | |
rec.captureImage(3): damit das Zeichnen nicht zu schnell erfolgt, werden jeweils 3 gleiche Bilder aufgenommen |
Beispiel 3: Vogelflug mit Video-Recorder aufnehmen
In der Computeranimation, die im vorhergehenden Kapitel einen Vogelflug darstellt (Beispiel 3), musste man mit mehreren Tricks dafür sorgen, dass die animierte Grafik nicht flackert. Bei einer Videoaufnahme sind die Befehle enableRepaint(False), repaint() und delay() nicht notwendig. Obwohl das Bild bei der Aufnahme flackert, ist die Wiedergabe der Video-Datei mit einem Videoplayer einwandfrei. Bei der Programmausführung ist es wichtig abzuwarten, bis das Programm beendet ist und im TigerJython-Fenster all done erscheint. |
# VideoEx3.py from gturtle import * def drawBird(angle): dot(20) right(angle) rightArc(80, 90) home() left(angle) leftArc(80, 90) home() def move(start, end, step): for a in range(start, end, step): clear("lightSkyBlue") drawBird(a) rec.captureImage() Options.setPlaygroundSize(320, 240) t = makeTurtle() rec = VideoRecorder(t, "bird.mp4", "320x240") hideTurtle() setPenWidth(5) setPenColor("black") for i in range(4): move(55, 5, -2) move(5, 55, 2) rec.finish() print("all done") |
Programmcode markieren
|
Erklärungen zum Programmcode:
Options.setPlaygroundSize(320, 240): setzt die Grösse des Turtlefensters auf die gegebene Grösse | |
for i in range(4): move(55, 5, -2) move(5, 55, 2) : wiederholt die Flügelbewegungen 4-mal |
Beispiel 4: Käferproblem
In einem TurtleFrame werden 4 Turtles erzeugt und in den Ecken eines Quadrates positioniert. Bei jedem Schritt verfolgt jede Turtle die im Uhrzeigersinn benachbarte Turtle und zeichnet dabei eine Spur. Das Videorecorder-Objekt wird hier mit dem Parameter tf (für TurtleFrame) erzeugt. Bei einer Videoaufnahme muss die Verfolgung aus einer endlichen Anzahl Schritte bestehen, damit die Aufnahme beendet und der Film korrekt gespeichert werden kann. |
# VideoEx4.py from gturtle import * def drawLine(a, b): ax = a.getX() ay = a.getY() a.moveTo(b.getX(), b.getY()) a.setPos(ax, ay) Options.setPlaygroundSize(320, 240) tf = TurtleFrame() rec = VideoRecorder(tf, "multiple.mp4", "320x240") t1 = Turtle(tf) t2 = Turtle(tf) t3 = Turtle(tf) t4 = Turtle(tf) t1.setPos(-110, -110) t2.setPos(-110, 110) t3.setPos(110, 110) t4.setPos(110, -110) t1.speed(-1) t2.speed(-1) t3.speed(-1) t4.speed(-1) for i in range(40): drawLine(t1, t2) drawLine(t2, t3) drawLine(t3, t4) drawLine(t4, t1) t1.forward(5) t2.forward(5) t3.forward(5) t4.forward(5) rec.captureImage(2) rec.finish() print("all done") |
Programmcode markieren
|
Erklärungen zum Programmcode:
rec = VideoRecorder(tf, "turtles.mp4", "320x240"): erzeugt ein VideoRecorder-Objekt | |
t1 = Turtle(tf) : die Turtle t1 wird im TurtleFrame tf erzeugt | |
drawLine(t1, t2) die Turtle t1 verfolgt die Turtle t2, d.h. sie bewegt sich von ihrer aktuellen Position an die Position der Turtle t2 |
Beispiel 5: Video mit animierten Bildern und einem Hintergrundbild
In dieser Computeranimation werden 8 Bilder (pony_0, ...pony_7) verwendet, die nacheinander an leicht veränderten Positionen angezeigt werden. Um die Szene zu verschönern, kann mit drawBkImage() ein Hintergrundbild hinzugefügt werden. Da in der Animationsschleife mit clear() immer der ganze Bildschirm gelöscht wird, muss das Hintergrundbild jedes Mal neu gezeichnet werden. Obwohl die Animation bei der Programmausführung infolge des Löschen des Hintergrunds sehr start flackert, wird die Videodatei flackerfrei abgespielt. Bei der Programmausführung muss man wieder abwarten, bis die im Programm festgelegten 140 Frames aufgenommen werden und all done zurück gemeldet wird.
# VideoEx5.py from gturtle import * makeTurtle() Options.setPlaygroundSize(640, 480) rec = VideoRecorder(getFrame(), "pony.mp4", "640x480") hideTurtle() penUp() wrap() setPos(200, -30) left(90) img = [0] * 8 for i in range(8): img[i] = "sprites/pony_" + str(i) + ".gif" i = 0 nbFrames = 200 n = 0 while n < nbFrames: clear() drawBkImage("sprites/catbg.png") drawImage(img[i]) rec.captureImage() forward(5) i += 1 if i == 7: i = 0 n += 1 rec.finish() print("all done") |
Programmcode markieren
|
Erklärungen zum Programmcode:
img[i] = "sprites/pony_" + str(i) + ".gif" : Liste mit 8 Bildern | |
drawBkImage("sprites/catbg.png") : stellt das Hintergrundbild dar |
Aufgaben Serie 16 |
1) |
Zeichne 20 Blumen an zufällig gewählten Positionen und erstelle dazu einen Videofilm. |
||
2) |
Eine Billardkugel bewegt sich im Turtlefensters so, dass sie an den Rändern jeweils unter der Berücksichtigung der Regel Einfallswinkel = Ausfallswinkel reflektiert wird. Erstelle einen Videofilm.
|
||
3) |
Erstelle einen Videofilm mit einer laufenden Person. Du kannst dazu die Spritebilder
|