59
Prof. Dr. V. Stahl OpenGL for Java OpenGL for Java OpenGL for Java

OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Embed Size (px)

Citation preview

Page 1: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

OpenGL for JavaOpenGL for Java

Page 2: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Bewegte Simulationen grafisch darstellen können(effizient, realistisch, dreidimensional)

Grundfunktionen von OpenGL beherrschen

Mathematische Voraussetzungen für Computer Grafik verstehen

Ziele

Page 3: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Echtzeit 3D Grafik sehr rechenintensiv

Wozu OpenGL?

Weiterer Vorteil durch Grafik Karte: Weniger Hauptspeicherzugriffe, indem grafische Objekte direkt auf der Grafikkarte gespeichert werden.

OpenGL: High level Software API für Grafik Hardware

geeignet für Spezialhardware (Grafikkarte)

Einfache, leicht parallelisierbare Algorithmen(wenig Code, wenige Kontrollstrukturen)

Viele wichtige Anwendungen

Computer Grafik

Page 4: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Was ist OpenGL?

Spezifikation einer Software Schnittstelle zur Grafik Hardware (API)

System- und Programmiersprachen unabhängig

ca. 250 Befehle

… und was nicht?

GUI Programmierung, Sound, Netzwerk, usw…

Page 5: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Wie funktioniert‘s?

Position, Form und Farbe von 3D Objekten (Würfel, Kugel, …)Position und Farbe von LichtquellenOberflächenbeschaffenheit (Textur) von ObjektenPosition und Blickrichtung der Kamera

Koordinatensystem Transformationen (Drehung, Verschiebung…)Projektion der 3D Szene auf ein 2D BildFarbverlauf auf Flächen (Licht/Schatten)Sichtbare/verdeckte FlächenTransformation von Texturen

Benutzerprogramm: Aufruf von OpenGL API Funktionen

OpenGL

Page 6: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Geschichte von OpenGL

1982 SGI beginnt mit der Entwicklung für High End Grafik Workstations

Seit 1992 Open GL Architecture Review Board (ARB)Mitglieder: Compaq, ATI, nVidia, HP, IBM, Apple, Microsoft, …

1992 OpenGL Version 1.0

Heute: OpenGL Version 2.0

Grafikkarten Wettbewerb, Erweiterungen

Page 7: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

GLU (OpenGL Utilities)

Zusätzliche Bibliotheken

Einfache Funktionen zum Zeichnen komplexerer Objekte(Kugeln, Zylinder, Scheibe, …)Gekrümmte Flächen: NURBSViele nützliche Hilfsfunktionen

GLUT (OpenGL Utility Toolkit)

Torus, Tetrahedron, Octahedron, …TextPlattformunabhängige GUI Funktionen (Fenster, Maus, Tastatur)

Für GUI Funktionen verwenden wir Java!

Page 8: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Zusätzliche Bibliotheken

Anwendungsprogramm

GLUGLUT

WGL/GLX/AGL

Window System

Grafik Hardware

OpenGLSystem-unabhängig

System-abhängig

Page 9: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

GLUGLUT

Window System

Grafik Hardware

OpenGLSystem-unabhängig

System-abhängig

Anwendungsprogramm

GL4Java

WGL/GLX/AGL

JNI

Page 10: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Das erste OpenGL Programm

Canvas3D.java

Fenster erzeugen (JFrame)Zeichenfläche (Canvas3D) erzeugen und anzeigen

Abgeleitet von GLAnimCanvas (GL4Java Klasse)preInit, init: Initialisierungdisplay: Wird aufgerufen, um Bildschirm neu zu zeichnenreshape: Wird aufgerufen, wenn Fenstergröße geändert wird.

Triangle

Starter.java

Page 11: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

import javax.swing.*;import java.awt.*;

class Starter{

public static void main(String[] args) {

// Erzeugen des OpenGL CanvasCanvas3D canvas3D = new Canvas3D(640,480);

// Erzeugen des AnwendungsfenstersJFrame frame = new JFrame("Triangles for Java");

// OpenGL Canvas dem Frame hinzufügenContainer pane = frame.getContentPane();pane.add(canvas3D);

// Frame Grösse setzen und anzeigenframe.setSize(640,480);frame.setVisible(true);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}}

Starter.java

Page 12: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

import gl4java.awt.GLCanvas;

class Canvas3D extends GLAnimCanvas{

// Konstruktor für Gl4Java Klasse GLCanvaspublic Canvas3D(int w, int h) { super(w, h); }

// Globale OpenGL Optionen (z.B. double buffering) setzenpublic void preInit() { … }

// Einmaliges Initialisieren (z.B. Farbe zum Löschen)public void init() { … }

// Wird aufgerufen, wenn Bildschirm neu gezeichnet werden musspublic void display() { … }

// Wird aufgerufen, wenn Fenstergröße geändert wirdpublic void reshape(int width, int height) { … }

}

Canvas3D.java

Page 13: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

reshape(int width, int height)

Bildschirmbereich auf den gezeichnet werden soll in PixelglViewport( 0,0,width,height );

Matrix, die 3D nach 2D Projektion machtPerspektivische Projektion60 Grad Blickwinkel, Clipping Abstand 2 bis 4glMatrixMode( GL_PROJECTION );glLoadIdentity();gluPerspective(60, 1.0, 2.0, 4.0);

// Matrix, die Zeichenkoordinatensystem positioniertglMatrixMode( GL_MODELVIEW );

TriangleView

Page 14: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

display

Löschen was zuvor gemalt wurdeglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Zeichenkoordinatensystem 3 Einheiten nach hinten setzenglLoadIdentity();glTranslatef(0.0f, 0.0f, -3.0f);

Farbe rot einstellenglColor3f(1.0f,0.0f,0.0f);

Dreieck durch Eckpunkte zeichnenglBegin(GL_TRIANGLES);glVertex3f(-1.0f, -1.0f, 0.0f); // links untenglVertex3f( 1.0f, -1.0f, 0.0f); // rechts untenglVertex3f( 0.0f, 1.0f, 0.0f); // mitte oben

glEnd();

Page 15: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

init

Interpolation wenn Eckpunkte unterschiedliche Farbe habenglShadeModel(GL_FLAT);

Hintergrundfarbe WeissglClearColor(1.0f, 1.0f, 1.0f, 0.0f);

Double Buffering (flüssiger bei bewegter Grafik)super.doubleBuffer = true;

preinit

Für Stereo Brillensuper.stereoView = false;

Page 16: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Schattierungsmodell auf GL_SMOOTH setzen

Jedem Eckpunkt des Dreiecks eine andere Farbe geben

gl.glBegin(GL_TRIANGLES);

gl.glColor3f(1.0f,0.0f,0.0f); rotgl.glVertex3f(-1.0f, -1.0f, 0.0f); links unten

gl.glColor3f(0.0f,1.0f,0.0f); grüngl.glVertex3f( 1.0f, -1.0f, 0.0f); rechts unten

gl.glColor3f(0.0f,0.0f,1.0f); blaugl.glVertex3f( 0.0f, 1.0f, 0.0f); mitte oben

gl.glEnd();

TriangleInterpolation

Page 17: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Dreieck um 20 Grad um z-Achse nach links drehen

gl.glRotatef( 20.0f, 0.0f, 0.0f, 1.0f );

z-Achse

TriangleRotation, TriangleRotationView

Page 18: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

3D nach 2D Projektions Matrix glMatrixMode(GL_PROJECTION);

Bestimmt, wie eine 3D Szene auf ein 2D Bild projiziert wird.- Orthogonalprojektion: glOrtho()- Perspektivische Projektion: gluPerspective(), glFrustum()Wird i.a. nur einmal gesetzt und nicht mehr geändert.

Matrizen in OpenGL

Model View Matrix glMatrixMode(GL_MODELVIEW);

Legt Position und Orientierung des Koordinatensystemsfest, in das als nächstes gezeichnet wird.glRotate(), glTranslate(), …

Page 19: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Koordinatensystem Transformationen in OpenGL

glVertex(x,y,z)

Objektkoordinaten

Kamerakoordinaten

Bildschirmkoordinaten (Pixel)

2D Koordinaten

Multiplikation mit Projektions Matrix

Skalieren, Verschieben

Multiplikation mit Model View Matrix

glViewPort()

glRotate(),glTranslate()

gluPerspective()

Page 20: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Etwas Mathematik…

Koordinatensysteme

Transformationen (Translation, Rotation, Projektion)

Homogene Koordinaten

Page 21: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

OpenGL Primitive

gl.glBegin(GL_TRIANGLES);

gl.glVertex(…); Punkt 1gl.glVertex(…); Punkt 2gl.glVertex(…); Punkt 3gl.glVertex(…); Punkt 4

usw.

gl.glEnd();

1

3

2

5

4

6

Page 22: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

OpenGL Primitive

gl.glBegin(GL_POINTS);

gl.glVertex(…); Punkt 1gl.glVertex(…); Punkt 2gl.glVertex(…); Punkt 3gl.glVertex(…); Punkt 4usw. …

gl.glEnd();

1

3

2

gl.glPointSize(float size)Größe der Punkte

Page 23: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

OpenGL Primitive

gl.glBegin(GL_LINES);

gl.glVertex(…); Punkt 1gl.glVertex(…); Punkt 2gl.glVertex(…); Punkt 3gl.glVertex(…); Punkt 4usw. …

gl.glEnd();

1

3

2

gl.glLineWidth(float size)Liniendicke

4

Page 24: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

OpenGL Primitive

gl.glBegin(GL_LINE_STRIP);

gl.glVertex(…); Punkt 1gl.glVertex(…); Punkt 2gl.glVertex(…); Punkt 3gl.glVertex(…); Punkt 4usw. …

gl.glEnd();

1

3

2

4

Page 25: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

OpenGL Primitive

gl.glBegin(GL_LINE_LOOP);

gl.glVertex(…); Punkt 1gl.glVertex(…); Punkt 2gl.glVertex(…); Punkt 3gl.glVertex(…); Punkt 4usw. …

gl.glEnd();

1

3

2

4

Page 26: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

OpenGL Primitive

gl.glBegin(GL_TRIANGLE_STRIP);

gl.glVertex(…); Punkt 1gl.glVertex(…); Punkt 2gl.glVertex(…); Punkt 3gl.glVertex(…); Punkt 4usw. …

gl.glEnd();

1

32

4 5

Page 27: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

OpenGL Primitive

gl.glBegin(GL_TRIANGLE_FAN);

gl.glVertex(…); Punkt 1gl.glVertex(…); Punkt 2gl.glVertex(…); Punkt 3gl.glVertex(…); Punkt 4usw. …

gl.glEnd();

1

32

4

5

Page 28: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

OpenGL Primitive

gl.glBegin(GL_QUADS);

gl.glVertex(…); Punkt 1gl.glVertex(…); Punkt 2gl.glVertex(…); Punkt 3gl.glVertex(…); Punkt 4usw. …

gl.glEnd();

1

32

4

5

86

7

Page 29: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

OpenGL Primitive

gl.glBegin(GL_QUAD_STRIP);

gl.glVertex(…); Punkt 1gl.glVertex(…); Punkt 2gl.glVertex(…); Punkt 3gl.glVertex(…); Punkt 4usw. …

gl.glEnd();

1

3

2

4

6

5

Page 30: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

OpenGL Primitive

gl.glBegin(GL_POLYGON);

gl.glVertex(…); Punkt 1gl.glVertex(…); Punkt 2gl.glVertex(…); Punkt 3usw. …

gl.glEnd();

1

3

24

5

Ränder dürfen sich nicht schneiden, sonst ist unklar was innen und außen ist!

1

2 3

4

5

Die Eckpunkte müssen alle in einer Ebene liegen,sonst ist unklar welche Fläche gemalt werden soll!

Polygone müssen konvex sein!

1

2 3

4

5

Page 31: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

PolygoneGL_TRIANGLES, GL_QUADS, GL_POLYGON

Def. Vorderseite: Reihenfolge der Eckpunkte gegen Uhrzeigersinn

1 2

3

12

3

Vorderseite Rückseite

1 2

34 1 2

34

Page 32: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Polygone

gl.glPolygonMode( GL_FRONT, GL_POINT )GL_BACK GL_LINE

GL_FRONT_AND_BACK GL_FILL

gl.glEnable(GL_CULL_FACE)

Polygone gefüllt, als Linien oder nur die Eckpunkte zeichnen

gl.glCullFace( GL_FRONT )GL_BACKGL_FRONT_AND_BACK

Nur Vorderseite/Rückseite zeichnen

Effizienz Verdeckte Flächen bei geschlossenen Körpern

Page 33: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Bewegte GrafikBewegte Grafik

Starten und anhalten

Geschwindigkeit (Bilder pro Sekunde)

super.setAnimateFps(60.0);

super.start();super.stop();

In der init Methode

// 60 Aufrufe von display() pro Sekunde

Page 34: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

TriangleAnimation, TriangleAnimationView

Bewegte GrafikBewegte Grafik

Rotierendes Dreieck um seine (lokale) y-Achse

Vorderseite ausgefüllt, Rückseite Linien

Page 35: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Cube, CubeLight

3D Grafik

Problem: Kein „richtiger“ 3D Eindruck wenn Flächen ausgefüllt sind!

Lösung: Licht und Schatten

Lichtquellen(Position, Richtung, Farbe, Ausbreitung, …)

Oberflächen(Normalenvektor, Reflektionseigenschaften, Farbe, …)

3D Grafik3D Grafik

Page 36: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Mehr Mathematik…

Normalenvektoren

Licht Reflektion

Page 37: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

CubeLightView

Prof. Dr. V. StahlOpenGL for Java

ohne Glanz

Diffuse Reflektion…

mit Glanz

Page 38: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Normalenvektoren

gl.glBegin(GL_QUADS);

// Vorderseitegl.glNormal3f( 0.0f, 0.0f, 1.0f);gl.glVertex3f(-1.0f,-1.0f, 1.0f); gl.glVertex3f( 1.0f,-1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f);

// Rechte Seitegl.glNormal3f( 1.0f, 0.0f, 0.0f);gl.glVertex3f( 1.0f,-1.0f, 1.0f);gl.glVertex3f( 1.0f,-1.0f,-1.0f);gl.glVertex3f( 1.0f, 1.0f,-1.0f);gl.glVertex3f( 1.0f, 1.0f, 1.0f);

// usw…

gl.glEnd()

Page 39: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Normalenvektoren

gl.glNormal3f( 0.0f, 0.0f, 1.0f);

Aktuellen Normalenvektor setzen.

Dieser bleibt so lange gültig, bis ein neuer Normalenvektor gesetzt wird

Möglich: An jedem Eckpunkt ein anderer „Normalenvektor“.Anwendung: Gekrümmte Flächen, die aus vielen Einzelpolygonen bestehen.Lichtverlauf an den Kanten dann glatter („smooth shading“).

Page 40: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Licht

Prof. Dr. V. StahlOpenGL for Java

// Licht aktivierengl.glEnable(GL_LIGHTING);

// Einzelne Lichtquellen einschalten (maximal 8)gl.glEnable(GL_LIGHT0);gl.glEnable(GL_LIGHT1);gl.glEnable(GL_LIGHT2);

Ab jetzt Farbberechnung nur noch mit Licht und Oberflächen!Aufrufe von glColor werden ignoriert!

Page 41: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Licht

Prof. Dr. V. StahlOpenGL for Java

// Farbe der i-ten Lichtquelle (RGBA)float[] color = { 1.0f, 1.0f, 1.0f, 1.0f }gl.glLightfv( i, GL_DIFFUSE, color);

GL_AMBIENTGL_SPECULAR

// Position der i-ten Lichtquelle// Unendlich weit in z-Richtung, daher parallele Strahlenfloat[] position = { 0.0f, 0.0f, 1.0f, 0.0f };gl.glLightfv( i, GL_POSITION, position );

Page 42: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Licht

Prof. Dr. V. StahlOpenGL for Java

// Öffnungswinkel der Lichtstrahlengl.glLightf( i, GL_SPOT_CUTOFF, angle);

// Richtung der Lichtstrahlenfloat[] direction = { 0.0f, 0.0f, -1.0f }gl.glLightfv( i, GL_SPOT_DIRECTION, direction );

(Spotligh

t)

// Exponentielles Abfallen von der Mitte zum Randgl.glLightf( i, GL_SPOT_Exponent, exp);

direction

angle

position

Page 43: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Material

Prof. Dr. V. StahlOpenGL for Java

// Reflektionseigenschaften (RGBA)float[] color = { 1.0f, 0.0f, 0.0f, 1.0 }gl.glMaterialfv( GL_FRONT, GL_DIFFUSE, color );

GL_BACK GL_AMBIENTGL_FRONT_AND_BACK GL_SPECULAR

GL_AMBIENT_AND_DIFFUSEGL_EMISSION

// Glanz (für specular reflection)gl.glMaterialf( GL_FRONT, GL_SHININESS, factor);

GL_BACKGL_FRONT_AND_BACK

Page 44: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Material

Prof. Dr. V. StahlOpenGL for Java

Weißen, rotierenden Würfel mit einem roten und einem blauen Spotlightanstrahlen. Die Lichtquellen drehen sich nicht mit!

Was passiert wenn man backface culling abschaltet?

Würde ein nicht-konvexes Objekt richtig dargestellt?

CubeSpot

Page 45: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Texturen

Idee: Bild auf die Oberflächen von Objekten kleben

CubeTexture

1

Texturbild10

0

Polygon

Jedem Eckpunkt des Polygons einen Punkt der Textur zuordnen.Texturkoordinaten: glTexCoord2f()

Farbwerte innerhalb des Polygons durch Interpolation.

Page 46: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

import gl4java.utils.textures.PngTextureLoader;

Texturen

// Texturbild lesen (Abmessungen müssen 2er Potenz sein!)PngTextureLoader texload = new PngTextureLoader(gl, glu);texload.readTexture("textures/ambrosil.png");

// InterpolationglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

GL_TEXTURE_MIN_FILTER GL_NEAREST

// Textur in Speicher auf Grafik Karte ladenglTexImage2D( GL_TEXTURE_2D, 01, GL_RGB,

texload.getImageWidth(), texload.getImageHeight(), 02, GL_RGB, GL_UNSIGNED_BYTE, texload.getTexture() );

1Mip Maps2Rand

Page 47: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Texturen

Zwei rotierende Marmorwürfel nebeneinander zeichnenso dass sie sich überschneiden.Jeder Würfel dreht sich um eine Achse durch seinen Mittelpunkt!

Würfel zeichnen in eigene Methode kapseln und zweimal aufrufen.

Momentane Matrix auf Stapel speichern bzw. zurück holen:glPushMatrix, glPopMatrix

Hidden Surface Problem: gl.glEnable(GL_DEPTH_TEST);z-Puffer AlgorithmusWarum reicht backface culling nicht mehr aus?

CubeIntersect

Page 48: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

GLU Quadrics

// Quadric erzeugen bzw. löschenlong quad = glu.gluNewQuadric();glu.gluDeleteQuadric( quad );

Kugel, Zylinder, Scheibe

// Kugelglu.gluSphere( quad, radius, kuchenstücke, stapel );

// Zylinderglu.gluCylinder( quad, radius_unten, radius_oben,

höhe, kuchenstücke, stapel );

// Scheibeglu.gluDisk( quad, radius_innen, radius_außen,

kuchenstücke, ringe );

Page 49: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

GLU Quadrics

// Darstellungglu.gluQuadricDrawStyle( quad, GLU_FILL );

GLU_POINTGLU_LINEGLU_SHILOUETTE

// Normalenvektoren automatisch erzeugenglu.gluQuadricNormals( quad, GLU_SMOOTH );

GLU_FLATGLU_NONE

// Texturkoordinaten automatisch erzeugenglu.gluQuadricTexture( quad, GL_TRUE );

GL_FALSE

Quadric

Page 50: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

EarthMoon

Prof. Dr. V. StahlOpenGL for Java

GLU Quadrics

Flat shading statt smooth shading bei derBerechnung der Normalenvektoren

Mond um Erde kreisen lassen (moon.png)

// Platz für ID’s für 2 Texturobjekteint[] textures = new int[2];

// Texturobjekte erzeugen, ID’s in textures speicherngl.glGenTextures(2, textures);

// i-te Textur zur aktuellen Textur machengl.glBindTexture(GL_TEXTURE_2D, textures[i]);

Texturen in init-Methode laden und auf Grafikkarte speichern

Page 51: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Positionierung der Kamera

glu.gluLookAt(double eyex, double eyey, double eyez, // Punktvektordouble atx, double aty, double atz, // Punktvektordouble upx, double upy, double upz // Richtungsvektor

);

eye

at

up

Page 52: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

In „Wirklichkeit“ wird die gesamte Szene bewegt!Die Kamera steht nach wie vor im Koordinatenursprungund schaut in negative z-Richtung.

Multiplikation der Model View Matrix mit einer entsprechenden Matrix von links.(Transformation bzgl. Ursprungskoordinatensystem!)

Positionierung der Kamera

glu.gluLookAt(double eyex, double eyey, double eyez, // Punktvektordouble atx, double aty, double atz, // Punktvektordouble upx, double upy, double upz // Richtungsvektor

);

Daher: gluLookAt gleich nach glLoadIdentity aufrufen!

Page 53: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Positionierung der Kamera

// Klasse Canvas3D ist Key Listenerclass Canvas3D extends GLAnimCanvas implements KeyListener

// Im Konstruktor von Canvas3DaddKeyListener(this);

import java.awt.event.KeyEvent;import java.awt.event.KeyListener;

// Callback Funktionenpublic void keyTyped(KeyEvent e){}public void keyReleased(KeyEvent e){}public void keyPressed(KeyEvent e) { … }

Kamera mit Cursor Tasten in x- und y-Richtung bewegen.Kamera soll dabei immer gerade aus in negative z-Richtung schauen.

Page 54: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

LookAt, LookAtView

Page 55: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Picking & Selection

Ziel:

Problem:

Vorgehen:

Bild intern neu zeichnen, allerdings nur einen ca. 4x4 PixelAusschnitt um die aktuelle Mausposition.

Mitprotokollieren welches Objekt in welcher Tiefe gemalt wurde.Ergebnisliste (Objekte mit Tiefeninformation) auswerten.

Verdeckungen (welches Objekt wurde angeklickt?) Umrechnen von Mauskoordinaten in Weltkoordinaten

3D Objekte mit der Maus anklicken

Pick

Page 56: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Picking & Selection

Ausschnitt um die aktuelle Mausposition (x,y) zeichnen. Dazu PickMatrix links an Projektionsmatrix multiplizieren

// Projektionsmatrix neu berechnengl.glLoadIdentity();glu.gluPickMatrix(x,height-y, 4, 4, viewport);glu.gluPerspective(60, 1.0,2.0,4.0);

Liste initialisieren, in der die getroffenen Objekte gespeichert werden.Render Mode auf GL_SELECT setzen.

int[] nameBuffer = new int[100];gl.glSelectBuffer(100,nameBuffer);gl.glRenderMode(GL_SELECT);gl.glInitNames();gl.glPushName(0);

Page 57: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Picking & Selection

Bild intern neu zeichnen. Objekte durch Zahlen benennen, z.B.

int hits = gl.glRenderMode(GL_RENDER);

gl.glLoadName(42);gl.glRectf(-1.0,1.0,-1.0,1.0);

Auf Render Mode GL_RENDER zurückschalten.

1minimale und maximale Tiefe des getroffenen AusschnittsObjektname, der während des Zeichnens mit glLoadName gesetzt wurde

Für jedes getroffene Objekt enthält nameBuffer nun vier Zahlen:

Page 58: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Picking & Selection

Projektionsmatrix muss danach wieder hergestellt werden!

Tiefeninformation ist unsigned int. Gibt‘s in Java aber nicht!

unsigned int

Angeklicktes Objekt ist dasjenige mit geringster Tiefe(nameBuffer durchsuchen!)

int

230

Page 59: OpenGL for Java - Mitarbeiter-Servermitarbeiter.hs-heilbronn.de/~vstahl/simu/OpenGLFolien.pdf · OpenGL for Java Prof. Dr. V. Stahl Echtzeit 3D Grafik sehr rechenintensiv Wozu OpenGL?

Prof. Dr. V. StahlOpenGL for Java

Erde- Mond System erweitern so dass die Planeten angeklickt werden können.

Angeklickter Planet soll stehen bleiben und sich beimnächsten Klick weiterbewegen.

Picking & Selection