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

Aktuelle Zeit: So Jul 06, 2025 02:09

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Fr Feb 07, 2003 17:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Ich versuche Windows Koordinaten in Gl Koordinaten umzuwandeln und habe folgendes geschrieben.

Code:
  1.  
  2.  
  3. procedure WinKoorToObjectKoor(x, y, z: integer; var Ox, Oy,Oz: Single);
  4.  
  5. var
  6.  
  7.   a,b : array [0..15] of glDouble;
  8.  
  9.   c : array [0..3] of glint;
  10.  
  11.   x1,y1,z1 : GLdouble;
  12.  
  13. begin
  14.  
  15.   glGetFloatv(GL_MODELVIEW_MATRIX,@a[0]);
  16.  
  17.   glGetFloatv(GL_PROJECTION_MATRIX,@b[0]);
  18.  
  19.   glGetIntegerv(GL_VIEWPORT,@c[0]);
  20.  
  21.   gluUnProject(x,y,z,@a[0],@b[0],@c[0],x1,y1,z1);
  22.  
  23.   Ox := X1;
  24.  
  25.   Oy := y1;
  26.  
  27.   Oz := z1;
  28.  
  29. end;
  30.  
  31.  

nur wenn ich die Procedure so aufrufe.
Code:
  1. WinKoorToObjectKoor(100,10,1,x,y,z)
dann bekomme ich für
x = 2,354461679758856E-41
y = NAN
z = 0

Wieso was habe ich falsch geamcht ???


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 07, 2003 21:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 06, 2002 20:27
Beiträge: 479
Wohnort: Bremen
versuchs mal mit Single oder glFloat anstatt glDouble. Dann hast du wenigstens schon mal die richtige Matrix im Array und bist ein stück weiter. ;)

_________________
Selber Denken macht klug!


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Feb 07, 2003 21:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Du vergisst eine sehr wichtige Zeile :
Code:
  1.  
  2.  
  3. glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,@z);
  4.  
  5.  

Die Zeile sollte zwischen folgende zwei Zeilen :
Code:
  1.  
  2.  
  3. glGetIntegerv(GL_VIEWPORT,@c[0]);
  4.  
  5. ...
  6.  
  7. gluUnProject(x,y,z,@a[0],@b[0],@c[0],x1,y1,z1);
  8.  
  9.  


Sie wird benötigt, um herauszufinden an welcher Z-Koordinate OpenGL deine 2D-Koordinaten in 3D-Koordinaten umwandeln soll.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Feb 10, 2003 14:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Zitat:
Du vergisst eine sehr wichtige Zeile :
Code:
  1.  
  2.  
  3. glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,@z);
  4.  
  5.  

Die Zeile sollte zwischen folgende zwei Zeilen :
Code:
  1.  
  2.  
  3. glGetIntegerv(GL_VIEWPORT,@c[0]);
  4.  
  5. ...
  6.  
  7. gluUnProject(x,y,z,@a[0],@b[0],@c[0],x1,y1,z1);
  8.  
  9.  


Sie wird benötigt, um herauszufinden an welcher Z-Koordinate OpenGL deine 2D-Koordinaten in 3D-Koordinaten umwandeln soll.

Ich bekomme aber das gleiche Ergebnis!!!

//Edit
und wenn ich es mit glFloat mache bekomme ich nur 0 als Ergebnis!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 10, 2003 14:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Bekommst du dieses Ergebnis immer, oder nur wenn du an eine Stelle klickst, an der nichts gezeichnet wurde?
Wenn im Z-Puffer an der Stelle auf die du geklikt hast nämlich "nix" drin steht, kann OpenGL ja schlecht wissen bei welcher Tiefe es deine Koordinaten zurückliefern soll.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 10, 2003 15:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Zitat:
Bekommst du dieses Ergebnis immer, ....

ja bekomme ich

Zitat:
..., oder nur wenn du an eine Stelle klickst, an der nichts gezeichnet wurde?
Wenn im Z-Puffer an der Stelle auf die du geklikt ...

Was meinst du mit klicken ich klicke nirgends wo hin.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 14, 2003 11:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
kann mir da keiner helfen ???

Wie macht ihr das denn?

Meine Sourcen sehen jetzt so aus :
Code:
  1.  
  2.  
  3. procedure WinKoorToObjectKoor(x, y, z: integer; var Ox, Oy,Oz: Single);
  4.  
  5. var
  6.  
  7.   a,b : array [0..15] of glDouble;
  8.  
  9.   c : array [0..3] of glint;
  10.  
  11.   x1,y1,z1 : GLdouble;
  12.  
  13. begin
  14.  
  15.   glGetFloatv(GL_MODELVIEW_MATRIX,@a[0]);
  16.  
  17.   glGetFloatv(GL_PROJECTION_MATRIX,@b[0]);
  18.  
  19.   glGetIntegerv(GL_VIEWPORT,@c[0]);
  20.  
  21.   glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,@z);
  22.  
  23.   gluUnProject(x,y,z,@a[0],@b[0],@c[0],x1,y1,z1);
  24.  
  25.   Ox := X1;
  26.  
  27.   Oy := y1;
  28.  
  29.   Oz := z1;
  30.  
  31. end;
  32.  
  33.  


Hier noch ein link zu einem Bild
<a href='http://hometown.aol.de/DelphiPic/hae.JPG' target='_blank'>http://hometown.aol.de/DelphiPic/hae.JPG</a>


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 14, 2003 11:58 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Ich glaub', Du hast Lithanders Post übersehen: glDouble ist der Falsche Datentyp (sonst hieße die Funktion die Du aufrufen müsstest ja glGetDoublev). Mach aus deinen glDouble-Typen einfach dlFloat. Denn Double ist 8 Byte, und Float (bzw. in Delphi Single) ist 4 Byte groß. Wenn nun 4 Byte weise geschreiben wird, erhalten die ersten 4 Byte Deines Doubles den ersten von OpenGL geliferten Float wert, und die 2. 4 Byte Deines Doubles den 2. Float wert. Und as führt dann eben zu komplett falschen Ergebnissen. Außerdem würd' ich sowieso von Double abraten (wenn möglich, wie in diesem Fall), denn Dobule ist langsamer als Single/Float, solange wir noch mit 32-Bit Prozessoren und 32-Bit Compilern arbeiten.

Also einfach glDouble durch glFloat ersetzen. Müsste dann funktionieren! Aber wie gesagt,das hat Lithander bereits geschrieben...

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 14, 2003 12:10 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
ups, das habe ich übersehen, sorry. Ich habe es jetzt geänder aber ich bekomme jetzt zu große zahlen raus hier nochmal ein link
<a href='http://hometown.aol.de/DelphiPic/bild2.JPG' target='_blank'>http://hometown.aol.de/DelphiPic/bild2.JPG</a>


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 14, 2003 12:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Ok, ein Blick in die OpenGL-SDK verrät, das gluUnProject alle Werte auser dem Viewport als Double erwartet. Hab' ich leider vorhin auch nicht gewusst. Also kommando zurück: alle glFloat in glDouble #ndern, bei glReadPixel ebenfalls GL_DOUBLE angeben und dann die Dobule-Funktion (glGetDoublev) verwenden. Logischerweise bekommst Du ewig lange Nachkommastellen. Die kannst Du aber dann mit Round entsprechend runden oder mit Trunc einfach abschneiden.

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 14, 2003 13:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
aha, habe es gesehen erwartet wird GLDouble. Ok habe es geänder aber es kommt das gleiche raus.
So sehen meine Sourcen zur Zeit aus :
Code:
  1.  
  2.  
  3. procedure WinKoorToObjectKoor(x, y, z: integer; var Ox, Oy,Oz: Double);
  4.  
  5. var
  6.  
  7.  &nbsp;a,b : array [0..15] of GLDouble;
  8.  
  9.  &nbsp;c : array [0..3] of GLint;
  10.  
  11.  &nbsp;x1,y1,z1 : GLDouble;
  12.  
  13. begin
  14.  
  15.  &nbsp;glGetDoublev(GL_MODELVIEW_MATRIX,@a[0]);
  16.  
  17.  &nbsp;glGetDoublev(GL_PROJECTION_MATRIX,@b[0]);
  18.  
  19.  &nbsp;glGetIntegerv(GL_VIEWPORT,@c[0]);
  20.  
  21.  &nbsp;glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,@z);
  22.  
  23.  &nbsp;gluUnProject(x,y,z,@a[0],@b[0],@c[0],x1,y1,z1);
  24.  
  25.  &nbsp;Ox := Round(X1);
  26.  
  27.  &nbsp;Oy := Round(y1);
  28.  
  29.  &nbsp;Oz := Round(z1);
  30.  
  31. end;
  32.  
  33.  

ach ja GL_Double kennt er nicht, deswegen steht da noch GL_Float.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 14, 2003 14:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
keine ahnung was ich noch mal soll!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 14, 2003 14:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Also ich wiederhole jetzt mal das, was ich schonmal gesagt hab :
An einer Stelle an der nix gezeichnet wurde, wird die OpenGL auch mittels gluUnproject() keine Koordinaten zurückliefern, da OpenGL ja nicht wissen kann an welcher Tiefenposition die Koordinaten errechnet werden sollen.
Die Methode funktioniert nur dann, wenn du an eine Stelle klickst, an der ein Objekt gezeichnet wurde, da du dann logischerweise auch gültige Informationen aus dem Tiefenpuffer bekommst.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 14, 2003 14:32 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ich hab das selbe problem auchschon seit ewigkeiten... mittlerweile kommt's mir fast so vor als wäre das nen OpenGL Fehler... denn ich hab nirgendwo etwas funktionierendes entdeckt...

ich hab tausende beispiele dafür getestet... nix hat geklappt... :(

Au'revoir,
Aya..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 14, 2003 15:01 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Zitat:
aha, habe es gesehen erwartet wird GLDouble. Ok habe es geänder aber es kommt das gleiche raus.  
So sehen meine Sourcen zur Zeit aus:

Da kann n variablenname irgendwie nicht stimmen:
Code:
  1.  
  2.  
  3.  &nbsp; ...
  4.  
  5.  &nbsp;glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_DOUBLE,@z);//z Ohne 1!
  6.  
  7.  &nbsp;gluUnProject(x,y,z,@a[0],@b[0],@c[0],x1,y1,z1);//z mit 1?!?
  8.  
  9.  

Zitat:
ach ja GL_Double kennt er nicht, deswegen steht da noch GL_Float.

Code:
  1.  
  2.  
  3.  &nbsp; GL_DOUBLE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = $140A;
  4.  
  5.  

Und weil du statt GL_DOUBLE, GL_FLOAT einsetzt, kann dein z(1/-) auch nie den richtigen Wert haben, da er einfach mit von der grösse nicht passendem unsinn beschrieben wird - oder in deinem fall: gar nicht


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 14 Queries | GZIP : On ]