123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- /**
- * @author dmarcos / https://github.com/dmarcos
- * @author mrdoob / http://mrdoob.com
- */
- THREE.VRControls = function ( object, onError ) {
- var scope = this;
- var vrInputs = [];
- function filterInvalidDevices( devices ) {
- // Exclude Cardboard position sensor if Oculus exists.
- var oculusDevices = devices.filter( function ( device ) {
- return device.deviceName.toLowerCase().indexOf( 'oculus' ) !== - 1;
- } );
- if ( oculusDevices.length >= 1 ) {
- return devices.filter( function ( device ) {
- return device.deviceName.toLowerCase().indexOf( 'cardboard' ) === - 1;
- } );
- } else {
- return devices;
- }
- }
- function gotVRDevices( devices ) {
- devices = filterInvalidDevices( devices );
- for ( var i = 0; i < devices.length; i ++ ) {
- if ( devices[ i ] instanceof PositionSensorVRDevice ) {
- vrInputs.push( devices[ i ] );
- }
- }
- if ( onError ) onError( 'HMD not available' );
- }
- if ( navigator.getVRDevices ) {
- 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 ];
- 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.resetSensor !== undefined ) {
- vrInput.resetSensor();
- } else if ( vrInput.zeroSensor !== undefined ) {
- vrInput.zeroSensor();
- }
- }
- };
- this.zeroSensor = function () {
- console.warn( 'THREE.VRControls: .zeroSensor() is now .resetSensor().' );
- this.resetSensor();
- };
- this.dispose = function () {
- vrInputs = [];
- };
- };
|