|
@@ -9,9 +9,9 @@
|
|
|
// This set of controls performs orbiting, dollying (zooming), and panning.
|
|
|
// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default).
|
|
|
//
|
|
|
-// Orbit - left mouse / touch: one finger move
|
|
|
-// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish
|
|
|
-// Pan - right mouse, or arrow keys / touch: three finger swipe
|
|
|
+// Orbit - left mouse / touch: one-finger move
|
|
|
+// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish
|
|
|
+// Pan - right mouse, or arrow keys / touch: two-finger move
|
|
|
|
|
|
THREE.OrbitControls = function ( object, domElement ) {
|
|
|
|
|
@@ -250,7 +250,7 @@ THREE.OrbitControls = function ( object, domElement ) {
|
|
|
var startEvent = { type: 'start' };
|
|
|
var endEvent = { type: 'end' };
|
|
|
|
|
|
- var STATE = { NONE: - 1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };
|
|
|
+ var STATE = { NONE: - 1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY_PAN: 4 };
|
|
|
|
|
|
var state = STATE.NONE;
|
|
|
|
|
@@ -363,7 +363,7 @@ THREE.OrbitControls = function ( object, domElement ) {
|
|
|
// half of the fov is center to top of screen
|
|
|
targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );
|
|
|
|
|
|
- // we actually don't use screenWidth, since perspective camera is fixed to screen height
|
|
|
+ // we use only clientHeight here so aspect ratio does not distort speed
|
|
|
panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );
|
|
|
panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );
|
|
|
|
|
@@ -579,24 +579,29 @@ THREE.OrbitControls = function ( object, domElement ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- function handleTouchStartDolly( event ) {
|
|
|
+ function handleTouchStartDollyPan( event ) {
|
|
|
|
|
|
- //console.log( 'handleTouchStartDolly' );
|
|
|
+ //console.log( 'handleTouchStartDollyPan' );
|
|
|
|
|
|
- var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
|
|
|
- var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
|
|
|
+ if ( scope.enableZoom ) {
|
|
|
|
|
|
- var distance = Math.sqrt( dx * dx + dy * dy );
|
|
|
+ var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
|
|
|
+ var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
|
|
|
|
|
|
- dollyStart.set( 0, distance );
|
|
|
+ var distance = Math.sqrt( dx * dx + dy * dy );
|
|
|
|
|
|
- }
|
|
|
+ dollyStart.set( 0, distance );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- function handleTouchStartPan( event ) {
|
|
|
+ if ( scope.enablePan ) {
|
|
|
|
|
|
- //console.log( 'handleTouchStartPan' );
|
|
|
+ var x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );
|
|
|
+ var y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );
|
|
|
|
|
|
- panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
|
|
|
+ panStart.set( x, y );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
@@ -622,46 +627,41 @@ THREE.OrbitControls = function ( object, domElement ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- function handleTouchMoveDolly( event ) {
|
|
|
+ function handleTouchMoveDollyPan( event ) {
|
|
|
|
|
|
- //console.log( 'handleTouchMoveDolly' );
|
|
|
+ //console.log( 'handleTouchMoveDollyPan' );
|
|
|
|
|
|
- var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
|
|
|
- var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
|
|
|
+ if ( scope.enableZoom ) {
|
|
|
|
|
|
- var distance = Math.sqrt( dx * dx + dy * dy );
|
|
|
+ var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
|
|
|
+ var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
|
|
|
|
|
|
- dollyEnd.set( 0, distance );
|
|
|
+ var distance = Math.sqrt( dx * dx + dy * dy );
|
|
|
|
|
|
- dollyDelta.subVectors( dollyEnd, dollyStart );
|
|
|
+ dollyEnd.set( 0, distance );
|
|
|
|
|
|
- if ( dollyDelta.y > 0 ) {
|
|
|
+ dollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed ) );
|
|
|
|
|
|
- dollyOut( getZoomScale() );
|
|
|
+ dollyIn( dollyDelta.y );
|
|
|
|
|
|
- } else if ( dollyDelta.y < 0 ) {
|
|
|
-
|
|
|
- dollyIn( getZoomScale() );
|
|
|
+ dollyStart.copy( dollyEnd );
|
|
|
|
|
|
}
|
|
|
|
|
|
- dollyStart.copy( dollyEnd );
|
|
|
+ if ( scope.enablePan ) {
|
|
|
|
|
|
- scope.update();
|
|
|
+ var x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );
|
|
|
+ var y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );
|
|
|
|
|
|
- }
|
|
|
+ panEnd.set( x, y );
|
|
|
|
|
|
- function handleTouchMovePan( event ) {
|
|
|
+ panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );
|
|
|
|
|
|
- //console.log( 'handleTouchMovePan' );
|
|
|
+ pan( panDelta.x, panDelta.y );
|
|
|
|
|
|
- panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
|
|
|
+ panStart.copy( panEnd );
|
|
|
|
|
|
- panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );
|
|
|
-
|
|
|
- pan( panDelta.x, panDelta.y );
|
|
|
-
|
|
|
- panStart.copy( panEnd );
|
|
|
+ }
|
|
|
|
|
|
scope.update();
|
|
|
|
|
@@ -806,6 +806,8 @@ THREE.OrbitControls = function ( object, domElement ) {
|
|
|
|
|
|
if ( scope.enabled === false ) return;
|
|
|
|
|
|
+ event.preventDefault();
|
|
|
+
|
|
|
switch ( event.touches.length ) {
|
|
|
|
|
|
case 1: // one-fingered touch: rotate
|
|
@@ -818,23 +820,13 @@ THREE.OrbitControls = function ( object, domElement ) {
|
|
|
|
|
|
break;
|
|
|
|
|
|
- case 2: // two-fingered touch: dolly
|
|
|
-
|
|
|
- if ( scope.enableZoom === false ) return;
|
|
|
-
|
|
|
- handleTouchStartDolly( event );
|
|
|
-
|
|
|
- state = STATE.TOUCH_DOLLY;
|
|
|
-
|
|
|
- break;
|
|
|
-
|
|
|
- case 3: // three-fingered touch: pan
|
|
|
+ case 2: // two-fingered touch: dolly-pan
|
|
|
|
|
|
- if ( scope.enablePan === false ) return;
|
|
|
+ if ( scope.enableZoom === false && scope.enablePan === false ) return;
|
|
|
|
|
|
- handleTouchStartPan( event );
|
|
|
+ handleTouchStartDollyPan( event );
|
|
|
|
|
|
- state = STATE.TOUCH_PAN;
|
|
|
+ state = STATE.TOUCH_DOLLY_PAN;
|
|
|
|
|
|
break;
|
|
|
|
|
@@ -864,27 +856,18 @@ THREE.OrbitControls = function ( object, domElement ) {
|
|
|
case 1: // one-fingered touch: rotate
|
|
|
|
|
|
if ( scope.enableRotate === false ) return;
|
|
|
- if ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...
|
|
|
+ if ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?
|
|
|
|
|
|
handleTouchMoveRotate( event );
|
|
|
|
|
|
break;
|
|
|
|
|
|
- case 2: // two-fingered touch: dolly
|
|
|
-
|
|
|
- if ( scope.enableZoom === false ) return;
|
|
|
- if ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...
|
|
|
-
|
|
|
- handleTouchMoveDolly( event );
|
|
|
+ case 2: // two-fingered touch: dolly-pan
|
|
|
|
|
|
- break;
|
|
|
-
|
|
|
- case 3: // three-fingered touch: pan
|
|
|
-
|
|
|
- if ( scope.enablePan === false ) return;
|
|
|
- if ( state !== STATE.TOUCH_PAN ) return; // is this needed?...
|
|
|
+ if ( scope.enableZoom === false && scope.enablePan === false ) return;
|
|
|
+ if ( state !== STATE.TOUCH_DOLLY_PAN ) return; // is this needed?
|
|
|
|
|
|
- handleTouchMovePan( event );
|
|
|
+ handleTouchMoveDollyPan( event );
|
|
|
|
|
|
break;
|
|
|
|