XRSession: squeezestart 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-Ereignis squeezestart wird an eine XRSession gesendet, wenn der Benutzer eine primäre Quetsch-Aktion auf einer ihrer Eingabequellen beginnt.

Primäre Quetsch-Aktionen sind Aktionen, die greifen oder quetschen mit den Händen darstellen sollen, und können mit Triggern auf Handcontrollern simuliert werden.

Syntax

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

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

onsqueezestart = (event) => { }

Ereignistyp

Ereigniseigenschaften

Zusätzlich zu den unten aufgeführten Eigenschaften sind die Eigenschaften der übergeordneten Schnittstelle, Event, verfügbar.

frame Schreibgeschützt

Ein XRFrame-Objekt, das die benötigten Informationen über den Ereignisrahmen bereitstellt, während dessen das Ereignis aufgetreten ist. Dieser Rahmen könnte in der Vergangenheit gerendert worden sein, anstatt ein aktueller Rahmen zu sein. Da dies ein Ereignis-Rahmen ist, kein Animations-Rahmen, können Sie nicht XRFrame.getViewerPose() darauf aufrufen; stattdessen verwenden Sie getPose().

inputSource Schreibgeschützt

Ein XRInputSource-Objekt, das anzeigt, welche Eingabequelle das Eingabeereignis erzeugt hat.

Beschreibung

Auslöser

Wird ausgelöst, wenn Benutzer beginnen, den Controller zu drücken, eine Handbewegung machen, die das Ergreifen von etwas nachahmt, oder einen Abzug (Trigger) drücken.

Anwendungsfälle

Das squeezestart-Ereignis wird gesendet, um anzuzeigen, dass der Benutzer eine Quetsch-Aktion begonnen hat.

Wenn die primäre Quetsch-Aktion erfolgreich endet, wird der Sitzung ein squeeze-Ereignis gesendet.

Ein squeezeend-Ereignis wird gesendet, um anzuzeigen, dass die Quetsch-Aktion nicht mehr im Gange ist. Dies wird gesendet, unabhängig davon, ob die Quetsch-Aktion erfolgreich war oder nicht.

Beispiele

Das folgende Beispiel verwendet addEventListener(), um Handler für die Quetsch-Ereignisse: squeezestart, squeezeend und squeeze einzurichten. Dieses Snippet ist der Kern eines Ereignishandlers, der es dem Benutzer ermöglicht, Objekte in der Szene zu greifen und zu bewegen.

In diesem Fall wird eine einzelne Funktion verwendet, um alle drei Ereignisse zu behandeln, sodass sie bestimmten Code teilen können, der unabhängig davon der gleiche ist, welches der drei Ereignisse empfangen wird. Erst nachdem diese Aufgaben abgeschlossen sind, verteilt die onSqueezeEvent()-Funktion unten die Aktion an eine spezialisierte Funktion, um Dinge zu handhaben.

Nachdem sichergestellt wurde, dass das empfangene Ereignis ein tracked-pointer-Ereignis ist (die einzige Art, die wir hier behandeln), wird die Zielstrahlpose mit getPose() abgerufen.

Wenn die Zielstrahlpose erfolgreich abgerufen wurde, verwendet der Code den Wert der Event-Eigenschaft type, um die Kontrolle an eine entsprechende Funktion zu übergeben, die das eingetroffene Ereignis behandelt:

  • Bei squeezestart-Ereignissen wird eine myBeginTracking()-Funktion mit der matrix der Zielstrahlpose aufgerufen. Die myBeginTracking()-Funktion würde vermutlich den Beginn des Objekt-Zieh-Prozesses darstellen, indem sie den Transformations-Hit-Test durchfü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 Empfangen eines squeeze-Ereignisses wird die myDropObject()-Funktion mit dem Zielobjekt und der aktuellen Zielstrahl-Pose-Transformation als Eingaben aufgerufen. Dies platziert das Objekt in seiner neuen Position in der Welt und löst alle Effekte aus, die sich ergeben könnten, wie das Planen einer Animation eines Spritzens, wenn es ins Wasser fallen gelassen wird, etc.
  • Das squeezeend-Ereignis führt dazu, dass eine myStopTracking()-Funktion mit dem gezogenen Objekt und der endgültigen Zielstrahl-Pose-Transformation aufgerufen wird.
js
xrSession.addEventListener("squeezestart", onSqueezeEvent);
xrSession.addEventListener("squeeze", onSqueezeEvent);
xrSession.addEventListener("squeezeend", onSqueezeEvent);

function onSqueezeEvent(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 "squeezestart":
      targetObj = myBeginTracking(targetRayPose.matrix);
      break;
    case "squeeze":
      myDropObject(targetObj, targetRayPose.matrix);
      break;
    case "squeezeend":
      myStopTracking(targetObj, targetRayPose.matrix);
      break;
  }
}

Sie können auch einen Handler für diese Ereignisse einrichten, indem Sie die Ereignis-Handler-Eigenschaften des XRSession-Objekts auf eine Funktion setzen, die das Ereignis behandelt:

js
xrSession.onsqueezestart = onSqueezeEvent;
xrSession.onsqueeze = onSqueezeEvent;
xrSession.onsqueezeend = onSqueezeEvent;

Spezifikationen

Specification
WebXR Device API
# eventdef-xrsession-squeezestart
WebXR Device API
# dom-xrsession-onsqueezestart

Browser-Kompatibilität