javascript - Lyssna på Oculus-kontrollhändelser på vilken webbplats som helst
Är det möjligt för en webbsida att lyssna på knapptryckningar på en Oculus-kontroller enbart med någon generell JavaScript-kod som document.addEventListener?
I VR-webbläsare rullar standardinställningen för den primära styrspaken sidan upp och ner. Idén är att omkartlägga den för att utlösa olika åtgärder.
Från min forskning ser det ut som att jag behöver använda en A-frame, men jag letar efter en generell lösning som fungerar på olika webbplatser med bara Vanilla Javascript, inte i ett immersivt sammanhang.
Svar #1
Kort sagt, nej.
Det är inte möjligt att gränssnitt med en Oculus-kontroller utanför en immersiv WebXR-kontext.
Avsnittet Inputs and Sources i WebXR-API:et anger:
Medan Gamepad-posten definieras av Gamepad API-specifikationen, hanteras den egentligen inte av Gamepad API.
Så Gamepad API kommer inte att fungera, och vi tvingas använda WebXR API. Dessutom tvingas vi använda ett av de immersiva lägena för vår WebXR-session. WebXR Controller-exemplet anger (bekräftat detta, se kommentarer i reglerna nedan):
WebXR-handkontroller är inte tillgängliga under inline-sessioner.
Det sagt, kan du fortfarande ...
Gör det med minimal (vanilj) Javascript.
Beroende på din definition av vanilj, kommer detta att fungera (Codesandbox):
const gl2 = document
.querySelector('canvas.c3d')
.getContext('webgl2');
const session = await navigator.xr.requestSession('immersive-vr')
session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl2) });
const hookGamepadControls = () => {
const gamepad = session?.inputSources?.[0]?.gamepad; //replace with code to choose appropriate input source/controller
if (gamepad) {
setInterval(scroll(gamepad), 30);
}
};
session.requestAnimationFrame(hookGamepadControls); //We can request a single frame and run a timer to poll controller, no need to request additional frames
Minsta regler att följa för att få Oculus eller någon VR/AR/XR-kontroller/spelkontroll att visas:
Huvudregler:
- Vi måste inte vara i ett
inline-sammanhang, endastimmersive-vrellerimmersive-ar(annars kommersource.gamepadatt vara null)
- Vi måste inte vara i ett
- Vi måste vara i ett ramkontext (annars kommer
source.gamepadvara null)
Korollariska regler:
- Vi måste koppla renderingsstatusen till GL-kontexten (annars kommer vi inte att ta emot animationsramar)
