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
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'."
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
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.
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
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
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.
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
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.