Created
March 21, 2017 16:12
-
-
Save kopiro/86aac4eb19ac29ae62c950ad2106a10e to your computer and use it in GitHub Desktop.
ThreeJS DeviceOrientationControls
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @author richt / http://richt.me | |
* @author WestLangley / http://github.com/WestLangley | |
* | |
* W3C Device Orientation control (http://w3c.github.io/deviceorientation/spec-source-orientation.html) | |
*/ | |
THREE.DeviceOrientationControls = function( object ) { | |
var scope = this; | |
this.object = object; | |
this.object.rotation.reorder( "YXZ" ); | |
this.enabled = true; | |
this.deviceOrientation = {}; | |
this.screenOrientation = 0; | |
this.alpha = 0; | |
this.alphaOffsetAngle = 0; | |
this.betaOffsetAngle = 0; | |
this.gammaOffsetAngle = 0; | |
var onDeviceOrientationChangeEvent = function( event ) { | |
scope.deviceOrientation = event; | |
}; | |
var onScreenOrientationChangeEvent = function() { | |
scope.screenOrientation = window.orientation || 0; | |
}; | |
// The angles alpha, beta and gamma form a set of intrinsic Tait-Bryan angles of type Z-X'-Y'' | |
var setObjectQuaternion = function() { | |
var zee = new THREE.Vector3( 0, 0, 1 ); | |
var euler = new THREE.Euler(); | |
var q0 = new THREE.Quaternion(); | |
var q1 = new THREE.Quaternion( - Math.sqrt( 0.5 ), 0, 0, Math.sqrt( 0.5 ) ); // - PI/2 around the x-axis | |
return function( quaternion, alpha, beta, gamma, orient ) { | |
euler.set( beta, alpha, - gamma, 'YXZ' ); // 'ZXY' for the device, but 'YXZ' for us | |
quaternion.setFromEuler( euler ); // orient the device | |
quaternion.multiply( q1 ); // camera looks out the back of the device, not the top | |
quaternion.multiply( q0.setFromAxisAngle( zee, - orient ) ); // adjust for screen orientation | |
}; | |
}(); | |
this.connect = function() { | |
onScreenOrientationChangeEvent(); // run once on load | |
window.addEventListener( 'orientationchange', onScreenOrientationChangeEvent, false ); | |
window.addEventListener( 'deviceorientation', onDeviceOrientationChangeEvent, false ); | |
scope.enabled = true; | |
}; | |
this.disconnect = function() { | |
window.removeEventListener( 'orientationchange', onScreenOrientationChangeEvent, false ); | |
window.removeEventListener( 'deviceorientation', onDeviceOrientationChangeEvent, false ); | |
scope.enabled = false; | |
}; | |
this.update = function() { | |
if ( scope.enabled === false ) return; | |
var alpha = scope.deviceOrientation.alpha ? THREE.Math.degToRad( scope.deviceOrientation.alpha ) + this.alphaOffsetAngle : 0; // Z | |
var beta = scope.deviceOrientation.beta ? THREE.Math.degToRad( scope.deviceOrientation.beta ) + this.betaOffsetAngle : 0; // X' | |
var gamma = scope.deviceOrientation.gamma ? THREE.Math.degToRad( scope.deviceOrientation.gamma ) + this.gammaOffsetAngle : 0; // Y'' | |
var orient = scope.screenOrientation ? THREE.Math.degToRad( scope.screenOrientation ) : 0; // O | |
setObjectQuaternion( scope.object.quaternion, alpha, beta, gamma, orient ); | |
this.alpha = alpha; | |
}; | |
this.updateAlphaOffsetAngle = function( angle ) { | |
this.alphaOffsetAngle = angle; | |
this.update(); | |
}; | |
this.updateBetaOffsetAngle = function( angle ) { | |
this.betaOffsetAngle = angle; | |
this.update(); | |
}; | |
this.updateGammaOffsetAngle = function( angle ) { | |
this.gammaOffsetAngle = angle; | |
this.update(); | |
}; | |
this.dispose = function() { | |
this.disconnect(); | |
}; | |
this.connect(); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment