/** * @author dmarcos / https://github.com/dmarcos * @author mrdoob / http://mrdoob.com */ THREE.VRControls = function ( object, onError ) { var scope = this; var vrInputs = []; function gotVRDevices( devices ) { for ( var i = 0; i < devices.length; i ++ ) { if ( devices[ i ] instanceof VRDisplay || devices[ i ] instanceof PositionSensorVRDevice ) { vrInputs.push( devices[ i ] ); } } if ( vrInputs.length === 0 ) { if ( onError ) onError( 'VR inputs not available' ); } } if ( navigator.getVRDisplays ) { navigator.getVRDisplays().then( gotVRDevices ); } else if ( navigator.getVRDevices ) { // Deprecated API. navigator.getVRDevices().then( gotVRDevices ); } // the Rift SDK returns the position in meters // this scale factor allows the user to define how meters // are converted to scene units. this.scale = 1; this.update = function () { for ( var i = 0; i < vrInputs.length; i ++ ) { var vrInput = vrInputs[ i ]; if ( vrInput.getPose ) { var pose = vrInput.getPose(); if ( pose.orientation !== null ) { object.quaternion.fromArray( pose.orientation ); } if ( pose.position !== null ) { object.position.fromArray( pose.position ).multiplyScalar( scope.scale ); } } else { // Deprecated API. var state = vrInput.getState(); if ( state.orientation !== null ) { object.quaternion.copy( state.orientation ); } if ( state.position !== null ) { object.position.copy( state.position ).multiplyScalar( scope.scale ); } } } }; this.resetSensor = function () { for ( var i = 0; i < vrInputs.length; i ++ ) { var vrInput = vrInputs[ i ]; if ( vrInput.resetPose !== undefined ) { vrInput.resetPose(); } else if ( vrInput.resetSensor !== undefined ) { // Deprecated API. vrInput.resetSensor(); } else if ( vrInput.zeroSensor !== undefined ) { // Really deprecated API. vrInput.zeroSensor(); } } }; this.zeroSensor = function () { console.warn( 'THREE.VRControls: .zeroSensor() is now .resetSensor().' ); this.resetSensor(); }; this.dispose = function () { vrInputs = []; }; };