Skip to content

Commit dfbee3c

Browse files
authored
OrbitControls: fix pinch zoom behaviour (#27446)
Signed-off-by: Guilherme Avila <[email protected]>
1 parent 2f73105 commit dfbee3c

File tree

1 file changed

+66
-4
lines changed

1 file changed

+66
-4
lines changed

examples/jsm/controls/OrbitControls.js

+66-4
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,8 @@ class OrbitControls extends EventDispatcher {
483483
const pointers = [];
484484
const pointerPositions = {};
485485

486+
let controlActive = false;
487+
486488
function getAutoRotationAngle( deltaTime ) {
487489

488490
if ( deltaTime !== null ) {
@@ -499,8 +501,8 @@ class OrbitControls extends EventDispatcher {
499501

500502
function getZoomScale( delta ) {
501503

502-
const normalized_delta = Math.abs( delta ) / ( 100 * ( window.devicePixelRatio | 0 ) );
503-
return Math.pow( 0.95, scope.zoomSpeed * normalized_delta );
504+
const normalizedDelta = Math.abs( delta * 0.01 );
505+
return Math.pow( 0.95, scope.zoomSpeed * normalizedDelta );
504506

505507
}
506508

@@ -1211,12 +1213,70 @@ class OrbitControls extends EventDispatcher {
12111213

12121214
scope.dispatchEvent( _startEvent );
12131215

1214-
handleMouseWheel( event );
1216+
handleMouseWheel( customWheelEvent( event ) );
12151217

12161218
scope.dispatchEvent( _endEvent );
12171219

12181220
}
12191221

1222+
function customWheelEvent( event ) {
1223+
1224+
const mode = event.deltaMode;
1225+
1226+
// minimal wheel event altered to meet delta-zoom demand
1227+
const newEvent = {
1228+
clientX: event.clientX,
1229+
clientY: event.clientY,
1230+
deltaY: event.deltaY,
1231+
}
1232+
1233+
switch ( mode ) {
1234+
1235+
case 1: // LINE_MODE
1236+
newEvent.deltaY *= 16;
1237+
break;
1238+
1239+
case 2: // PAGE_MODE
1240+
newEvent.deltaY *= 100;
1241+
break;
1242+
1243+
}
1244+
1245+
// detect if event was triggered by pinching
1246+
if ( event.ctrlKey && !controlActive ) {
1247+
1248+
newEvent.deltaY *= 10;
1249+
1250+
}
1251+
1252+
return newEvent;
1253+
1254+
}
1255+
1256+
function interceptControlDown( event ) {
1257+
1258+
if ( event.key === "Control" ) {
1259+
1260+
controlActive = true;
1261+
1262+
document.addEventListener('keyup', interceptControlUp, { passive: true, capture: true });
1263+
1264+
}
1265+
1266+
}
1267+
1268+
function interceptControlUp( event ) {
1269+
1270+
if ( event.key === "Control" ) {
1271+
1272+
controlActive = false;
1273+
1274+
document.removeEventListener('keyup', interceptControlUp, { passive: true, capture: true });
1275+
1276+
}
1277+
1278+
}
1279+
12201280
function onKeyDown( event ) {
12211281

12221282
if ( scope.enabled === false || scope.enablePan === false ) return;
@@ -1425,6 +1485,8 @@ class OrbitControls extends EventDispatcher {
14251485
scope.domElement.addEventListener( 'pointercancel', onPointerUp );
14261486
scope.domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );
14271487

1488+
document.addEventListener( 'keydown', interceptControlDown, { passive: true, capture: true } );
1489+
14281490
// force an update at start
14291491

14301492
this.update();
@@ -1433,4 +1495,4 @@ class OrbitControls extends EventDispatcher {
14331495

14341496
}
14351497

1436-
export { OrbitControls };
1498+
export { OrbitControls };

0 commit comments

Comments
 (0)