PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : opengl selection/picking


rotalever
2006-08-19, 15:59:54
Wenn ich eine große 3D-Scene habe, z.B. eine dreidimensionales Terrain, und ich möchte erkennen auf welche Stelle der 3D-Scene ich gerade mit der Maus zeige/klicke, dann kann ich das ja zum Beispiel mit dem OpenGL-selectionBuffer und dem NameStack machen (glSelectBuffer(BUFSIZE, selectBuf); glRenderMode(GL_SELECT);). Allerdings kommt es mir so vor, dass dies sehr viel Zeit beansprucht, sprich die Renderleistung (fps) sinkt stark ab. Gibt es noch irgendwelche anderen Methoden um solch ein Auswahl über die Maus zu machen, die weniger Performance fressen?

Expandable
2006-08-19, 16:31:28
Sowas gibt es? Wusste ich gar nicht. Ist das überhaupt hardware-beschleunigt?

Anyway, Du kannst aus der Position der Maus und dem Bildschirmmittelpunkt eine Linie berechnen. Wenn Du die Inverse der Projektionsmatrix berechnest, kannst Du diese Punkte zurückrechnen, Dir daraus eine Gerade basteln und schauen, welches Objekt diese Gerade als erstes schneidet.

Das gibt's im Internet bestimmt irgendwo genauer.

tokugawa
2006-08-19, 16:33:27
Ja, du könntest eigenes Ray-Picking implementieren, und dies über hierarchische Bounding-Volumes optimieren.

Im Endeffekt schießt du dort einen Strahl vom Augpunkt in die Szene an der Stelle des Mauscursors (gluUnproject hilft da), und schneidest dieses mit den Objekten in der Szene (wobei man zur Optimierung Spatial Subdivision benutzen kann sowie eine Hierarchie an Bounding Volumes, ähnlich normaler Collision Detection).

Soweit ich weiß rendert der Selection-Buffer quasi einen ID-Buffer, und braucht dann ein Framebuffer-Readback, was natürlich die Performance sinken lässt.

rotalever
2006-08-19, 16:44:13
Das mit dem Ray-Picking ist eine gute Idee, ich werde mal versuchen ein bisschen mehr darüber rauszufinden und das dann mal implementieren, dann ist es ja vielleicht schneller.
Soweit ich weiß rendert der Selection-Buffer quasi einen ID-Buffer, und braucht dann ein Framebuffer-Readback, was natürlich die Performance sinken lässt.
Du meinst bei der OpenGL-Variante, die ich momentan benutze? - Ich glaube das geht wohl so.
Für 2^16 Objekte braucht der über 100 Millisekunden, bei einem Namestack mit 64 Elementen...

Asmodeus
2006-08-19, 16:48:07
Wenn man längerfristige Sachen in OpenGL plant, dann sollte man selection/picking sowieso besser von Hand implementieren (einige Möglichkeiten wurden ja schon genannt) und nicht auf die OpenGL-Methoden zurückgreifen. Denn es steht quasi schon fest, dass genau dieses Feature in OpenGL LM ("OpenGL 3.0") nächstes Jahr nur noch über den softwareseitigen Kompatibilitätslayer läuft und somit sicher eher nicht besonders schnell ausgeführt wird.

Gruss, Carsten.

rotalever
2006-08-19, 16:53:32
Naja, mit diesem OpenGL-Selection Mode kommt man eh nicht weit, so langsam wie der ist, und wenn der ab OGL 3.0 auch noch abgeschafft wird, dann hat das sicher einen Grund. Irgendwo hab ich auch gerade gelesen, dass Ray Picking wohl das schnellste sei. Dann werde ich das mal näher betrachten, vielleicht gibts da auch noch irgendwo ein paar tipps dazu oder so...

Gast
2006-08-19, 17:44:44
Öhm das ist im Prinzip das gleiche wie Raytracing nur mit Primary Rays. Dazu wirst sicher einiges finden ;)

rotalever
2006-08-19, 18:27:07
hab auch schon was gutes gefunden:
http://www.cs.princeton.edu/courses/archive/fall00/cs426/lectures/raycat/sld016.htm (und die folgenden seiten)

tokugawa
2006-08-19, 20:38:44
Der Vorteil vom Selection Buffer war halt die Pixelgenauigkeit (das Raypicking wird eventuell etwas an numerischer Ungenauigkeit leiden). Raypicking ist dafür ziemlich portabel nutzbar - ich verwende die Picking-Funktionen meiner Engine z.B. aus OpenGL-Zeiten mittlerweile in einer DirectX9-Engine.

Ich hab allerdings das Picking mittels Selection Buffer nur für Dinge wie Tools/Editoren benutzt, wo ja die Geschwindigkeit weniger wichtig ist.

rotalever
2006-08-19, 20:50:32
Naja, ob das nun ein pixel unterschied ist, dass merkt eh keiner... Selection Buffer ist halt einfach wegen der Geschwindigkeit nicht zu gebrauchen. Außerdem kann ich über das Ray Picking auch direkt wissen, auf welchen genauen Punkt der Dreiecksfläche ich geklickt habe, was auf jeden Fall von Vorteil ist.

tokugawa
2006-08-19, 21:10:24
Naja, ob das nun ein pixel unterschied ist, dass merkt eh keiner... Selection Buffer ist halt einfach wegen der Geschwindigkeit nicht zu gebrauchen. Außerdem kann ich über das Ray Picking auch direkt wissen, auf welchen genauen Punkt der Dreiecksfläche ich geklickt habe, was auf jeden Fall von Vorteil ist.

Da hast du recht, im Spiel selbst auf jeden Fall.

In einem Editor ist die Geschwindigkeit dagegen nicht so wichtig wie die Genauigkeit. Da hatte ich auch mit Selection Buffer eigentlich eine mehr als brauchbare Geschwindigkeit.

rotalever
2006-08-19, 21:48:54
Stimmt, im Editor ist es wichtig. Und für so sachen wie GUI oder so fragt man ja die Koordinaten direkt ab.

Ich sitzte seit einer Stunde dran und wundere mich warum es nicht funktioniert und finde den Fehler nicht. Und was fällt mir jetzt gerade auf: statt die y-Koordinate der Maus hab ich die X-Koordinate benutzt.... :eek: