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

Aktuelle Zeit: Di Jul 15, 2025 21:03

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Probleme mit GluUnProject
BeitragVerfasst: Sa Feb 18, 2006 21:38 
Offline
DGL Member

Registriert: Sa Dez 24, 2005 15:38
Beiträge: 7
Wie der Titel schon sagt komm ich mit diesem Befehl nicht richtig klar. Mein Ziel ist ersteinmal einfach zu schauen ob ich ein bestimmtes Quadrat angeklickt habe. Das Quadrat befindet sich bei (1,1,-20), (1,-1,-20), (3,-1,-20), (3,1,-20).
Das wird auch wunderbar gezeichnet aber ich schaffe es nicht die 2d Mauskoordinaten in brauchbare 3d Koordinaten umzurechnen.
Mit unten stehendem Code bekomm ich bei den Mauskoordinaten 647 X | 335 Y folgende Ergebnisse als Objektkoordinaten:
X : 0,000694098948026
Y : 0,000251932194178
Z : -0,004766444229897
Die Werte ändern sich auch so gut wie gar nicht egal wohin ich klicke. Sowie ich das verstehe kann mein Fehler nur in der übergebenen Z Koordinate liegen, denn dabei ist mir auch nicht ganz klar was ich dort übergeben muss. Den Readpixel Befehl der im Tutorial verwendet wird, müsste ich mir ja eigentlich schenken können, da ich ja weiss das sich das Quadrat bei Z = -20 befindet.
Ich hab mir zich Threads zu dem Thema hier durchgelesen bin aber aus keinem wirklich schlau geworden :/
Hoffe mal das mir jemand auf die Sprünge helfen kann :)

Code:
  1.  
  2. procedure TButton.OnClick(Mousestate:TSDL_MouseButtonEvent);
  3. var
  4.   viewport  : TGLVectori4;
  5.   modelview : TGLMatrixd4;
  6.   projection: TGLMatrixd4;
  7.   result:Array[0..2] of TGLDouble;
  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.   gluUnProject(Mousestate.x, (ViewPort[3]- Mousestate.y), -20,@modelview, @projection, @viewport,@Result[0], @Result[1], @Result[2]);
  13.   log.LogStatus('X1 : ' + FloatToStr(Result[0]),'UnProject');
  14.   log.LogStatus('Y1 : ' + FloatToStr(Result[1]),'UnProject');
  15.   log.LogStatus('Z1 : ' + FloatToStr(Result[2]),'UnProject');
  16. end;
  17.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 18, 2006 22:40 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Dafür brauchst du Selection. Mit gluUnproject kannst du nur 2D-Koordinaten in 3D-Koordinaten umrechnen lassen. Es ist wirklich eine reine Rechnerei, daher steht es auch in der glUtility-Library (der glu). daher wird auch die Z-Komponente benötigt, die man mit ReadPixels auslesen kann.

Um festzustellen, ob du ein Objekt angeklickt hast, hilft dir UnProject jedoch nur in Spezialfällen (z.B. mit einer Ebene) weiter. Ansonsten musst du Selection verwenden.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 19, 2006 01:45 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Und bevor die Frage kommt ;) :

Zu Selection gibts ein Tutorial: Tutorial_Selection
und einen Wiki-Artikel: Selection

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 19, 2006 10:16 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Zitat:
Um festzustellen, ob du ein Objekt angeklickt hast, hilft dir UnProject jedoch nur in Spezialfällen (z.B. mit einer Ebene) weiter. Ansonsten musst du Selection verwenden.


Das stimmt so nicht. Genauer ist gluUnProject sogar die schönste Variante Selektion umzusetzen, denn der Selektionsmodus von OpenGL ist unendlich langsam, schließlich muss man alles doppelt zeichnen. Man kann doch ganz einfach eine Gerade ermitteln, die von der NearclippingPlane zur Farclippingplane verläuft. Dann muss man nur noch prüfen, welche Polygone bzw. Objekte getroffen werden. Wie genau die Selektion am Ende sein soll kann man so auch festlegen, indem man z.B. nur gegen die BoundingVolumes prüft oder gegen jedes Polygon selbst. In jedem Fall erhält man einen riesigen Zeitgewinn im Vergleich zur Nutzung des OpenGL-Selektionsmodus.
Daher verstehe ich auch nicht, warum der OpenGL-Selektionsmodus hier immer so empfohlen wird. Einfacher ist die Umsetzung damit schließlich auch nicht.

Dein Fehler liegt im Aufruf von gluUnProject selbst. Der Z-Wert der NearClippinglane liegt bei 0 und der Z-Wert der Farclippingplane bei 1.
-20 ist also nicht der Wert, den du benötigst. Du musst die Werte entsprechend umrechnen. Oder du stellst wie von mir beschrieben eine Gerade auf. Das macht die Verwaltung auch einfacher, weil du nur einmal eine Gerade ermitteln musst und damit dann jedes Primitiv auf Selektion überprüfen kannst. Außerdem kannst du die Szene nach belieben rotieren und die Selektion funktioniert weiterhin.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 19, 2006 13:04 
Offline
DGL Member

Registriert: Sa Dez 24, 2005 15:38
Beiträge: 7
Hab jetzt anstatt den -20 das Ergebnis von glReadPixels(X, ViewPort[3] - Y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @Z ); an GluUnProject übergeben, aber irgendwie passt das immernoch nicht.
Wenn ich jetzt irgendwo in das gezeichnete Quadrat klicke bekomm ich diverse Koordinaten mit immer dem selben Z Wert raus, was ja auch korrekt ist. Dieser Z Wert variiert jedoch mit jedem Programmstart zwischen ~ 9 und ~ -1 . Die Koordinaten die da rauskommen liegen in keinem Fall auf dem gezeichneten Quadrat.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 19, 2006 17:03 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Magellan hat geschrieben:
Daher verstehe ich auch nicht, warum der OpenGL-Selektionsmodus hier immer so empfohlen wird. Einfacher ist die Umsetzung damit schließlich auch nicht.


Weil es dazu kein Selektion-Tutorial gibt, und man lieber das nimmt, was man vorgegeben bekommt. Geht mir auch so. Hab bisher auch nur mit der Selktion gearbeitet die GL anbietet. Aber ich sag mal ein Tutorial Selection2 sammt schönen Code, und schon würde der ein oder andere die von dir vorgeschlagene Methode verwenden. ;)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 19, 2006 19:00 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Also ich habe das ganze eben noch einmal versucht nachzuvollziehen und bei mir klappt es wunderbar. Ich kann mir nicht vorstellen, wo bei dir der Fehler liegt. Ist Z auch wirklich vom Typ Single? Ansonsten bin ich ratlos. Prüfe vielleicht noch mal ob die von dir berechneten Koordinaten (X, Y, MouseState – Wieso eigentlich verschiedene Positionsangaben?) auch wirklich stimmen.

Zitat:
Aber ich sag mal ein Tutorial Selection2 sammt schönen Code, und schon würde der ein oder andere die von dir vorgeschlagene Methode verwenden.

Ein Tutorial zu diesem Thema ist doch wirklich übertrieben. Schließlich muss nichts weiter getan werden als zu überprüfen ob eine Gerade ein Objekt schneidet. Zumal jeder seine Objekte sowieso anders verwaltet.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 19, 2006 21:27 
Offline
DGL Member

Registriert: Sa Dez 24, 2005 15:38
Beiträge: 7
Arghl, das mit den verschiedenen Positionsangaben war natürlich Quatsch. Anstatt X hätte es da Mousestate.X heissen müssen . Jetzt bekomm ich auch das richtige Ergebnis raus. Danke für die Hilfe :)

Ich fände ein Tutorial zu dem Thema übrigens auch gut, da sich solche Fragen dann erübrigen würden und es gibt ja doch einige Threads in denen Leute mit GluUnProject Probleme haben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 20, 2006 11:12 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Magellan hat geschrieben:
Ein Tutorial zu diesem Thema ist doch wirklich übertrieben. Schließlich muss nichts weiter getan werden als zu überprüfen ob eine Gerade ein Objekt schneidet. Zumal jeder seine Objekte sowieso anders verwaltet.

Ich finde es gar nicht so einfach die Schnittpunkte zu berechnen. Da muss man sich durchaus schonmal bissl mit der Materie auseinadnersetzen. Ein Tutorial wäre da schon hilfreich.

Tutorials müssen nicht immer riesig sein (wie die Bomberman-serie, oder das GLSL Tut von Sascha) es reichen auch kurze knappe beschreibungen (z.B. Saschas Frustum-Culling-Tutorial). Wichtig is was drinnensteht. ;)

_________________
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  [ 9 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]