JOGL 2 und Kameraperspektive

Beowölfchen

Mitglied
Hallo,

ich bin erst vor kurzem in die Java/OpenGL-Programmierung eingestiegen undbeschäftige mich gerade mit den Demos auf der java-Seite http://download.java.net/media/jogl/demos/www/. Dort bin ich am gears demo.
Ich versuche dort mit dem Mousewheel eine Zoomfunktion einzubauen.

Dazu habe ich bereits MouseWheelListener eingefügt und bekomme auch die Daten.
Doch ich hab keine Ahnung, wie ich die "Kamera-Perspektive" raus oder reinzoomen kann.
Eigentlich müsste man dazu die Kameraposition irgendwie angeben können. Aber wie?
Die Position des Objekts, welches man betrachten will, bleibt ja gleich.

Hat jemand dazu ein Beispiel?

Vielen Dank im vorraus!
 

Beowölfchen

Mitglied
ich habe eine Möglichkeit gefunden, die Sicht auf die Szene direkt zu bestimmen. Das geht mittels
Java:
gl.glViewport(0,0,width,height);
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity();
glFrustum(-1.0j,1.0f,-1.0f,1.0f,1.0f,10000.0f); //Mein Objekt ist sehr groß und damit muss ich also weit weg
gluLookAt(...)

Jetzt würde mich nur interessieren, ob ich da nicht zu umständlich bin...
 

Marco13

Top Contributor
Ja, eine Möglichkeit ist eben bei gluLookAt als "Augpunkt" eine Position zu übergeben, die weiter weg ist - man kann also für Augpunkt A und Blickpunkt B sowas machen wie
A -= (B-A) * zoomFactor;
um rauszuzoomen.

Bei JOGL2 bzw. GL 3.2 verwendet man eigentlich nicht mehr diese ModelView- und Perspective-Matrizen. Da muss man das alles per Hand in Shadern machen ... :autsch: IMHO ziemlich umständlich, aber ich habe auch erst angefangen, mich da einzuarbeiten.

Fancy, jetzt du: ... ;)
 
G

Guest2

Gast
Moin,

Fancy, jetzt du: ... ;)

lol, also mein Tipp wäre auch nur gluLookAt gewesen. ;)

glFrustum definiert das Frustum über die Koordinaten der near plane. Eine Verkleinerung der near plane führt dabei zu einer optischen Vergrößerung des dargestellten Objektes und damit zu einem "rein zoom" Effekt. glFrustum wird dabei normalerweise auf die Projection-Matrix angewendet.

gluLookAt hingegen wird auf die ModelView-Matrix angewendet und entspricht im wesentlichen (neben einer evtl. Rotation) einer Verschiebung des darzustellenden Objektes. Kommt das Objekt dabei der "Kamera" näher, kann (fast[1]) derselbe optische Effekt erzieht werden, wie er bei einer Verkleinerung der near plane über glFrustum zu sehen wäre.

Das liegt unter anderem einfach daran, das intern die Projection-Matrix mit der ModelView-Matrix multipliziert wird.

Ich persönlich finde die Kombination aus gluPerspective (für die Projection-Matrix) und gluLookAt (für die ModelView-Matrix) am intuitivsten. Abhängig von der gegebenen Situation kann man sich dann überlegen ob der "Zoomeffekt" besser über den field of view Parameter von gluPerspective oder über den "Kamerastandpunkt" von gluLookAt realisiert werden soll.


Bei JOGL2 bzw. GL 3.2 verwendet man eigentlich nicht mehr diese ModelView- und Perspective-Matrizen. Da muss man das alles per Hand in Shadern machen ... :autsch:

Inzwischen gibt es sogar schon GL 3.3 und GL 4.0. :D
(allerdings imho noch nicht als JoGL Version und GL 4.0 eh nur wenn man am 29. zu seinem bevorzugten NVIDIA Händler rennt. :( )


Hmm, genau das hatte ich mir gedacht. Und wie genau macht man das dann ohne die Matrizen?

Die entscheidende Frage ist ehr ob Du das wirklich schon willst. ;)

Bei JoGL2 kannst Du ja Problemlos das GL2 Profil wählen, das entspricht dann GL2.1. Und da sind die ganzen Matrix Funktionen noch vorhanden. Das macht imho den Einstig in OpenGL deutlich einfacher. Und die GLSL Shader gibt es da auch schon, so das Du schrittweise weg von der fixed function pipline zu den Shadern und OpenGL >= 3.2 gehen kannst.

Denn letztendlich gibt es die Matrizen bei GL3.2+ auch noch, nur eben nicht mehr fertig von OpenGL, sondern Du musst die selbst verwalten und als Parameter (zwei von vielen) an die Shader hängen.

Ein Link zu nem Einstigstutorial hab ich leider z.Z. auch nicht paart, sorry.

(Allerdings http://too-late.de/kskb/gl3sample00.zip, ob Dir das weiterhilft sei dahingestellt.)

Gruß,
Fancy


[1] Fast, weil genau genommen, die Perspektive nicht durch den Bildwinkel beeinflusst wird, sondern nur durch die Aufnahmedistanz. (Vgl.: "Die große Objektiv Fotoschule", Seite 70,71 ;))
 
S

snitch

Gast
Zoom bedeutet nicht, die Kamera zu bewegen. Stattdessen müsste man das FOV ändern, was man mit glFrustum() erledigen kann.
 

Ähnliche Java Themen


Oben