XRSession: selectstart-Ereignis

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.

Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.

Das WebXR selectstart-Ereignis wird an eine XRSession gesendet, wenn der Benutzer eine primäre Aktion auf einer seiner Eingabequellen beginnt.

Das beforexrselect wird vor diesem Ereignis ausgelöst und kann verhindern, dass dieses Ereignis ausgelöst wird.

Syntax

Verwenden Sie den Ereignisnamen in Methoden wie addEventListener(), oder setzen Sie eine Ereignishandler-Eigenschaft.

js
addEventListener("selectstart", (event) => { })

onselectstart = (event) => { }

Ereignistyp

Ereigniseigenschaften

Zusätzlich zu den unten aufgeführten Eigenschaften sind Eigenschaften aus der Elternschnittstelle, Event, verfügbar.

frame Schreibgeschützt

Ein XRFrame-Objekt, das die benötigten Informationen über das Ereignisframe bereitstellt, während dem das Ereignis aufgetreten ist. Dieses Frame könnte in der Vergangenheit gerendert worden sein, anstatt ein aktuelles Frame zu sein. Da es sich um ein Ereignis-Frame, nicht um ein Animations-Frame handelt, können Sie nicht XRFrame.getViewerPose() darauf aufrufen; verwenden Sie stattdessen getPose().

inputSource Schreibgeschützt

Ein XRInputSource-Objekt, das angibt, welche Eingabequelle das Eingabeereignis generiert hat.

Beschreibung

Auslösen

Ausgelöst, wenn der Benutzer Auslöser oder Tasten drückt, ein Touchpad antippt, einen Befehl spricht oder eine erkennbare Geste ausführt, während er ein Video-Trackingsystem oder einen Handcontroller mit Beschleunigungssensor verwendet.

Anwendungsfälle

Die selectstart- und selectend-Ereignisse zeigen an, wann Sie dem Benutzer etwas anzeigen könnten, das verdeutlicht, dass die primäre Aktion ausgeführt wird. Dies könnte das Zeichnen eines Controllers mit der aktivierten Schaltfläche in einer neuen Farbe sein oder das angezeigte Objekt greifen und umherbewegen lassen, beginnend wenn selectstart ankommt und endend, wenn selectend empfangen wird.

Das select-Ereignis teilt Ihrem Code mit, dass der Benutzer die Aktion abgeschlossen hat, die er ausführen wollte. Dies könnte so einfach sein, wie ein Objekt zu werfen oder einen Abzug im Spiel zu betätigen, oder so ausführlich wie das Platzieren eines gezogenen Objekts an einem neuen Ort.

Wenn Ihre primäre Aktion eine einfache Auslöseaktion ist und Sie nichts animieren müssen, während der Auslöser gedrückt ist, können Sie die selectstart- und selectend-Ereignisse ignorieren und auf das Startereignis reagieren.

Beispiele

Im folgenden Beispiel wird addEventListener() verwendet, um Handler für die Auswahlereignisse zu erstellen: selectstart, selectend und select. Dieses Snippet ist der Kern eines Ereignishandlers, der es dem Benutzer erlaubt, Objekte in der Szene zu greifen und zu bewegen.

In diesem Fall wird eine einzelne Funktion verwendet, um alle drei Ereignisse zu verarbeiten, sodass sie bestimmten Code gemeinsam nutzen können, der unabhängig davon, welches der drei Ereignisse empfangen wird, gleich ist. Erst nachdem diese Aufgaben abgeschlossen sind, übergibt die onSelectionEvent()-Funktion die Aktion an eine spezialisierte Funktion, um Dinge zu bearbeiten.

Nachdem überprüft wurde, ob das empfangene Ereignis ein tracked-pointer-Ereignis ist (das einzige, das wir hier verarbeiten), wird die Zielstrahlposition mit getPose() ermittelt.

Falls die Zielstrahlposition erfolgreich abgerufen wurde, verwendet der Code den Wert der type-Eigenschaft des Event, um die Kontrolle zu einer geeigneten Funktion zu leiten, um das eingetroffene Ereignis zu verarbeiten:

  • Für selectstart-Ereignisse wird eine myBeginTracking()-Funktion mit der matrix der Zielstrahlposition aufgerufen. Die myBeginTracking()-Funktion würde vermutlich mit der Präsentation des Objektschiebeprozesses beginnen, indem sie den Transformationsvorgang ausführt, um zu bestimmen, welches Objekt aufgenommen werden soll. myBeginTracking() gibt ein Objekt zurück, das das Objekt darstellt, das der Benutzer zu ziehen begonnen hat.
  • Beim Empfang eines select-Ereignisses wird die myDropObject()-Funktion mit dem Zielobjekt und der aktuellen Zielstrahlpositionstransformation als Eingaben aufgerufen. Dies platziert das Objekt an seiner neuen Position in der Welt und löst alle Effekte aus, die auftreten könnten, wie das Planen einer Animation eines Spritzers, wenn es ins Wasser fällt usw.
  • Das selectend-Ereignis führt zur Aufruf einer myStopTracking()-Funktion mit dem zu ziehenden Objekt und der endgültigen Zielstrahlpositions-Transformation.
js
xrSession.addEventListener("selectstart", onSelectionEvent);
xrSession.addEventListener("select", onSelectionEvent);
xrSession.addEventListener("selectend", onSelectionEvent);

function onSelectionEvent(event) {
  let source = event.inputSource;
  let targetObj = null;

  if (source.targetRayMode !== "tracked-pointer") {
    return;
  }

  let targetRayPose = event.frame.getPose(source.targetRaySpace, myRefSpace);
  if (!targetRayPose) {
    return;
  }

  switch (event.type) {
    case "selectstart":
      targetObj = myBeginTracking(targetRayPose.matrix);
      break;
    case "select":
      myDropObject(targetObj, targetRayPose.matrix);
      break;
    case "selectend":
      myStopTracking(targetObj, targetRayPose.matrix);
      break;
  }
}

Sie können auch einen Handler für selectend-Ereignisse einrichten, indem Sie die onselectend-Ereignishandlereigenschaft des XRSession-Objekts auf eine Funktion setzen, die das Ereignis verarbeitet:

js
xrSession.onselectstart = onSelectionEvent;
xrSession.onselect = onSelectionEvent;
xrSession.onselectend = onSelectionEvent;

Spezifikationen

Specification
WebXR Device API
# eventdef-xrsession-selectstart
WebXR Device API
# dom-xrsession-onselectstart

Browser-Kompatibilität

Siehe auch