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

Aktuelle Zeit: Di Jul 08, 2025 10:35

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Apr 09, 2007 19:07 
Offline
DGL Member

Registriert: Sa Okt 28, 2006 14:44
Beiträge: 39
Hallo

ich verwende glReadPixels(X,Y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,@Z) zum Auslesen der Tiefe eines Pixels, doch mach ich entweder was gründlich falsch, oder die Funktion liefert die Tiefe nicht als Weltkoordinate (also nicht als Entfernung in der gleichen Einheit wie die ganzen Vertex-Angaben).

Um jedoch damit mittels gluUnproject weiterrechnen zu können, brauch ich Z so (denk ich wenigstens), oder aber als Wert zwischen 0 und 1.

Kann mir jemand weiterhelfen, wie ich das umrechnen kann oder was ich falsch verstanden habe?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 10, 2007 09:28 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Hast du den Artikel schon gelesen?
http://wiki.delphigl.com/index.php/gluUnProject

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 10, 2007 13:52 
Offline
DGL Member

Registriert: Sa Okt 28, 2006 14:44
Beiträge: 39
Ja, nur dass das Beispiel bei mir aus irgendeinem Grund Mist liefert.

Hier mal meine Modifikation des Beispiels:

Code:
  1.  
  2.  
  3. type
  4.   TVector = record x,y,z:Single end;
  5.  ...
  6.  
  7. var
  8.   modelview: TGLMatrixd4;
  9.   viewport  : TGLVectori4;
  10.   projection: TGLMatrixd4;
  11.  ...
  12.  
  13. function  getDepth(X,Y:Integer):Double;
  14. var
  15.    Y_new     : TGLInt;
  16. begin
  17.    y_new := viewport[3] - y;
  18.    glReadPixels(X,Y_new,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,@Result);
  19. end;
  20.  
  21. function  Unproject(X,Y:Integer;Z:Double): TVector;
  22. var
  23.    Y_new     : TGLInt;
  24.    ox,oy,oz: Double;
  25. begin
  26.    Y_new := viewport[3] - y;
  27.    gluUnProject(X,Y_new,Z,modelview,projection,viewport,@ox,@oy,@oz);
  28.    Result:=ToTVector(ox,oy,oz);
  29. end;
  30.  
  31. procedure RenderScene;
  32. begin
  33.    glMatrixMode(GL_MODELVIEW);
  34.    glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
  35.    glRotatef(Pos.hdir,0,1,0);
  36.    glTranslatef(Kamera.x,Kamera.y,Kamera.z);
  37.    glGetDoublev(GL_MODELVIEW_MATRIX, @modelview);
  38.   ...
  39. end;
  40.  
  41. procedure TGLForm.FormResize(Sender: TObject);
  42. begin
  43.   glMatrixMode(GL_PROJECTION);
  44.   glLoadIdentity;
  45.   glViewPort(0, 0, ClientWidth, ClientHeight);
  46.   gluPerspective(45.0, ClientWidth/ClientHeight, 0.5, 1000);
  47.   glGetDoublev(GL_PROJECTION_MATRIX, @projection);
  48.   glGetIntegerv(GL_VIEWPORT, @viewport);
  49.   glMatrixMode(GL_MODELVIEW);
  50. end;
  51.  
  52. procedure TGLForm.PanelMouseDown(Sender: TObject; Button: TMouseButton;
  53.    Shift: TShiftState; X, Y: Integer);
  54. var z:Double;
  55.       vec:TVector;
  56. begin
  57.   z:=getDepth(x,y);
  58.   vec:=UnProject(x,y,z);
  59.   ...
  60. end;
  61.  
  62.  


Den Umweg über die Funktion getDepth mache ich, weil ich die Funktion UnProject später für reine Richtungsvektoren brauche, bei denen die Länge keine Rolle spielt.
Wenn jemand mir da weiterhelfen kann, wäre ich sehr dankbar.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 10, 2007 14:49 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
glReadPixels normiert auf [0;1]. Wenn Du den Wert mit znear und zfar verwurstelst, solltest Du den tatsächlichen z-Wert bekommen.
Allerdings kannst Du gluUnProject mehrmals rufen, also in GetDepth und Unproject.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 10, 2007 15:03 
Offline
DGL Member

Registriert: Sa Okt 28, 2006 14:44
Beiträge: 39
Ich brauche einen Z-Wert, mit dem ich über gluUnproject weiterarbeiten kann, und den liefert glReadPixels anscheinend nicht.

Jedenfalls hab ich mal den Result-Punkt von gluUnproject mit einer Kugel in der gerenderten Szene markiert;
und er lag zwar immer unter dem Cursor, aber der Abstand zur Kamera war bei weitem zu gering.Der Punkt hat praktisch auf der Linse geklebt.
Wenn ich allerdings einen Wert über 1 manuell als Z-Wert eingegeben habe statt getDepth zu verwenden, war die Kugel schon außerhalb des Sichtfeldes.

BTW: kann es sein, dass Y_new in dem Wiki-Beispiel TGlInt sein muss und nicht TGlDouble?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 10, 2007 16:33 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Eher X und Y GLDouble. Integer und Double brauchen zwar jeder 32 Bit, sind aber unterschiedlich 'formatiert'. Wenn Du jetzt einen Integer als Double übergibst, geht das schief. Versuch mal vor dem gluUnProject die Übergabewerte X und Y in einen GLDouble zu schreiben.
Normalerweise klappt die Zuweisung von nem Int auf einen Double in Delphi (dabei verliert man dann aber u.U. signifikante Stellen), aber das gluUnProject ist immerhin eine Funktion in einer DLL, da weis man nie, wie der Wert interpretiert wird. Laut Wiki müssen winX, winY und winZ GLDouble sein.
Das selbe Problem hast Du wenn du schreibst dMyDouble:=double(iMyInt). Da kommt auch Murks raus.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 10, 2007 18:55 
Offline
DGL Member

Registriert: Sa Okt 28, 2006 14:44
Beiträge: 39
Ich glaub ich weiß was mein Problem sein kann:

Da ich ReadPixels außerhalb der Renderprozedur verwende, wird bis dahin immer schon SwapBuffers(GLForm.FDC) ausgeführt, was meines Verständnisses nach Front- und Backbuffer vertauscht. ReadPixels greift damit auf den nicht mehr aktuellen Backbuffer zu und liefert irgendeinen unsinnigen/leeren Wert zurück.

Zwei Fragen:
1. Kann das stimmen?
2. Wenn das stimmt, wie kann man trotzdem auf das richtige Bild und dessen Tiefenbuffer zugreifen?


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.010s | 15 Queries | GZIP : On ]