Erstellen eines Video-Films

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)


Der zweite Parameter ist der Name der Ausgabedatei. Falls kein Pfad angegeben wird, so wird das Video im Verzeichnis gespeichert, in dem sich das Programm befindet.

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 (Ctrl+C kopieren, Ctrl+V einfügen)

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 (Ctrl+C kopieren, Ctrl+V einfügen)

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 (Ctrl+C kopieren, Ctrl+V einfügen)

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 (Ctrl+C kopieren, Ctrl+V einfügen)

 

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 (Ctrl+C kopieren, Ctrl+V einfügen)

 

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
person_0, person_1, person_2, person_3, person_4
und die Animation, die im Beispiel 4 im Kapitel Computeanimationen beschrieben ist, verwenden.