소스 검색

Implement touch sensibility for camera

The current sensibility for the camera movement is slower on touch
than desktop. It seems the sensibility should be quicker on touch
to make it feel more responsive on mobile device. The value
should be set to 500 if users want it.
Mohamed Mansour 7 년 전
부모
커밋
10c9377d8c
3개의 변경된 파일51개의 추가작업 그리고 6개의 파일을 삭제
  1. 2 0
      inspector/src/properties.ts
  2. 19 6
      src/Cameras/Inputs/babylon.arcRotateCameraPointersInput.ts
  3. 30 0
      src/Cameras/babylon.arcRotateCamera.ts

+ 2 - 0
inspector/src/properties.ts

@@ -116,6 +116,8 @@ module INSPECTOR {
                 'radius',
                 'angularSensibilityX',
                 'angularSensibilityY',
+                'angularTouchSensibilityX',
+                'angularTouchSensibilityY',
                 'target',
                 'lowerAlphaLimit',
                 'lowerBetaLimit',

+ 19 - 6
src/Cameras/Inputs/babylon.arcRotateCameraPointersInput.ts

@@ -12,6 +12,12 @@ module BABYLON {
         public angularSensibilityY = 1000.0;
 
         @serialize()
+        public angularTouchSensibilityX = this.angularSensibilityX;
+
+        @serialize()
+        public angularTouchSensibilityY = this.angularSensibilityY;
+
+        @serialize()
         public pinchPrecision = 12.0;
 
         /**
@@ -33,6 +39,9 @@ module BABYLON {
         private _isPanClick: boolean = false;
         public pinchInwards = true;
 
+        private _angularSensibilityX = this.angularSensibilityX;
+        private _angularSensibilityY = this.angularSensibilityY;
+
         private _pointerInput: (p: PointerInfo, s: EventState) => void;
         private _observer: Nullable<Observer<PointerInfo>>;
         private _onMouseMove: Nullable<(e: MouseEvent) => any>;
@@ -54,7 +63,11 @@ module BABYLON {
 
             this._pointerInput = (p, s) => {
                 var evt = <PointerEvent>p.event;
-
+                let isTouch = (<any>p.event).pointerType === "touch";
+                
+                this._angularSensibilityX = isTouch ? this.angularTouchSensibilityX : this.angularSensibilityX;
+                this._angularSensibilityY = isTouch ? this.angularTouchSensibilityY : this.angularSensibilityY;
+                
                 if (engine.isInVRExclusivePointerMode) {
                     return;
                 }
@@ -105,7 +118,7 @@ module BABYLON {
                     twoFingerActivityCount = 0;
                     initialDistance = 0;
 
-                    if ((<any>p.event).pointerType !== "touch") {
+                    if (!isTouch) {
                         pointB = null; // Mouse and pen are mono pointer
                     }
 
@@ -150,8 +163,8 @@ module BABYLON {
                         } else {
                             var offsetX = evt.clientX - cacheSoloPointer.x;
                             var offsetY = evt.clientY - cacheSoloPointer.y;
-                            this.camera.inertialAlphaOffset -= offsetX / this.angularSensibilityX;
-                            this.camera.inertialBetaOffset -= offsetY / this.angularSensibilityY;
+                            this.camera.inertialAlphaOffset -= offsetX / this._angularSensibilityX;
+                            this.camera.inertialBetaOffset -= offsetY / this._angularSensibilityY;
                         }
 
                         cacheSoloPointer.x = evt.clientX;
@@ -184,7 +197,7 @@ module BABYLON {
                             } else {
                                 this.camera.inertialRadiusOffset += (pinchSquaredDistance - previousPinchSquaredDistance) /
                                     (this.pinchPrecision *
-                                        ((this.angularSensibilityX + this.angularSensibilityY) / 2) *
+                                        ((this._angularSensibilityX + this._angularSensibilityY) / 2) *
                                         direction);
                             }
 
@@ -210,7 +223,7 @@ module BABYLON {
                                 } else {
                                     this.camera.inertialRadiusOffset += (pinchSquaredDistance - previousPinchSquaredDistance) /
                                         (this.pinchPrecision *
-                                            ((this.angularSensibilityX + this.angularSensibilityY) / 2) *
+                                            ((this._angularSensibilityX + this._angularSensibilityY) / 2) *
                                             direction);
                                 }
                                 previousMultiTouchPanPosition.isPaning = false;

+ 30 - 0
src/Cameras/babylon.arcRotateCamera.ts

@@ -96,6 +96,36 @@
             }
         }
 
+        public get angularTouchSensibilityX(): number {
+            var pointers = <ArcRotateCameraPointersInput>this.inputs.attached["pointers"];
+            if (pointers)
+                return pointers.angularTouchSensibilityX;
+
+            return 0;
+        }
+
+        public set angularTouchSensibilityX(value: number) {
+            var pointers = <ArcRotateCameraPointersInput>this.inputs.attached["pointers"];
+            if (pointers) {
+                pointers.angularTouchSensibilityX = value;
+            }
+        }
+
+        public get angularTouchSensibilityY(): number {
+            var pointers = <ArcRotateCameraPointersInput>this.inputs.attached["pointers"];
+            if (pointers)
+                return pointers.angularTouchSensibilityY;
+
+            return 0;
+        }
+
+        public set angularTouchSensibilityY(value: number) {
+            var pointers = <ArcRotateCameraPointersInput>this.inputs.attached["pointers"];
+            if (pointers) {
+                pointers.angularTouchSensibilityY = value;
+            }
+        }
+
         public get pinchPrecision(): number {
             var pointers = <ArcRotateCameraPointersInput>this.inputs.attached["pointers"];
             if (pointers)