gluUnProject liefert komische Ergebnisse

Hallo
Ich benutze die Methode GLU.gluUnProject um Bildschirmkoordinaten i Weltkoordinaten umzuwandeln. Ich wandle den Mittelpunkt des Fensters um, um den Kamerafokus zu bekommen(Es ist First-Person-Perspektive). Dazu setze ich das Bildschirm-Z auf die negative Reichweite. Aber es kommen merkwürdige Ergebnisse, wie beispielsweise -100,0954; 250,65265; 7,09621 raus, obwohl ich an der Position 0, 0, 0 stehe.Zum Code: die Viewmatrix berechne ich selbst.

FloatBuffer buf = BufferUtils.createFloatBuffer(3);
IntBuffer viewPort = BufferUtils.createIntBuffer(16);
glGetInteger(GL_VIEWPORT, viewPort);
FloatBuffer projMatrix = BufferUtils.createFloatBuffer(16);
glGetFloat(GL_PROJECTION_MATRIX, projMatrix);
GLU.gluUnProject(w/2, h/2, -1*reichweite, viewMatrix, projMatrix, viewPort, buf);
System.out.println(buf.get(0)+" "+buf.get(1)+" "+buf.get(2));

Moin,

erst mal solltest Du das winZ auf 0 setzen um einen Fehler dort auszuschließen. Das sind Fensterkoordinaten, imho also z zwischen 0 und 1. viewPort sind 4 Integerwerte, aber das sollte nicht stören. Ist die GL_PROJECTION_MATRIX die Du da ausliest vorher gesetzt? Was ist w und h, wenn das Integer sind solltest Du durch 2.0 teilen.

Ansonsten ein KSKB.

Gruß
Fancy

Deine Tipps ändern nix und komischerweise funktioniert’s im KSKB.

Es kann ja nicht so viel falsch sein. Vergleich ggf. mal die Projection-Matrix aus der Anwendung mit der aus dem KSKB.

Jetzt weiß ich’s, es liegt daran, dass während des Aufrufs der Methode eine 2D-Projektionmatrix geladen ist. Ich hab es jetzt an eine Andere Stelle gestellt und es funktioniert.

Aber wie bekomme ich den Punkt, der die Reichweite entfernt vor der “Kamera” liegt ?

Es ist (mir) nicht ganz klar, was du meinst, aber … vielleicht suchst du nach einem Strahl? Oft schickt man den Punkt ZWEI mal durch diese Funktion: Einmal mit winZ=0, und einmal mit winZ=1. Dann hat man zwei Punkte, aus deren Differenz man sich den “Strahl” berechnen kann (“Picking Ray”). Man kann den auch normalisieren, um die Richtung zu erhalten, und dann ggf. mit eyePoint + distance * pickingRayDirection eine bestimmte Distanz vom Auge weg entlang dieses Strahls laufen.

Ja, genau das meine ich, aber mir ist nicht ganz klar, wie ich die Richtung des Strahls bekomme. Ich weiß nicht viel darüber, aber das Normalisieren ist doch, wenn man beispielsweise einen Klickpunkt durch die Bildschirmmaße teilt und so eine Kommazahl zwischen 0 und 1 bekommt. Wie kann ich das mit dem Abstand der Strahlpunkte machen ?

Hmja. Das ist so 3D-Vektorrechnungszeugs. Ohne das wird OpenGL allgemein schwierig, aber OK: Wenn du dir für die beiden Punkte (einmal mit z=0, und einmal mit z=1) die un-projizierten Punkte abgeholt hast (in FloatBuffern Namens “buf0” und “buf1”), dann kannst du mit

float dx = buf1.get(0)-buf0.get(0);
float dy = buf1.get(1)-buf0.get(1);
float dz = buf1.get(2)-buf0.get(2);

float lengthSquared = dx*dx + dy*dy + dz*dz;
float length =  = (float)Math.sqrt(lengthSquared);

float dirX = dx / length;
float dirY = dy / length;
float dirZ = dz / length;

die Richtung ausrechnen. Das (dirX,dirY,dirZ) ist dann ein Vektor der Länge 1, der in die Richtung zwischen “Auge” und “Klickpunkt auf dem Bildschirm” zeigt.

Danke, ich habs jetzt so und es funktioniert.