소스 검색

Fix ArcRotateCamera behaviour when panning is disabled on multiTouch event

See https://forum.babylonjs.com/t/disabling-panning-on-multitouch-event-leads-to-wrong-behaviour/16064
Nicolas 4 년 전
부모
커밋
528aac6ffa
2개의 변경된 파일37개의 추가작업 그리고 11개의 파일을 삭제
  1. 1 0
      dist/preview release/what's new.md
  2. 36 11
      src/Cameras/Inputs/arcRotateCameraPointersInput.ts

+ 1 - 0
dist/preview release/what's new.md

@@ -58,6 +58,7 @@
 - Fix ssao2RenderingPipeline for orthographic cameras ([Kesshi](https://github.com/Kesshi))
 - Fix ssao2RenderingPipeline for orthographic cameras ([Kesshi](https://github.com/Kesshi))
 - Fix mipmaps creation in the KTX2 decoder for non square textures ([Popov72](https://github.com/Popov72))
 - Fix mipmaps creation in the KTX2 decoder for non square textures ([Popov72](https://github.com/Popov72))
 - Fix detail map not working in WebGL1 ([Popov72](https://github.com/Popov72))
 - Fix detail map not working in WebGL1 ([Popov72](https://github.com/Popov72))
+- Fix ArcRotateCamera behaviour when panning is disabled on multiTouch event ([NicolasBuecher](https://github.com/NicolasBuecher))
 
 
 ## Breaking changes
 ## Breaking changes
 
 

+ 36 - 11
src/Cameras/Inputs/arcRotateCameraPointersInput.ts

@@ -144,6 +144,9 @@ export class ArcRotateCameraPointersInput extends BaseCameraPointersInput {
         var direction = this.pinchInwards ? 1 : -1;
         var direction = this.pinchInwards ? 1 : -1;
 
 
         if (this.multiTouchPanAndZoom) {
         if (this.multiTouchPanAndZoom) {
+            // Zoom and panning enabled together
+
+            // Zoom
             if (this.useNaturalPinchZoom) {
             if (this.useNaturalPinchZoom) {
                 this.camera.radius = this.camera.radius *
                 this.camera.radius = this.camera.radius *
                     Math.sqrt(previousPinchSquaredDistance) / Math.sqrt(pinchSquaredDistance);
                     Math.sqrt(previousPinchSquaredDistance) / Math.sqrt(pinchSquaredDistance);
@@ -159,26 +162,30 @@ export class ArcRotateCameraPointersInput extends BaseCameraPointersInput {
                     (this.angularSensibilityX + this.angularSensibilityY) / 2);
                     (this.angularSensibilityX + this.angularSensibilityY) / 2);
             }
             }
 
 
-            if (this.panningSensibility !== 0 &&
-              previousMultiTouchPanPosition && multiTouchPanPosition) {
+            // Panning
+            if (this.panningSensibility !== 0 && previousMultiTouchPanPosition
+                && multiTouchPanPosition) {
                 var moveDeltaX = multiTouchPanPosition.x - previousMultiTouchPanPosition.x;
                 var moveDeltaX = multiTouchPanPosition.x - previousMultiTouchPanPosition.x;
                 var moveDeltaY = multiTouchPanPosition.y - previousMultiTouchPanPosition.y;
                 var moveDeltaY = multiTouchPanPosition.y - previousMultiTouchPanPosition.y;
                 this.camera.inertialPanningX += -moveDeltaX / this.panningSensibility;
                 this.camera.inertialPanningX += -moveDeltaX / this.panningSensibility;
                 this.camera.inertialPanningY += moveDeltaY / this.panningSensibility;
                 this.camera.inertialPanningY += moveDeltaY / this.panningSensibility;
             }
             }
-        } else {
+        } else if (this.multiTouchPanning) {
+            // Zoom and panning enabled but only one at a time
             this._twoFingerActivityCount++;
             this._twoFingerActivityCount++;
             var previousPinchDistance = Math.sqrt(previousPinchSquaredDistance);
             var previousPinchDistance = Math.sqrt(previousPinchSquaredDistance);
             var pinchDistance = Math.sqrt(pinchSquaredDistance);
             var pinchDistance = Math.sqrt(pinchSquaredDistance);
-            if (this._isPinching ||
-              (this._twoFingerActivityCount < 20 &&
-               Math.abs(pinchDistance - previousPinchDistance) >
-               this.camera.pinchToPanMaxDistance)) {
+
+            if (this._isPinching
+                || (this._twoFingerActivityCount < 20
+                && Math.abs(pinchDistance - previousPinchDistance) >
+                this.camera.pinchToPanMaxDistance)) {
+
                 // Since pinch has not been active long, assume we intend to zoom.
                 // Since pinch has not been active long, assume we intend to zoom.
                 if (this.pinchDeltaPercentage) {
                 if (this.pinchDeltaPercentage) {
                     this.camera.inertialRadiusOffset +=
                     this.camera.inertialRadiusOffset +=
-                      (pinchSquaredDistance - previousPinchSquaredDistance) * 0.001 *
-                      this.camera.radius * this.pinchDeltaPercentage;
+                        (pinchSquaredDistance - previousPinchSquaredDistance) * 0.001 *
+                        this.camera.radius * this.pinchDeltaPercentage;
                 } else {
                 } else {
                     this.camera.inertialRadiusOffset +=
                     this.camera.inertialRadiusOffset +=
                         (pinchSquaredDistance - previousPinchSquaredDistance) /
                         (pinchSquaredDistance - previousPinchSquaredDistance) /
@@ -191,15 +198,33 @@ export class ArcRotateCameraPointersInput extends BaseCameraPointersInput {
             } else {
             } else {
                 // Pause between pinch starting and moving implies not a zoom event.
                 // Pause between pinch starting and moving implies not a zoom event.
                 // Pan instead.
                 // Pan instead.
-                if (this.panningSensibility !== 0 && this.multiTouchPanning &&
-                  multiTouchPanPosition && previousMultiTouchPanPosition) {
+                if (this.panningSensibility !== 0 && multiTouchPanPosition
+                    && previousMultiTouchPanPosition) {
                     var moveDeltaX = multiTouchPanPosition.x - previousMultiTouchPanPosition.x;
                     var moveDeltaX = multiTouchPanPosition.x - previousMultiTouchPanPosition.x;
                     var moveDeltaY = multiTouchPanPosition.y - previousMultiTouchPanPosition.y;
                     var moveDeltaY = multiTouchPanPosition.y - previousMultiTouchPanPosition.y;
                     this.camera.inertialPanningX += -moveDeltaX / this.panningSensibility;
                     this.camera.inertialPanningX += -moveDeltaX / this.panningSensibility;
                     this.camera.inertialPanningY += moveDeltaY / this.panningSensibility;
                     this.camera.inertialPanningY += moveDeltaY / this.panningSensibility;
                 }
                 }
             }
             }
+        } else {
+            // Zoom enabled, panning disabled
+            if (this.useNaturalPinchZoom) {
+                this.camera.radius = this.camera.radius *
+                    Math.sqrt(previousPinchSquaredDistance) / Math.sqrt(pinchSquaredDistance);
+            } else if (this.pinchDeltaPercentage) {
+                this.camera.inertialRadiusOffset +=
+                    (pinchSquaredDistance - previousPinchSquaredDistance) * 0.001 *
+                    this.camera.radius * this.pinchDeltaPercentage;
+            }
+            else {
+                this.camera.inertialRadiusOffset +=
+                    (pinchSquaredDistance - previousPinchSquaredDistance) /
+                    (this.pinchPrecision * direction *
+                    (this.angularSensibilityX + this.angularSensibilityY) / 2);
+            }
         }
         }
+
+        // TODO: Add `multiTouchZoom` property to enable/disable zoom on multi touch event?
     }
     }
 
 
     /**
     /**