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

Aktuelle Zeit: Mi Jul 16, 2025 21:13

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



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Mi Okt 12, 2005 14:08 
Offline
DGL Member

Registriert: Fr Aug 12, 2005 21:35
Beiträge: 42
Hallo

Ich bin im DGL Wiki auf der suche nach hilfe zur Funktion gluUnProject() auf folgenden code gestossen (orginal aus DGL Wiki):
Code:
  1. function WinPosTo3DPos(X, Y: Integer): TGLVectord3;
  2. var
  3.   viewport:   TGLVectori4;
  4.   modelview:  TGLMatrixd4;
  5.   projection: TGLMatrixd4;
  6.   Z:  Single;
  7.   Y_new:Integer;
  8. begin
  9.   glGetDoublev(GL_MODELVIEW_MATRIX, @modelview ); //Aktuelle Modelview Matrix in einer Variable ablegen
  10.   glGetDoublev(GL_PROJECTION_MATRIX, @projection ); //Aktuelle Projection[s] Matrix in einer Variable ablegen
  11.   glGetIntegerv(GL_VIEWPORT, @viewport ); // Aktuellen Viewport in einer Variable ablegen
  12.   Y_new := viewport[3] - y; // In OpenGL steigt Y von unten (0) nach oben
  13.  
  14.   // Auslesen des Tiefenpuffers an der Position (X/Y_new)
  15.   glReadPixels(X, Y_new, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @Z );
  16.  
  17.   // Errechnen des Punktes welcher mit den beiden Matrizen multipliziert (X/Y_new/Z) ergibt:
  18.   gluUnProject(X, Y_new, Z,modelview, projection, viewport,@Result[0], @Result[1], @Result[2]);                        
  19. end;


Was mich jetzt hier ein wenige verwirrt ist das X und Y als integer vorliegen und die funktion gluUnProject doch aber die ersten 3 werte als GLDouble haben möchte. Würde das beispiel so wie oben denn nun überhaupt gehen?

Danke,
Nico


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 12, 2005 14:27 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Delphi convertiert selbständig Integer in Floats. Wenn du C++ programmierst, dann musst du das natürlich, wie du bereits vermutest, mit den richitgen Typen machen. 8)

Und: Ja es sollte funktionieren....unter Delphi.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 12, 2005 14:28 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 21, 2003 17:36
Beiträge: 141
Die glReadPixels braucht Integer, weil sie von den eigentlichen Pixeln ausgeht, die gluUnProject ist jediglich rechnet jediglich die 2D-Koordinaten, die du angibst, in 3D-Koordinaten um. Mit glReadPixels erhälst du also den eigentlichen Punkt den du suchst in 2D, den du allerdings mit gluUnProject nur noch unformen brauchst.
Glaub nicht, dass sich das jetzt verständlich angehört hat, aber im Grunde ist es ja so :) glReadPixels liest die Tiefe an einem Pixel aus und gluUnProject rechnet diesen Punkt dann in 3D-Welt-Koordinaten um, deshalb auch die Gleitkommazahl. Wieso gluUnProject allerdings Double statt Single verwendet frag ich mich auch ...
Und ja, das Beispiel würde funktionieren ;)


Beachte: Keine Garantie auf Richtigkeit der Informationen. Die Erklärung basiert nur auf dem, was ich mit so zusammengedacht habe ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 12, 2005 14:33 
Offline
DGL Member

Registriert: Fr Aug 12, 2005 21:35
Beiträge: 42
erst mal danke für die schnellen antworten!
das derzeitige project mach ich halt gerade mal nich in delphi und daher muß ich immer erst mal alles von einer sprach in die andere bringen in der hoffnung das es dann auch geht.
Mich hat halt nur gewundert das gluUnProject die x und y werte als GLDouble haben möchte da man die ja normalerweise immer als integer vorliegen hat.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 13, 2005 17:28 
Offline
DGL Member

Registriert: Fr Aug 12, 2005 21:35
Beiträge: 42
Ich habe jetzt die ganze zeit mit gluUnProject() versucht die Cursordaten in objectdaten zu wandeln doch habe ich von gluUnProject() immer den fehler GL_INVALID_OPERATION bekommen. Nun habe ich rausgefunden das es mit der funktion glScalef() zusammen hängt (dies nutze ich um zu zoomen). wenn ich glScalef() weg lasse ght auch gluUnProject() richtig.
Nun meine frage wie kann ich entweder anders zoomen ohne mit glScalef() zu arbeiten oder wie schaffe ich es das gluUnProject() auch geht wenn ich glScalef() verwende?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 13, 2005 20:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Wieso nicht einfach das Objekt näher an deine Sicht schieben?
Das ist ja eigtl. richtiges Zoomen... oder?

Dann denke ich müsste es ja funktionieren ;)

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 14, 2005 19:25 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
zoomen (also zB fernglas) erreicht man über eine reduzierung des Blickwinkels (GluPerspective).
das objekt näher an die Kamera zu schieben ist kein richtiges realistisches zoomen, dadurch könnte man ja zB auch durch wände zoomen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 15, 2005 20:27 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Poste mal bitte den Codeausschnitt. Da in der Spezifikation von gluUnProjekt keine Fehler verzeichnet sind, würde es mich wundern, wenn gluUnProjekt oder glScale das problem wären.

Oh....Ich glaub ich habs: Du rufst garantiert glScale zwischen glBegin und glEnd auf oder? Guck mal ins Wiki was OpenGL dann macht... 8)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 15, 2005 20:33 
Offline
DGL Member

Registriert: Fr Aug 12, 2005 21:35
Beiträge: 42
nee nee ich rufe glScalef()nich zwischen glBegin() und glEnd() auf.
Es liegt aber 100% an glScalef() da es funktioniert wenn ich glScalef() weg lasse.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 15, 2005 21:05 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Na dann bitte mal etwas Code.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 17, 2005 15:43 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Also mit glScale und gluUnProject sollts nur Probleme geben wenn du eine Achse mit 0 skalierst, da dann die Matrix singular (also nicht invertierbar) wird. Aber ich hoffe mal dass du das ohnehin nicht machst :-).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 17, 2005 16:50 
Offline
DGL Member

Registriert: Fr Aug 12, 2005 21:35
Beiträge: 42
Lyr hat geschrieben:
Also mit glScale und gluUnProject sollts nur Probleme geben wenn du eine Achse mit 0 skalierst, da dann die Matrix singular (also nicht invertierbar) wird. Aber ich hoffe mal dass du das ohnehin nicht machst :-).


Lustig jetzt wo dus schreibst sehe ich das ich den z-wert bei glScalef() auf 0.0 stehen hatte. habe das soeben mal geändert und siehe da nun geht auch gluUnProject().
Danke für den tip!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 17, 2005 18:44 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
War das ein versehen, oder hast du das mit Absicht auf 0.0 gesetzt? Weil das geht ja nunmal gar nicht. Ich hoffe das war aus unseren Tutorials ersichtlich. ....Ich guck gleich nochmal nach und bringe vielleicht nen entsprechenden Hinweis im Tutorial bzw. Der Funktionspezifikation unter...

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 17, 2005 18:47 
Offline
DGL Member

Registriert: Fr Aug 12, 2005 21:35
Beiträge: 42
Na ja :oops: ich benutze glScalf() nur für den zoom und da baruch ich ja den z-wert nich also hatte ich den einfach auf 0.0 gestetzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 17, 2005 19:00 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Könntest du das mit den Singulären Matrizen nochmal Probieren: Klingt vielleicht komisch, aber, die Fehlermeldung ist nirgendwo dokumentiert. Ich würde dich deshalb nochmal bitten folgende Befehle auf eine singuläre Matrix anzuwenden:

gluProject
gluUnProject
gluPerspective
glOrtho, gluOrtho2D
glMultMatrix

Es können ruhig auch andere Leute mal probieren. Ziel soll sein, herauszufinden welche Fehlermeldung OpenGL bringt, und ob diese Meldung immer gleich ist. Diese Informationen sind in der Spezifikation nicht(!) enthalten. Ihr seid somit Forscher an der vordersten OpenGL Front.

Bitte Postet eure Ergebnisse hier.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 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.010s | 16 Queries | GZIP : On ]