Wie bestimme ich, was berührt wird, die in 3D aus dem Bildschirm?
Wie nutze ich den gl.gluUnproject in meinem OpenGL ES 1.1 android app, um zu bestimmen, was markiert ist, wenn der Benutzer den Bildschirm berührt?
Mein Verständnis ist, dass die touch-event-Ergebnisse in einer Zeile und ich finde das erste "Ding", das es schneidet.
Gibt es irgendwelche tutorials, wie Sie dies tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie das tun, 2D-zu-3D-picking, Sie brauchen, zu hantieren mit Matrizen und Vektoren ein bisschen. GlUnproject existiert nicht für OpenGL ES 1.1, so dass Sie haben zu tun, einige in der Mathematik selbst.
Strahl-Objekt Schnittpunkt ist ein Weg zu gehen, dann. Timmmms Antwort deckt bereits einige, aber es gibt mehr. Idee ist, erstellen Sie ray in 3D aus 2D-Koordinaten. Inversen view-matrix und Projektions-matrix benötigt. Sobald Sie haben ray, Sie können ray-intersection-test Ihrer Wahl und natürlich müssen Sie am nächsten Objekt wie bei Timmmm ist Punkt 4. Bounding spheres und bounding-Boxen sind leicht zu implementieren, und das internet ist voll von Kreuzung test-tutorials für Sie.
Dieses picking tutorial ist für DirectX, aber Sie könnten auf die Idee kommen. Ray-Bau Teil ist am wichtigsten.
Bearbeiten
Android implementiert eine eigene version gluUnproject. Es kann verwendet werden, um ray, indem Sie es für near und far plane (0 und 1) und Subtraktion in der Nähe von Flugzeug-Ergebnisse von weit Ebene Ergebnisse zu bekommen, ray ' s Richtung. Ray Herkunft ist anzeigen Standort. Mehr hier.
Ich denke für die meisten Anwendungen, die Sie gehen sollten, für die richtige 3D-Ansatz: Ray casting.
Nehmen Sie die Position im 2D-Bildschirm-Koordinaten, die der Benutzer ausgewählt und projizieren Sie in Ihre Welt-Raum. Das gibt einen 3D ray, der seinen Ursprung an der Kamera und Punkte in der Szene. Nun müssen Sie zum durchführen von Kollisionsprüfungen in 3D. In den meisten Fällen kann dies erreicht werden durch die Reduzierung der Objekte um eine Reihe von einfachen Geometrien wie Ellipsoide, Kugeln und Boxen, für speedup.
Angesichts der Präzision von handheld-Geräten, das sollte ausreichend genau bereits. Beachten Sie, dass je nach form des Objekts, müssen Sie möglicherweise mehr als ein primitiver. Auch ist es sinnlos, immer die gleichen primitiven: Eine bounding sphere ist eine sehr schlechte Näherung für eine sehr lange Stange, offensichtlich.
Es ganz davon ab, was es ist, dass Sie Rendern. Sollten Sie wahrscheinlich nicht verwenden Sie die picking-Ansatz, weil
a) Es klingt wie es ist sehr langsam, vor allem auf android.
b) möchten Sie vielleicht einen größeren "touch-Bereich" für kleine Objekte, so dass Sie nicht haben, zu berühren genau, wo Sie sind.
c) Es ist nicht wirklich die richtige Antwort Frage - es gibt Ihnen das Ergebnis "Was ist der top-die meisten grafischen Element gerendert wurde, wo genau ich Sie berührte?" in der Erwägung, dass Sie wissen wollen, "Was für ein Spiel Entität hat der user touch oder touch der Nähe?"
Wie gesagt, es hängt ganz von Ihrem Spiel. Wenn es ein 2D-oder fast 2D-Spiel, dann ist es einfach und Sie nur füttern die touch-Koordinaten in Ihr Spiel-Modell. Für 3D-Spiele würde ich vorschlagen, diesem einfachen Algorithmus, den ich nur kam mit auf der Stelle:
Für exakte Ergebnisse die Linie Schnittpunkt Sache verwendet werden könnte. Es gibt algorithmen für das (suchen Sie nach "plane line Kreuzung raycasting').
Einen Gedanken, den ich hatte war zum Zwischenspeichern der Ergebnisse der Aufruf gluProject. Dies kann nur praktisch werden, wenn man es mit einer festen Kamera. Am Ende jeder änderung in der Kamera-Perspektive, ich regenerieren kann dieser cache der "touchables".
Dies hat auch den zusätzlichen Vorteil, sicherzustellen, dass ich bin nur Test-Eingang gegen Dinge, reagieren auf Berührung.
Ich würde schätzen alle Gedanken, die auf diesem Ansatz!