Skip to content

Commit 633eee4

Browse files
authored
Merge pull request #14354 from mrdoob/webvr
WebVRManager: Implemented getController() using the Gamepad API.
2 parents 42049d3 + fb724f2 commit 633eee4

File tree

1 file changed

+100
-2
lines changed

1 file changed

+100
-2
lines changed

src/renderers/webvr/WebVRManager.js

Lines changed: 100 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ function WebVRManager( renderer ) {
2020

2121
var poseTarget = null;
2222

23+
var controllers = [];
2324
var standingMatrix = new Matrix4();
2425
var standingMatrixInverse = new Matrix4();
2526

@@ -83,13 +84,108 @@ function WebVRManager( renderer ) {
8384

8485
//
8586

87+
var isTriggerPressed = false;
88+
89+
function findGamepad( id ) {
90+
91+
var gamepads = navigator.getGamepads && navigator.getGamepads();
92+
93+
for ( var i = 0, j = 0, l = gamepads.length; i < l; i ++ ) {
94+
95+
var gamepad = gamepads[ i ];
96+
97+
if ( gamepad && ( gamepad.id === 'Daydream Controller' ||
98+
gamepad.id === 'Gear VR Controller' || gamepad.id === 'Oculus Go Controller' ||
99+
gamepad.id === 'OpenVR Gamepad' || gamepad.id.startsWith( 'Oculus Touch' ) ||
100+
gamepad.id.startsWith( 'Spatial Controller' ) ) ) {
101+
102+
if ( j === id ) return gamepad;
103+
104+
j ++;
105+
106+
}
107+
108+
}
109+
110+
}
111+
112+
function updateControllers() {
113+
114+
for ( var i = 0; i < controllers.length; i ++ ) {
115+
116+
var controller = controllers[ i ];
117+
118+
var gamepad = findGamepad( i );
119+
120+
if ( gamepad !== undefined && gamepad.pose !== undefined ) {
121+
122+
if ( gamepad.pose === null ) return;
123+
124+
// Pose
125+
126+
var pose = gamepad.pose;
127+
128+
if ( pose.hasPosition === false ) controller.position.set( 0.2, - 0.6, - 0.05 );
129+
130+
if ( pose.position !== null ) controller.position.fromArray( pose.position );
131+
if ( pose.orientation !== null ) controller.quaternion.fromArray( pose.orientation );
132+
controller.matrix.compose( controller.position, controller.quaternion, controller.scale );
133+
controller.matrix.premultiply( standingMatrix );
134+
controller.matrix.decompose( controller.position, controller.quaternion, controller.scale );
135+
controller.matrixWorldNeedsUpdate = true;
136+
controller.visible = true;
137+
138+
// Trigger
139+
140+
var buttonId = gamepad.id === 'Daydream Controller' ? 0 : 1;
141+
142+
if ( isTriggerPressed !== gamepad.buttons[ buttonId ].pressed ) {
143+
144+
isTriggerPressed = gamepad.buttons[ buttonId ].pressed;
145+
146+
if ( isTriggerPressed ) {
147+
148+
controller.dispatchEvent( { type: 'selectstart' } );
149+
150+
} else {
151+
152+
controller.dispatchEvent( { type: 'selectend' } );
153+
controller.dispatchEvent( { type: 'select' } );
154+
155+
}
156+
157+
}
158+
159+
} else {
160+
161+
controller.visible = false;
162+
163+
}
164+
165+
}
166+
167+
}
168+
169+
//
170+
86171
this.enabled = false;
87172
this.userHeight = 1.6;
88173

89174
this.getController = function ( id ) {
90175

91-
console.warn( 'WebVRManager: getController() not yet implemented.' );
92-
return new Group();
176+
var controller = controllers[ id ];
177+
178+
if ( controller === undefined ) {
179+
180+
controller = new Group();
181+
controller.matrixAutoUpdate = false;
182+
controller.visible = false;
183+
184+
controllers[ id ] = controller;
185+
186+
}
187+
188+
return controller;
93189

94190
};
95191

@@ -231,6 +327,8 @@ function WebVRManager( renderer ) {
231327

232328
}
233329

330+
updateControllers();
331+
234332
return cameraVR;
235333

236334
};

0 commit comments

Comments
 (0)