Hi, habe jetz eine Weile hier im Forum nach dieser Art des Selections gestöbert und angefangen, das bei mir mal umzusetzen.
Nur hackt es momentan am glReadPixels..
Ich zeichne zuerst meine Szene und dann im Klickevent lese ich ein paar Pixel aus:
Wenn ich damit auf ein grünes Quadrat klicke, bekomme ich immer nur Nullen als Inhalt des Buffers.. Irgendwie bin ich durch die Verwendung von readPixels noch nicht ganz durchgestiegen.. Danke schonmal
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Der Ursprung des Koordinatensystems in OpenGL liegt unten links und nicht oben links wie bei Windows, also musst du deine Y-Koordinate von der Höhe des Viewports abziehen. Ansonsten sieht alles korrekt aus, ich persönlich lese jedoch immer nur einen Block von 1x1 Pixeln und auch als Byte ohne Alpha (braucht man für die Farbselektion nicht).
Bringt auch alles nichts
Hab ich viellecht vorher schon einen Fehler gemacht? Also soweit, dass ich damit jetzt schon Colors fürs Selecten Picken will, bin ich ja noch gar nicht. Im grunde soll das nur mal ein Test sein, ob ich ueberhaupt die Farbe eines Pixels rausbekomm. Also müsste diese Methode mir doch Farbe angeben, wenn ich auf ein Gründes Quadrat klick oder?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Lösche mal deine Szene mit ner anderen Farbe als Schwarz und mach nen ReadPixels und schau nach ob dort immer noch 0 drinne steht oder jetzt die Löschfarbe, damit kannst du zumindest ermitteln ob dein Problem beim ReadPixels oder wo anders liegt. Ansonsten sieht dein Code in Ordnung aus, probiers aber mal wie ich mit Bytes anstatt Floats und schau nochmal.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Richtiger Puffer (mal testweise GL_FRONT probieren)? Richtiger Verweis auf den Pixelpuffer? Auf OpenGL-Fehler überpprüft? Wann wird glReadPixels aufgerufen? Koordination innerhalb des Viewports?
Puffer sowohl Front als auch Back getestet
Verweis auf Buffer: so würd ich ihn initalisieren, aber ob das so richtig ist, weiss ich nicht
Aufruf von Readpixels: während des klickereignisses. Szene ist bereits gezeichnet
Koordinaten im Viewport: Viewport ist das komplette Fenster, also ja
OpenglFehler?:GL_INVALID_OPERATION
ich weiss allerdings nicht, woher der kommt.
Laut Wiki:
Zitat:
GL_INVALID_OPERATION wird generiert wenn format GL_COLOR_INDEX ist und der Farbpuffer RGBA Werte enthält. GL_INVALID_OPERATION wird generiert wenn format GL_STENCIL_INDEX ist und kein Schablonen-(/Stencil-)Puffer existiert. GL_INVALID_OPERATION wird generiert wenn format GL_DEPTH_COMPONENT ist und kein Tiefenpuffer existiert. GL_INVALID_OPERATION wird generiert wenn glReadPixels innerhalb eines glBegin-glEnd Blocks aufgerufen wird.
die ersten drei entfallen. und zwischen begin und end wirds auch nicht aufgerufen
Okay ich habs. Wahrscheinlich lag der Fehler tatsächlich daran, dass ReadPixels während Begin und End aufgerufen wurde und ich habe es nihct gleich mitbekommen, weil die AWTEventQueue ein paralleler Thread zum OGLThread ist. Ich habe also beim Event lediglich eine "Notiz" hinterlassen, dass geklickt wurde und diesen Klick dann im OGLThread dann mit Readpixels verarbeiten lassen. Und siehe da, ich bekomme zahlen
Ich hab mit OpenGL unter Java zwar kaum Erfahrungen - für Swing und Konsorten gilt aber: Wenn du eine GUI hast, dann lass die ganze Anwendung im AWTEventQueue-Thread laufen. Es sei denn, sie ist speziell auf Multithreading ausgelegt, was ich jetzt mal nicht bei dir annehme
Für sowas gibt's ja SwingUtilities.invokeLater (...);
Oder werf mal einen Blick in das "neue" concurrency-package. Da sind tolle Sachen für diese Probleme drin, könnten vielleicht nützlich sein
_________________ "Für kein Tier wird so viel gearbeitet wie für die Katz'."
Also bisher wüsste ich nicht, dass man den OGL Thread irgendwie in den AWt reinbekommt, aber muss ich mal nachforschen^^
Ich hab noch eine Frage zu dieser Colorpick methode:
Wie ist genau die vorgehensweise?
Ich habe es folgendermaßen verstanden:
Ich rendere meine Objecte mit zufaelligen Farben. Danach überzeichne ich sie normal wie ich sie haben will und beim Pick kommt dann die richtige Farbe raus. Klingt n bisschen komisch...
Irgendwie habe ich da ein paar Lücken drin.
Wird da irgendetwas mittels Backfaceculling weggemacht? Etwa das gefärbte Object? Hab das in irgendeinem Thread gelesen..
Und dann: bekomme ich die "unique" farbe überhaupt noch heraus, wenn ich a) mit der richtigen drüber zeichne oder sie b) wegculle?
Oder ist es vielmehr so, dass ich immer nur das zeichne, was ich wirklich sehen will und beim onclick zeichne ich einmal das ganze in unique farbe und hole die richtige farbe heraus?
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7804 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wenn du klickst, renderst du deine Szene neu.
Du schaltest alles aus was du nicht brauchst (Texture, Licht, Blending), du solltest vielleicht sogar noch eine Schablone erzeugen, welche nur den Bereich rund um den Curser beschreibbar läßt. Du solltest Flat-Shading einschalten (glShadeModel).
Alle Objekte bekommen von dir eine Farbe. Diese Farbe musst du natürlich irgendwo speichern, damit du später wieder weißt was du überhaupt getroffen hast.
Du zeichnest dann die Szene einmal. Ließt die Farbe aus und berechnest was getroffen wurde.
Vor dem nächsten Zeichnen machst du alle Änderungen wieder rückgängig. (Licht wieder an, Texturen wieder an, etc.)
Einen Algorithmus zum erzeugen der Farben für deine Objekte kann primitiv sein. z.B. fängst du bei (1,0,0) (Bytewerte) and und zählst nach oben bis (255,0,0). Dann gehts weiter bei (255,1,0) usw.
Auch wenn du die Farben nicht auseinander halten kannst, sind die Werte für den Rechner deutlich unterschiedlich.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Ich bekomms einfach nicht hin ^^ Also hier mla ein bissel Quellcode:
Sobald der Mouseklick erfolgt, wird der Modus des Renderers auf Selection gesetzt. Beim nächsten Rendern wird, die Selectionsfläche gezeichnet. Punkt wird schonmal gemerkt.
Ich habe das ganze mit dem Swapbuffers und ohne getestet. Das Resultat ist imemr das selbe: Die getroffene Farbe ist imemr die, mit der die Objekte eigentlich gezeichnet werden, aber nicht die Farbe, die ich ihnen zugewiesen habe..
Als beispielszene habe ich 4 Quadrate, die alle kunterbunte Uniquefarben haben, und in der richtigen Szene grün sind.
Wenn ich das ganze teste, kommt der folgende Output:
228 238 186 0 // die vier bunten farben, die mein Selectionmanager sich gemerkt hat
195 210 212 0
128 232 230 0
131 171 253 0
--------
72 90 52 0 // die eine farbe im Klickbereich, die eine der vier oberen seien müsste, aber die ist, mit der die Szene wirklich gezeichnet wird
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Wenn du aus dem hinteren Puffer liest ist ein Swapbuffers natürlich überflüssig. Ansonsten liefert dir Readpixels genau dass was man auif dem Bildschirm sieht, also lass dir mal rendern was während der Selektion gezeichnet wird (evtl. überschreibst du irgendwo die Einstellungen für die Selektion).
Und als kleiner Tipp : Für die Farbselektion sollte man auf keinen Fall die RGB-Werte in 1er Schritten durchgehen, denn spätestens wenn jemand das Programm mit aktiviertem AA laufen lässt bekommt man an den Rändern mit Sicherheit leicht andere Farbwerte als die des Hauptobjektes und dann kann ein Hochzählen mit 1 zu falscher Auswahl führen. Hier muss man halt ein passendes Delta finden.
Mitglieder in diesem Forum: 0 Mitglieder und 10 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.