, , , - / + OrbitControls.
(x1, y1, z1) (x2, y2, z3), - , .
this.update = function () {
var alpha = scope.deviceOrientation.alpha ? THREE.Math.degToRad(scope.deviceOrientation.alpha) : 0;
var beta = scope.deviceOrientation.beta ? THREE.Math.degToRad(scope.deviceOrientation.beta) : 0;
var gamma = scope.deviceOrientation.gamma ? THREE.Math.degToRad(scope.deviceOrientation.gamma) : 0;
var orient = scope.screenOrientation ? THREE.Math.degToRad(scope.screenOrientation) : 0;
var currentQ = new THREE.Quaternion().copy(scope.object.quaternion);
setObjectQuaternion(currentQ, alpha, beta, gamma, orient);
var currentAngle = Quat2Angle(currentQ.x, currentQ.y, currentQ.z, currentQ.w);
var radDeg = 180 / Math.PI;
this.rotateLeft((lastGamma - currentAngle.z) / 2);
lastGamma = currentAngle.z;
this.rotateUp(lastBeta - currentAngle.y);
lastBeta = currentAngle.y;
}
function onDeviceOrientationChangeEvent( event ) {
scope.deviceOrientation = event;
}
window.addEventListener( 'deviceorientation', onDeviceOrientationChangeEvent, false );
</" >
function onScreenOrientationChangeEvent( event ) {
scope.screenOrientation = window.orientation || 0;
}
window.addEventListener( 'orientationchange', onScreenOrientationChangeEvent, false );
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 ) );
return function ( quaternion, alpha, beta, gamma, orient ) {
euler.set( beta, alpha, - gamma, 'YXZ' );
quaternion.setFromEuler( euler );
quaternion.multiply( q1 );
quaternion.multiply( q0.setFromAxisAngle( zee, - orient ) );
}
}();
</" >
function Quat2Angle( x, y, z, w ) {
var pitch, roll, yaw;
var test = x * y + z * w;
if (test > 0.499) {
yaw = 2 * Math.atan2(x, w);
pitch = Math.PI / 2;
roll = 0;
var euler = new THREE.Vector3( pitch, roll, yaw);
return euler;
}
if (test < -0.499) {
yaw = -2 * Math.atan2(x, w);
pitch = -Math.PI / 2;
roll = 0;
var euler = new THREE.Vector3( pitch, roll, yaw);
return euler;
}
var sqx = x * x;
var sqy = y * y;
var sqz = z * z;
yaw = Math.atan2(2 * y * w - 2 * x * z, 1 - 2 * sqy - 2 * sqz);
pitch = Math.asin(2 * test);
roll = Math.atan2(2 * x * w - 2 * y * z, 1 - 2 * sqx - 2 * sqz);
var euler = new THREE.Vector3( pitch, roll, yaw);
return euler;
}