Przeglądaj źródła

Merge pull request #1059 from Temechon/master

Add a new camera : VRDeviceOrientationArcRotateCamera
David Catuhe 9 lat temu
rodzic
commit
88ecafedf8

+ 1 - 0
Tools/Gulp/config.json

@@ -55,6 +55,7 @@
       "../../src/cameras/inputs/babylon.arcrotatecamera.input.mousewheel.js",
       "../../src/cameras/inputs/babylon.arcrotatecamera.input.pointers.js",
       "../../src/cameras/inputs/babylon.arcrotatecamera.input.gamepad.js",
+      "../../src/cameras/inputs/babylon.arcrotatecamera.input.vrdeviceorientation.js",
       "../../src/Cameras/babylon.targetCamera.js",
       "../../src/Cameras/babylon.freeCamera.js",
       "../../src/Cameras/babylon.freeCameraInputsManager.js",

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

@@ -10,6 +10,7 @@
     - New debuger tool: SkeletonViewer. See [demo here](Demo available here: http://www.babylonjs-playground.com/#1BZJVJ#8) (Adam & [deltakosh](https://github.com/deltakosh))
     - Added Camera Inputs Manager to manage camera inputs (mouse, touch, keyboard, gamepad, ...) in a composable way, without relying on class inheritance [gleborgne](https://github.com/gleborgne)
     - Introduced new observable system to handle events ([nockawa](https://github.com/nockawa), [deltakosh](https://github.com/deltakosh))
+    - Added a new VR camera : VRDeviceOrientationArcRotateCamera [temechon](https://github.com/Temechon)
   - **Updates**
     - Added skeleton.getBoneIndexByName(boneName: string) [dad72](https://github.com/dad72)
     - Added node._children to track children hierarchy ([deltakosh](https://github.com/deltakosh))

+ 61 - 0
src/Cameras/Inputs/babylon.arcrotatecamera.input.vrdeviceorientation.ts

@@ -0,0 +1,61 @@
+module BABYLON {
+    export class ArcRotateCameraVRDeviceOrientationInput implements ICameraInput<ArcRotateCamera> {
+        camera: ArcRotateCamera;
+
+        public alphaCorrection = 1;
+        public betaCorrection = 1;
+        public gammaCorrection = 1;
+
+        private _alpha = 0;
+        private _beta = 0;
+        private _gamma = 0;
+        private _dirty = false;
+    
+        private _offsetOrientation: { yaw: number; pitch: number; roll: number };
+        private _deviceOrientationHandler;
+        
+        constructor() {
+            this._deviceOrientationHandler = this._onOrientationEvent.bind(this);
+        }
+
+        attachControl(element : HTMLElement, noPreventDefault?: boolean) {
+            this.camera.attachControl(element, noPreventDefault);
+            window.addEventListener("deviceorientation", this._deviceOrientationHandler);
+        }
+
+        public _onOrientationEvent(evt: DeviceOrientationEvent): void {
+            var camera = this.camera;
+            this._alpha = +evt.alpha | 0;
+            this._beta = +evt.beta | 0;
+            this._gamma = +evt.gamma | 0;
+            this._dirty = true;
+        }
+
+        public checkInputs() {
+            if (this._dirty){
+                this._dirty = false;
+                
+                 if (this._gamma < 0) {
+                    this._gamma = 180 + this._gamma;
+                }
+                
+                this.camera.alpha = (-this._alpha / 180.0 * Math.PI) % Math.PI*2;
+                this.camera.beta = (this._gamma / 180.0 * Math.PI);
+            }
+        }              
+
+        detachControl(element : HTMLElement) {
+            window.removeEventListener("deviceorientation", this._deviceOrientationHandler);
+        }
+
+        getTypeName(): string {
+            return "ArcRotateCameraVRDeviceOrientationInput";
+        }
+        
+        getSimpleName(){
+            return "VRDeviceOrientation";
+        }
+    }
+    
+    CameraInputTypes["ArcRotateCameraVRDeviceOrientationInput"] = ArcRotateCameraVRDeviceOrientationInput;
+}

+ 17 - 0
src/Cameras/VR/babylon.vrDeviceOrientationCamera.ts

@@ -16,4 +16,21 @@ module BABYLON {
             return "VRDeviceOrientationFreeCamera";
         }
     }
+    
+    export class VRDeviceOrientationArcRotateCamera extends ArcRotateCamera {        
+
+        constructor(name: string, alpha: number, beta: number, radius: number, target: Vector3, scene: Scene, compensateDistortion = true) {
+            super(name, alpha, beta, radius, target, scene);
+
+            var metrics = VRCameraMetrics.GetDefault();
+            metrics.compensateDistortion = compensateDistortion;
+            this.setCameraRigMode(Camera.RIG_MODE_VR, { vrCameraMetrics: metrics });
+
+            this.inputs.addVRDeviceOrientation();
+        }
+
+        public getTypeName(): string {
+            return "VRDeviceOrientationArcRotateCamera";
+        }
+    }
 }

+ 3 - 1
src/Cameras/babylon.arcRotateCamera.ts

@@ -521,7 +521,9 @@
                 case Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER:
                 case Camera.RIG_MODE_VR:
                     var alphaShift = this._cameraRigParams.stereoHalfAngle * (cameraIndex === 0 ? 1 : -1);
-                    return new ArcRotateCamera(name, this.alpha + alphaShift, this.beta, this.radius, this.target, this.getScene());
+                    var rigCam = new ArcRotateCamera(name, this.alpha + alphaShift, this.beta, this.radius, this.target, this.getScene());
+                    rigCam._cameraRigParams = {};
+                    return rigCam;
             }
             return null;
         }

+ 5 - 0
src/Cameras/babylon.arcRotateCameraInputsManager.ts

@@ -22,6 +22,11 @@ module BABYLON {
         public addGamepad(): ArcRotateCameraInputsManager {
             this.add(new ArcRotateCameraGamepadInput());
             return this;
+        }        
+
+        public addVRDeviceOrientation(): ArcRotateCameraInputsManager {
+            this.add(new ArcRotateCameraVRDeviceOrientationInput());
+            return this;
         }
     }
 }

+ 3 - 0
src/Cameras/babylon.camera.ts

@@ -509,6 +509,9 @@
                     break;
 
                 case Camera.RIG_MODE_VR:
+                    this._cameraRigParams.interaxialDistance = rigParams.interaxialDistance || 0.0637;
+                    this._cameraRigParams.stereoHalfAngle = BABYLON.Tools.ToRadians(this._cameraRigParams.interaxialDistance / 0.0637);
+                    
                     this._rigCameras.push(this.createRigCamera(this.name + "_L", 0));
                     this._rigCameras.push(this.createRigCamera(this.name + "_R", 1));