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.
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.
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.
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
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.