opengl for java - mitarbeiter-servermitarbeiter.hs-heilbronn.de/~vstahl/simu/openglfolien.pdf ·...
Post on 06-Feb-2018
259 Views
Preview:
TRANSCRIPT
Prof. Dr. V. StahlOpenGL for Java
OpenGL for JavaOpenGL for Java
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
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
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…
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
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
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!
Prof. Dr. V. StahlOpenGL for Java
Zusätzliche Bibliotheken
Anwendungsprogramm
GLUGLUT
WGL/GLX/AGL
Window System
Grafik Hardware
OpenGLSystem-unabhängig
System-abhängig
Prof. Dr. V. StahlOpenGL for Java
GLUGLUT
Window System
Grafik Hardware
OpenGLSystem-unabhängig
System-abhängig
Anwendungsprogramm
GL4Java
WGL/GLX/AGL
JNI
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
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
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
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
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();
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;
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
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
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(), …
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()
Prof. Dr. V. StahlOpenGL for Java
Etwas Mathematik…
Koordinatensysteme
Transformationen (Translation, Rotation, Projektion)
Homogene Koordinaten
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
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
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
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
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
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
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
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
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
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
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
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
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
Prof. Dr. V. StahlOpenGL for Java
TriangleAnimation, TriangleAnimationView
Bewegte GrafikBewegte Grafik
Rotierendes Dreieck um seine (lokale) y-Achse
Vorderseite ausgefüllt, Rückseite Linien
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
Prof. Dr. V. StahlOpenGL for Java
Mehr Mathematik…
Normalenvektoren
Licht Reflektion
CubeLightView
Prof. Dr. V. StahlOpenGL for Java
ohne Glanz
Diffuse Reflektion…
mit Glanz
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()
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“).
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!
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 );
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
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
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
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.
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
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
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 );
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
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
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
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!
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.
Prof. Dr. V. StahlOpenGL for Java
LookAt, LookAtView
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
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);
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:
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
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
top related