8 3D-Grafik mit VPython In diesem Kapitel wird das Python-Erweiterungsmodul Visual-Python bzw. VPython vorgestellt. Mit VPython können interaktive und animierte 3D-Szenen erzeugt werden. Dreidimensionale computergrafische Modelle können zum Beispiel dazu benutzt werden, CAD-Modelle darzustellen (CAD: Computer Aided Design), oder physikalische Vorgänge durch Simulation zu visualisieren. In diesem Kapitel wird in das Modul Visual-Python oder kurz VPython eingeführt, mit dem der Programmierer auf einfache Weise dreidimensionale Objekte erzeugen kann. Anschließend können die so erzeugten Modelle betrachtet werden, in dem der Benutzer des Programms mithilfe der Maustasten dynamisch durch die Szene navigiert. Auch Computerspiele können mit VPython realisiert werden. VPython ist wirklich eine "pythonische" Lösung: so einfach und übersichtlich, dass selbst ein Programmieranfänger ansprechende dreidimensionale Szenen erzeugen kann. Deshalb ist das Motto von VPython "3D Programmierung für Normalsterbliche" (engl. 3D Programming for ordinary mortals). Häufig wird dieses Erweiterungspaket auch mit Visual bezeichnet. In diesem Buch soll aber der Begriff VPython benutzt werden, weil Visual-Python auch noch der Name einer Entwicklungsumgebung ist. Dies kann zu Missverständnissen führen. 8.1 Hinweise zur Installation Da VPython nicht zum Standardumfang von Python gehört, muss die Software zunächst heruntergeladen und installiert werden. Die VPython-Homepage mit Hinweisen zur Lizenz dieses Moduls ist unter der folgenden Webadresse zu finden: http:// vpython.org Dort gibt es auch eine Download-Seite. Wenn Sie unter MS-Windows arbeiten, können Sie die Installationsdateien mit einer Anleitung im PDF-Format von der folgenden Webadresse herunterladen: http://mbi-wiki.uni-wuppertal.de/python/python-buch/ Die Programmversion, die in diesem Buch verwendet wird, ist VPython 5.72. Hinweis Statt der Entwicklungsumgebung IDLE sollten Sie die folgenden Beispiele mit der Entwicklungsumgebung VIDLE erstellen und testen. VIDLE ist speziell für die Programmierung mit VPython erstellt worden. Nach der Installation von VPython sollten Sie das Icon zum Programmstart im Startmenü vorfinden. Am besten legen Sie eine Verknüpfung auf dem Desktop mit dem Namen VIDLE an.
216 8 3D-Grafik mit VPython 8.2 Szenen In VPython gibt es eine Reihe vordefinierter Grundkörper. Das folgende Programm erzeugt einen Quader bzw. einen Würfel durch Erzeugung eines Objektes der Klasse box. Dieses Objekt wird nach dem Programmstart in einem separaten Grafikfenster dargestellt (Abbildung 8.1). Wir nennen eine solche Darstellung eine Szene. Wenn Sie den Cursor in diesem Fenster platzieren, dann können Sie sich um diese Szene herumbewegen, in dem Sie die rechte Maustaste gedrückt halten und dabei die Maus ziehen. Halten Sie dagegen die rechte und die linke Maustaste gleichzeitig gedrückt, dann kann die Szene vergrößert oder verkleinert werden (zoomen). Die Position des Körpers bleibt dabei unverändert, lediglich das Sichtfenster wird verändert. from visual import * box() Abb 8.1 Quader im Grafikfenster Mit VPython kann also eine einfache 3D-Szene mit nur zwei Programmzeilen erstellt werden! Merke Um die Ansicht zu drehen, müssen Sie den Cursor in das 3D-Grafikfenster platzieren und gleichzeitig die Maus mit gedrückter rechter Maustaste bewegen. Das Vergrößern oder das Verkleinern der Szene (Zoomen) wird durch gleichzeitiges Drücken der linken und der rechten Maustaste möglich. Ein etwas komplexeres Programm soll nachfolgend betrachtet werden. Mit ihm wollen wir die wichtigsten Grundkörper, die VPython bereit hält, visualisieren.
8.2 Szenen 217 from visual import * #1 scene.width = scene.height = 600 #2 scene.background = color.white #3 scene.title = "Grundkoerper und Text" #4 scene.autocenter = True #5 b = box(pos=vector(0,3,0)) #6 s = sphere(pos=vector(3,3,0)) #7 c = cylinder(pos=vector(6,3,0)) #8 a = arrow(pos=vector(0,0,0)) #9 co = cone(pos=vector(3,0,0)) #10 e = ellipsoid(pos=vector(6,0,0)) #11 h = helix(pos=vector(0,-3,0)) #12 r = ring(pos=vector(3,-3,0)) #13 p = pyramid(pos=vector(6,-3,0)) #14 t = text(text="hallo",pos=vector(0,-6,0)) #15 Die Ausgabe dieses Programms ist in Abbildung 8.2 dargestellt. Zunächst muss der Modul visual (also VPython) importiert werden (#1). In den nachfolgenden Programmen wird diese Zeile weggelassen. Fügen Sie diese - wenn notwendig - hinzu. Zur Beeinflussung der 3D-Szene gibt es mehrere Attribute. Die Attribute scene.width und scene.height legen die Größe des Ausgabefensters in Pixeln fest. In diesem Fall werden horizontal wie vertikal 600 Bildpunkte vorgegeben (#2). Abb 8.2 Grundkörper und Text in VPython Der Hintergrund der Szenen ist standardmäßig schwarz. Die Farbe kann mit dem Attribut scene.background geändert werden. Hier wird ein weißer Hintergrund gesetzt (#3). Weitere Möglichkeiten sind: color.blue, color.yellow, color.red etc. Mit dem
218 8 3D-Grafik mit VPython Attribut scene.title kann ein Text vorgegeben werden, der als Titel des 3D- Ausgabefensters erscheint (#4). Um die ganze Szene in das Ausgabefenster einzupassen, kann das Attribut scene.autocenter auf True gesetzt werden (#5). Die Grafik zeigt die folgenden Grundkörper: Quader (#6), Kugel (#7), Zylinder (#8), Pfeil (#9), Kegel (#10), Ellipsoid (#11), Helix (#12), Ring (#13) und Pyramide (#14). Hinzu kommt noch das Textobjekt, mit dem Texte in eine Szene eingebaut werden können (#15). Mit dem Parameter pos wird die Position der Objekte festgelegt. Jedes Objekt wird einer Variablen zugewiesen (a,b,c,e,r usw.). Über diese Namen kann das Objekt später angesprochen werden. Das nachfolgende Beispiel zeigt, wie zwei Szenen mit verschiedenen Grundkörpern erzeugt werden können. Gleichzeitig wird in diesem Programm den Körpern eine Textur zugeordnet. Eine Textur ist ein Bild, das auf der Oberfläche des Körpers dargestellt wird. Damit scheint der Körper aus einem bestimmten Material zu bestehen. Bedenken Sie, dass noch eine import-anweisung eingefügt werden muss, damit das Programm lauffähig wird! p=vector(0,0,0) #1 scene.title = "Quader" #2 scene.background = color.white #3 Szene2 = display(title="kugel") #4 Szene2.background = color.yellow #5 scene.select() #6 a = box(pos=p,material=materials.wood) #7 Szene2.select() #8 b = sphere(pos=p,material=materials.marble) #9 Das Programm erzeugt die folgenden beiden Ausgabefenster (Abb. 8.3). Abb 8.3 Zwei Szenen mit Texturen (Materialien) Eine Szene namens scene ist vordefiniert. Wenn wir nur eine Szene darstellen wollen, brauchen wir sie nicht zu erzeugen. Diese Szene erhält den Titel "Quader" und eine weiße Hintergrundfarbe (#2,#3).
8.2 Szenen 219 VPython enthält eine Klasse zur Darstellung von Vektoren. Mit der Zuweisung p=vector(0,0,0) wird einer Variablen p der Nullvektor zugewiesen (#1). Damit wird später der Ursprungspunkt der geometrischen Objekte festgelegt (#7,#9). Neben dieser Standardszene können nun weitere Szenen erzeugt werden. Für jede Szene wird dann ein 3D-Ausgabefenster geöffnet. Mit der Funktion display() kann eine neue Szene eröffnet werden (#4). Gleichzeitig kann der Titel des Ausgabefensters angegeben werden. Die so erstellte Szene wird einer Variablen (hier: Szene2) zugewiesen, damit sie später über diese Variable angesprochen werden kann, um zum Beispiel ihre Hintergrundfarbe zu ändern (#5). In welcher der beiden Szenen werden geometrische Objekte erzeugt oder manipuliert? Dies kann der Programmierer dadurch bestimmen, dass er eine Szene zur aktiven Szene bzw. zur 'Szene in Bearbeitung' macht. Hierzu dient die Methode select(). Mit scene.select() wird also die Standardszene zur aktiven Szene (#6). Soll ein Objekt in der zweiten Szene erzeugt werden, so muss sie zuvor mit der Anweisung Szene2.select() aktiviert werden (#8). Bei der Erzeugung der Grundkörper wird ein optionaler Parameter material angegeben. Der Quader bzw. der Würfel erscheint aus Holz gemacht, weil die Zuweisung material = materials.wood verwendet wurde (#7). Die Kugel im zweiten Ausgabefenster wurde mit einer Textur belegt (#9), die eine Oberfläche aus Marmor simuliert (material = materials.marble). Einen Überblick über alle möglichen Texturen bzw. Materialien bietet das Demoprogramm material_test.py, das der Leser im Unterverzeichnis examples der VPython- Installation findet, z.b. in C:\Python26\Lib\site-packages\visual\examples. Abschließend soll noch kurz gezeigt werden, welche Szene sich ergibt, wenn der Befehl sphere(material=materials.earth) vor einem weißen Hintergrund der Szene ausgeführt wird. Die Kugel wird mit einem Bild unseres Heimatplaneten überzogen, das aus dem Weltraum aufgenommen wurde (Abb. 8.4). Beim Drehen der Szene mittels der rechten Maustaste entsteht das Gefühl, dass die Erde sich unter dem Betrachter hinweg dreht. Das ist gut für Raumfahrsimulationen geeignet.