Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Apr 18, 2024 10:37

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit gluProject
BeitragVerfasst: So Mär 22, 2015 20:26 
Offline
DGL Member

Registriert: Di Jun 10, 2014 06:59
Beiträge: 17
Programmiersprache: Delphi XE6
Hallo zusammen,

ich habe hier ein übles Problem mit gluUnproject und komme einfach nicht dahinter warum. Die Funktion funktioniert einwandfrei bis ich einen Wert übergebe, der am Oberen Rand des OpenGL-Fenster liegt. Hier mal ein bisschen Code:

Code:
  1. function TfemProjectCanvas.ObjToScr(X, Y, Z: Double): TfemPoint3D;
  2. // Objektkoordinaten in Bildschirmkoordinaten wandeln
  3. var
  4.   ViewPort: TGLVectori4;
  5.   oX, oY, oZ: TGLDouble;
  6. begin
  7.   if FOpenGLValid then
  8.   begin
  9.     // aktuellen Viewport lesen
  10.     glGetIntegerv(GL_VIEWPORT, @ViewPort);
  11.  
  12.     // Punkt berechnen
  13.     if gluProject(X, Y, Z, FOpenGLMatrixModelView, FOpenGLMatrixProjection, ViewPort, @oX, @oY, @oZ) <> GL_TRUE then
  14.       raise Exception.CreateFmt('Error calling gluProject'#13'%s', [gluErrorString(glGetError)]);
  15.     // Ergebnisse eintragen
  16.     Result.X := oX;
  17.     Result.Y := ViewPort[3] - oY;
  18.     Result.Z := oZ;
  19.   end
  20.   else
  21.     Result := TfemPoint3D.Create(0, 0, 0);
  22. end;
  23.  


Die Matrizen, den Viewport usw. habe ich mir schon im Debugger angesehen. Die sehen alle "gesund" aus. Die Meldung, welche ich von gluErrorString erhalte ist "Kein Fehler". Wenn ich das Programm an dieser Stelle abbreche (Debugger), dann schmiert der Debugger komplett ab. Dann hilft nur noch ein Neustart von Delphi. Der Aufruf erfolgt an einer anderen Stelle:

Code:
  1.     // Objektkoordinaten an X, Y ermitteln
  2.     PObj := ScrToObj(X, Y, PObjValid);
  3.     // nur prüfen, wenn auch etwas gefunden wurde
  4.     if PObjValid then
  5.     begin
  6.       // Bildschirmkoordinaten des Ziels...
  7.       PScr := ObjToScr(PObj.X, PObj.Y, PObj.Z);
  8.  


Hier sind X und Y die Bildschirmkoordinaten. Die Funktion ScrToObj ermittelt Objektkoordinaten anhand der aktuellen Ausgabe. Ich weiß, es wird etwas viel, aber auch hier noch Code von SctToObj:

Code:
  1. function TfemProjectCanvas.ScrToObj(X, Y: Integer; out IsValid: Boolean): TfemPoint3D;
  2. // Bildschirmkoordinaten in Objektkoordinaten wandeln
  3. type
  4.   TZArray = array [1 .. 16] of TGLFLoat;
  5.  
  6.   function GetMinZd(ZArray: TZArray): TGLFLoat;
  7.   var
  8.     I: Integer;
  9.   begin
  10.     Result := 1.0;
  11.     for I := Low(TZArray) to High(TZArray) do
  12.     begin
  13.       // teilweise üble Exception mit Debugger-Abstürzen wenn Abfrage auf Nan fehlt!
  14.       if not IsNan(ZArray[I]) then
  15.         if ZArray[I] < Result then
  16.           Result := ZArray[I];
  17.     end;
  18.   end;
  19.  
  20. var
  21.   ViewPort: TGLVectori4;
  22.   ZArray: TZArray;
  23.   Xi, Yi, Zd: TGLFLoat;
  24. begin
  25.   IsValid := False;
  26.  
  27.   if FOpenGLValid then
  28.   begin
  29.     glGetIntegerv(GL_VIEWPORT, @ViewPort);
  30.     glReadPixels(X, ViewPort[3] - Y, 4, 4, GL_DEPTH_COMPONENT, GL_FLOAT, @ZArray);
  31.     Zd := GetMinZd(ZArray);
  32.     if Zd < 1.0 then
  33.     begin
  34.       Xi := X;
  35.       Yi := ViewPort[3] - Y;
  36.       if gluUnProject(Xi, Yi, Zd,                                  //
  37.         FOpenGLMatrixModelView, FOpenGLMatrixProjection, ViewPort, //
  38.         @Result.X, @Result.Y, @Result.Z) <> GL_TRUE then
  39.         raise Exception.CreateFmt('Error calling gluUnProject'#13'%s', [gluErrorString(glGetError)]);
  40.       IsValid := True;
  41.     end
  42.     else
  43.       Result := TfemPoint3D.Create(0, 0, 0);
  44.   end;
  45. end;
  46.  


Die Abfrage auf "IsNan" in der Funktion GetMinZd ist zwingend erforderlich. Sonst knallt es ebenfalls (Pixel außerhalb des Sichbereichs mag OpenGL nicht so).

Der Fehler tritt - wie bereits erwähnt - immer dann auf, wenn ich die Koordinaten der obersten Y-Zeile ermittle.

Im Anhang noch ein Ausschnitt aus dem Debugger:

Klick mich

Wäre für jede Hilfe dankbar. Bin hier bald am Verzweifeln. Internet-Suche hat leider auch nichts sinnvolles hervorgebracht.

Alex


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Zuletzt geändert von BigAl am Mo Mär 23, 2015 15:23, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit gluProject
BeitragVerfasst: So Mär 22, 2015 21:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

auf den ersten Blick kann ich in deinem Code keinen Fehler erkennen. In welchem Bereich bewegt sich der Wert, wenn gluUnproject false zurück gibt?
Sicher das deine Matrizen aktuell sind? Zum Test könntest du die in deiner ScrToObj-Methode noch einmal mit glGet holen.
Warum liest du 4x4 Pixel aus dem DepthBuffer? 1x1 reicht eigentlich.
Wenn alles nichts hilft, dann versuch mal das Unproject per Hand zu machen: ObjPos = Invert(ProjectionMatrix * ModelViewMatrix) * ScreenPos; (ScreenPos muss im Einheits-Quader liegen; also alles zwischen -1 und 1). Da kann man dann mit dem Debugger besser kontrollieren ob die Werte stimmen. gluUnproject macht intern auch nichts anderes (siehe engliches Wiki). glGetError gibt dir 0 zurück, weil gluUnproject keine gl-Funktion ist, sondern zur glu gehört.

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit gluProject
BeitragVerfasst: Mo Mär 23, 2015 15:19 
Offline
DGL Member

Registriert: Di Jun 10, 2014 06:59
Beiträge: 17
Programmiersprache: Delphi XE6
Hallo Bergmann,

danke für Deine Antwort. Die Matrizen sind aktuell (wie Du im Ausschnitt des Debuggers auch erkennen kannst).

Warum ich die 4x4 Pixel lese ist einfach: Ich möchte ein Objekt finden, auch wenn ich noch nicht ganz genau drauf bin. Es ist ja schwer mit der Maus ein Pixel exakt zu finden. Durch die 4x4-Fläche wird der Bereich etwas größer. Ich suche mir dann aus den 4x4 Pixeln das Pixel heraus, welches den kleinsten Z-Wert hat. Funktioniert super. Korrekt wäre natürlich z.B. ein 5x5 Feld, welches 2 Pixel vor und 2 Pixel nach dem gegebene Pixel mitnimmt...

Zurück zu meinem Problem: Ich habe noch festgestellt, dass das Problem nur bei bestimmten Ausrichtungen auftritt. Drehe ich z.B. mein Objekt ein paar Grad, dann ist der Fehler weg. Fühle mich halt etwas hilflos, da man nicht in die OpenGL-Engine debuggen kann bzw. nachschauen kann was da genau schief läuft. Der Tip mit dem "UnProject" per Hand ist aber sehr gut. Das werde ich mir mal reinziehen :-). Bin zwar momentan mit einem kleinen "Rotations-Problem" beschäftigt, werde mich aber später noch drum kümmern.

Vielen Dank nochmal!

Alex


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit gluProject
BeitragVerfasst: Mo Mär 23, 2015 18:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Hi,

Vorweg, dein glReadPixel überschreitet den Bereich deines Fenster. Daher kriegst du undefinierte Werte (viewport[3] - 0 +4 = zu groß).

Deine Werte aus dem Debugger Screenshot habe ich mal mit MSBuild und GCC getestet. gluProject liefert zwar totalen Müll aber funktioniert ohne Probleme. Keine Ahnung wie du es hinbekommen hast das hier etwas abschmiert. Dafür kenne ich Delphi leider nicht gut genug.

Mich wundert das aber auch nicht das es Probleme gibt, wenn man die Funktionen offensichtlich mit falschen Datentyp aufrufen kann und Pointer benutzt werden.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 37 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.069s | 17 Queries | GZIP : On ]