diff --git a/examples/jsm/webxr/XRHandModelFactory.js b/examples/jsm/webxr/XRHandModelFactory.js index 2a511e5cb58a83..37a16d42f9740a 100644 --- a/examples/jsm/webxr/XRHandModelFactory.js +++ b/examples/jsm/webxr/XRHandModelFactory.js @@ -83,10 +83,13 @@ class XRHandModelFactory { } + controller.visible = true; + } ); controller.addEventListener( 'disconnected', () => { + controller.visible = false; // handModel.motionController = null; // handModel.remove( scene ); // scene = null; diff --git a/src/renderers/webxr/WebXRManager.js b/src/renderers/webxr/WebXRManager.js index 04df05d6ad443e..af2e0bbe144ab7 100644 --- a/src/renderers/webxr/WebXRManager.js +++ b/src/renderers/webxr/WebXRManager.js @@ -327,11 +327,12 @@ class WebXRManager extends EventDispatcher { const inputSources = session.inputSources; - // Assign inputSources to available controllers + // Assign controllers to available inputSources - for ( let i = 0; i < controllers.length; i ++ ) { + for ( let i = 0; i < inputSources.length; i ++ ) { - inputSourcesMap.set( inputSources[ i ], controllers[ i ] ); + const index = inputSources[ i ].handedness === 'right' ? 1 : 0; + inputSourcesMap.set( inputSources[ i ], controllers[ index ] ); } @@ -641,10 +642,14 @@ class WebXRManager extends EventDispatcher { for ( let i = 0; i < controllers.length; i ++ ) { - const controller = controllers[ i ]; const inputSource = inputSources[ i ]; + const controller = inputSourcesMap.get( inputSource ); + + if ( controller !== undefined ) { - controller.update( inputSource, frame, referenceSpace ); + controller.update( inputSource, frame, referenceSpace ); + + } }