|
@@ -483,6 +483,8 @@ class OrbitControls extends EventDispatcher {
|
|
|
const pointers = [];
|
|
|
const pointerPositions = {};
|
|
|
|
|
|
+ let controlActive = false;
|
|
|
+
|
|
|
function getAutoRotationAngle( deltaTime ) {
|
|
|
|
|
|
if ( deltaTime !== null ) {
|
|
@@ -499,8 +501,8 @@ class OrbitControls extends EventDispatcher {
|
|
|
|
|
|
function getZoomScale( delta ) {
|
|
|
|
|
|
- const normalized_delta = Math.abs( delta ) / ( 100 * ( window.devicePixelRatio | 0 ) );
|
|
|
- return Math.pow( 0.95, scope.zoomSpeed * normalized_delta );
|
|
|
+ const normalizedDelta = Math.abs( delta * 0.01 );
|
|
|
+ return Math.pow( 0.95, scope.zoomSpeed * normalizedDelta );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -1211,12 +1213,70 @@ class OrbitControls extends EventDispatcher {
|
|
|
|
|
|
scope.dispatchEvent( _startEvent );
|
|
|
|
|
|
- handleMouseWheel( event );
|
|
|
+ handleMouseWheel( customWheelEvent( event ) );
|
|
|
|
|
|
scope.dispatchEvent( _endEvent );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ function customWheelEvent( event ) {
|
|
|
+
|
|
|
+ const mode = event.deltaMode;
|
|
|
+
|
|
|
+ // minimal wheel event altered to meet delta-zoom demand
|
|
|
+ const newEvent = {
|
|
|
+ clientX: event.clientX,
|
|
|
+ clientY: event.clientY,
|
|
|
+ deltaY: event.deltaY,
|
|
|
+ }
|
|
|
+
|
|
|
+ switch ( mode ) {
|
|
|
+
|
|
|
+ case 1: // LINE_MODE
|
|
|
+ newEvent.deltaY *= 16;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 2: // PAGE_MODE
|
|
|
+ newEvent.deltaY *= 100;
|
|
|
+ break;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // detect if event was triggered by pinching
|
|
|
+ if ( event.ctrlKey && !controlActive ) {
|
|
|
+
|
|
|
+ newEvent.deltaY *= 10;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return newEvent;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ function interceptControlDown( event ) {
|
|
|
+
|
|
|
+ if ( event.key === "Control" ) {
|
|
|
+
|
|
|
+ controlActive = true;
|
|
|
+
|
|
|
+ document.addEventListener('keyup', interceptControlUp, { passive: true, capture: true });
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ function interceptControlUp( event ) {
|
|
|
+
|
|
|
+ if ( event.key === "Control" ) {
|
|
|
+
|
|
|
+ controlActive = false;
|
|
|
+
|
|
|
+ document.removeEventListener('keyup', interceptControlUp, { passive: true, capture: true });
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
function onKeyDown( event ) {
|
|
|
|
|
|
if ( scope.enabled === false || scope.enablePan === false ) return;
|
|
@@ -1425,6 +1485,8 @@ class OrbitControls extends EventDispatcher {
|
|
|
scope.domElement.addEventListener( 'pointercancel', onPointerUp );
|
|
|
scope.domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );
|
|
|
|
|
|
+ document.addEventListener( 'keydown', interceptControlDown, { passive: true, capture: true } );
|
|
|
+
|
|
|
// force an update at start
|
|
|
|
|
|
this.update();
|
|
@@ -1433,4 +1495,4 @@ class OrbitControls extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
-export { OrbitControls };
|
|
|
+export { OrbitControls };
|