Wie man Objekt in WebGL 3d-Raum von einer Maus klicken Sie koordinieren
Baue ich ein Brettspiel in WebGL. Der Vorstand kann gedreht/gezoomt. Ich brauche einen Weg, zu übersetzen klicken Sie auf das canvas-element (x,y) in der entsprechenden Stelle im 3D-Raum (x, y, z). Das ultimative Ergebnis ist, dass ich wissen möchte, (x, y, z) - Koordinate, die enthält den Punkt, der berührt das Objekt am nächsten zum Benutzer. Zum Beispiel, klickt der Benutzer auf ein Stück, und Sie sich vorstellen, ein ray Reise durch den 3D-Raum, geht durch das Stück und den Spielplan, aber ich möchte die (x, y, z coord von dem Stück an der Stelle, wo es berührt wurde.
Ich glaube, das muss ein sehr häufiges problem, aber ich kann nicht scheinen, um eine Lösung zu finden, die in meinem googles. Es muss einen Weg zum Projekt die aktuelle Ansicht des 3D-Raums in den 2D-Modus, so können Sie ordnen Sie jedem Punkt im 2D-Raum an der entsprechenden Stelle im 3D-Raum. Ich möchte die Benutzer in der Lage sein, um die Maus über einen Platz auf der platine, und die spot-Farbe ändern.
InformationsquelleAutor der Frage seibelj | 2011-09-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du suchst einen unproject Funktion wandelt die Bildschirm-Koordinaten in ein ray-Darsteller von der Kamera-position in der 3D-Welt. Sie müssen dann ray/triangle intersection tests zu finden, die am nächsten Dreiecks, um die Kamera, die auch schneidet der Strahl.
Habe ich ein Beispiel von unprojecting verfügbar unter jax/Kamera.js#L568 -- aber Sie müssen noch zu implementieren ray/triangle intersection. Ich habe eine Implementierung, die auf jax/Dreieck.js#L113.
Es ist ein einfacher und (meist) schnellere alternative, jedoch, das sogenannte "picking". Verwenden Sie dies, wenn Sie möchten, wählen Sie ein ganzes Objekt (zum Beispiel eine Schach-Stück), und wenn Sie kümmern sich nicht darum, wo die Maus tatsächlich geklickt haben. Die WebGL Weg, dies zu tun ist, um das Rendern der gesamten Szene in verschiedenen Schattierungen von blau (das blau ist der Schlüssel, während rot und grün sind zur eindeutigen IDs der Objekte in der Szene), um eine textur, Lesen Sie dann wieder ein pixel aus, die textur. Die Dekodierung der RGB-in die Objekt-ID geben Sie das Objekt, auf das geklickt wurde. Wieder habe ich umgesetzt und es jax/Welt.js#L82. (Siehe auch Linien 146, 162, 175.)
Beide Ansätze haben vor-und Nachteile (beschrieben hier und in einigen der Kommentare nach), und Sie müssen, um herauszufinden, welcher Ansatz am besten dient Ihre Bedürfnisse. Die Kommissionierung ist langsamer, mit großen Szenen, aber unprojecting in reinem JS ist extrem langsam (da JS sich nicht schnell) also meine beste Empfehlung wäre, Experimentieren Sie mit beiden.
FYI, Sie könnten auch einen Blick auf die GLU-Projekt und unproject code, die ich basiert mein code lose auf: http://www.opengl.org/wiki/GluProject_and_gluUnProject_code
InformationsquelleAutor der Antwort sinisterchipmunk
Dies ist die funktionsfähige demo -
weissner-doors.de/drone/
InformationsquelleAutor der Antwort Tomasz Drozdowski
Arbeite ich auf dieses problem im moment - der Ansatz, den ich nehme ist
InformationsquelleAutor der Antwort xeolabs
culted aus einem der threads.
nicht sicher über (x,y,z), aber man kann die
canvas(x,y)
mitInformationsquelleAutor der Antwort Naruto