Perl Hoch Drei

Max Maischein

Frankfurt.pm

Perl hoch Drei

3D Grafik mit OpenGL und Perl

 1: (als OpenGL Font)

3D Grafik

  • Warum?

  • Was geht?

  • Wie geht's?

Warum?

  • Warum nicht?

  • 3D Grafik sieht nett aus

  • 3D Grafik ist einfach und macht Spaß

Warum? (2)

 1: Notebook
  • Hardware-Unterstützung ist vorhanden

  • ... fast überall verfügbar wo's Perl gibt

  • Sogar auf meinem Notebook

  • Hardware muss benutzt werden

Was geht?

  • Anything goes

  • ... solange man möglichst wenig in Perl macht

Wie geht's?

  • use OpenGL::Simple qw(:all);

  • OpenGL-Code schreiben

  • Möglichst wenig Grafik/Berechnungen in Perl

Was ist OpenGL?

  • Von SGI für die IRIS-Workstations entwickeltes API

  • IRIS GL wurde etwa 1992 zu OpenGL

  • Offener Standard

  • Nvidia (ex SGI) und ATi sind auf dem PC-Markt

Was ist OpenGL? (2)

  • HTML / VRML / Raytracer sind deskriptive Sprachen

  • OpenGL ist eine prozedurale Beschreibungssprache (wie Postscript)

  • Perl auch

Die Funktionsweise

 1:  init()
 2:  
 3:  while(1) {
 4:      glClear(0,0,0,0);
 5:      draw_scene();
 6:      glFlush();
 7:  }

Anything goes (1)

Spiegelungen

Anything goes (2)

Texturen

Anything goes (3)

Schatten

Anything goes (4)

?(Netzwerk)spiele?

 1: oder Camelite
 1: Pong

?Camel-Modell?

  • Position via POST-request

  • Spielupdate via Response

OpenGL Sprachumfang

(Bilder/Screenshots?)

  • Polygone (Dreiecke, Vierecke, ...)

  • Licht (aber kein Schatten)

  • Drehungen, Verschiebungen, Streckungen

  • Nebel

  • Texturen

  • Transparenz

Live Demos

  • Würfel (done)

  • Marmorfläche (Spiegelung, todo)

  • Planet (done)

  • Fireworks (todo)

Literatur

Danke

Fragen? (als 3D Font)

Die Transformations-Pipeline

Die Transformations-Pipeline

  • View (= Kamera)

  • Model (= Motiv)

  • Projection (= Fotolinse)

  • Viewport (= Format des Papiers)

  • glSolidSphere(); glTranslate();

  • gluLookat();

  • glViewport();

Ein Beispiel

 1:  my $angle;
 2:  sub draw_scene {
 3:      glTranslate(0,0,-5);
 4:      glSolidCube(1);
 5:      glRotate(($angle++ % 360),0,1,1);
 6:  }