Skip to content

Commit

Permalink
OrbitControls: detect trackpad pinch
Browse files Browse the repository at this point in the history
Signed-off-by: Guilherme Avila <3927951+sciecode@users.noreply.github.com>
  • Loading branch information
sciecode committed Dec 23, 2023
1 parent fcfefba commit f694c85
Showing 1 changed file with 67 additions and 3 deletions.
70 changes: 67 additions & 3 deletions examples/jsm/controls/OrbitControls.js
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,8 @@ class OrbitControls extends EventDispatcher {
const pointers = [];
const pointerPositions = {};

let controlActive = false;

function getAutoRotationAngle( deltaTime ) {

if ( deltaTime !== null ) {
Expand All @@ -494,8 +496,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 );

}

Expand Down Expand Up @@ -1186,12 +1188,72 @@ 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;

}

console.log( "mode:", mode, "deltaY:", newEvent.deltaY );

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;
Expand Down Expand Up @@ -1400,6 +1462,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();
Expand Down

0 comments on commit f694c85

Please sign in to comment.