|
@@ -0,0 +1,175 @@
|
|
|
+var __extends = this.__extends || function (d, b) {
|
|
|
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
|
|
|
+ function __() { this.constructor = d; }
|
|
|
+ __.prototype = b.prototype;
|
|
|
+ d.prototype = new __();
|
|
|
+};
|
|
|
+var BABYLON;
|
|
|
+(function (BABYLON) {
|
|
|
+ var OculusRiftDevKit2013_Metric = {
|
|
|
+ HResolution: 1280,
|
|
|
+ VResolution: 800,
|
|
|
+ HScreenSize: 0.149759993,
|
|
|
+ VScreenSize: 0.0935999975,
|
|
|
+ VScreenCenter: 0.0467999987,
|
|
|
+ EyeToScreenDistance: 0.0410000011,
|
|
|
+ LensSeparationDistance: 0.0635000020,
|
|
|
+ InterpupillaryDistance: 0.0640000030,
|
|
|
+ DistortionK: [1.0, 0.219999999, 0.239999995, 0.0],
|
|
|
+ ChromaAbCorrection: [0.995999992, -0.00400000019, 1.01400006, 0.0],
|
|
|
+ PostProcessScaleFactor: 1.714605507808412,
|
|
|
+ LensCenterOffset: 0.151976421
|
|
|
+ };
|
|
|
+
|
|
|
+ var _OculusInnerGamepadCamera = (function (_super) {
|
|
|
+ __extends(_OculusInnerGamepadCamera, _super);
|
|
|
+ function _OculusInnerGamepadCamera(name, position, scene, isLeftEye) {
|
|
|
+ _super.call(this, name, position, scene);
|
|
|
+ this._workMatrix = new BABYLON.Matrix();
|
|
|
+ this._actualUp = new BABYLON.Vector3(0, 0, 0);
|
|
|
+
|
|
|
+ // Constants
|
|
|
+ this._aspectRatioAspectRatio = OculusRiftDevKit2013_Metric.HResolution / (2 * OculusRiftDevKit2013_Metric.VResolution);
|
|
|
+ this._aspectRatioFov = (2 * Math.atan((OculusRiftDevKit2013_Metric.PostProcessScaleFactor * OculusRiftDevKit2013_Metric.VScreenSize) / (2 * OculusRiftDevKit2013_Metric.EyeToScreenDistance)));
|
|
|
+
|
|
|
+ var hMeters = (OculusRiftDevKit2013_Metric.HScreenSize / 4) - (OculusRiftDevKit2013_Metric.LensSeparationDistance / 2);
|
|
|
+ var h = (4 * hMeters) / OculusRiftDevKit2013_Metric.HScreenSize;
|
|
|
+
|
|
|
+ this._hMatrix = BABYLON.Matrix.Translation(isLeftEye ? h : -h, 0, 0);
|
|
|
+
|
|
|
+ this.viewport = new BABYLON.Viewport(isLeftEye ? 0 : 0.5, 0, 0.5, 1.0);
|
|
|
+
|
|
|
+ this._preViewMatrix = BABYLON.Matrix.Translation(isLeftEye ? .5 * OculusRiftDevKit2013_Metric.InterpupillaryDistance : -.5 * OculusRiftDevKit2013_Metric.InterpupillaryDistance, 0, 0);
|
|
|
+
|
|
|
+ // Postprocess
|
|
|
+ var postProcess = new BABYLON.OculusDistortionCorrectionPostProcess("Oculus Distortion", this, !isLeftEye, OculusRiftDevKit2013_Metric);
|
|
|
+ }
|
|
|
+ _OculusInnerGamepadCamera.prototype.getProjectionMatrix = function () {
|
|
|
+ BABYLON.Matrix.PerspectiveFovLHToRef(this._aspectRatioFov, this._aspectRatioAspectRatio, this.minZ, this.maxZ, this._workMatrix);
|
|
|
+ this._workMatrix.multiplyToRef(this._hMatrix, this._projectionMatrix);
|
|
|
+ return this._projectionMatrix;
|
|
|
+ };
|
|
|
+
|
|
|
+ _OculusInnerGamepadCamera.prototype._getViewMatrix = function () {
|
|
|
+ BABYLON.Matrix.RotationYawPitchRollToRef(this.rotation.y, this.rotation.x, this.rotation.z, this._cameraRotationMatrix);
|
|
|
+
|
|
|
+ BABYLON.Vector3.TransformCoordinatesToRef(this._referencePoint, this._cameraRotationMatrix, this._transformedReferencePoint);
|
|
|
+ BABYLON.Vector3.TransformNormalToRef(this.upVector, this._cameraRotationMatrix, this._actualUp);
|
|
|
+
|
|
|
+ // Computing target and final matrix
|
|
|
+ this.position.addToRef(this._transformedReferencePoint, this._currentTarget);
|
|
|
+
|
|
|
+ BABYLON.Matrix.LookAtLHToRef(this.position, this._currentTarget, this._actualUp, this._workMatrix);
|
|
|
+
|
|
|
+ this._workMatrix.multiplyToRef(this._preViewMatrix, this._viewMatrix);
|
|
|
+ return this._viewMatrix;
|
|
|
+ };
|
|
|
+ return _OculusInnerGamepadCamera;
|
|
|
+ })(BABYLON.FreeCamera);
|
|
|
+
|
|
|
+ var OculusGamepadCamera = (function (_super) {
|
|
|
+ __extends(OculusGamepadCamera, _super);
|
|
|
+ function OculusGamepadCamera(name, position, scene) {
|
|
|
+ var _this = this;
|
|
|
+ _super.call(this, name, position, scene);
|
|
|
+ this.angularSensibility = 200;
|
|
|
+ this.moveSensibility = 75;
|
|
|
+
|
|
|
+ this._leftCamera = new _OculusInnerGamepadCamera(name + "_left", position.clone(), scene, true);
|
|
|
+ this._rightCamera = new _OculusInnerGamepadCamera(name + "_right", position.clone(), scene, false);
|
|
|
+
|
|
|
+ this.subCameras.push(this._leftCamera);
|
|
|
+ this.subCameras.push(this._rightCamera);
|
|
|
+
|
|
|
+ this._deviceOrientationHandler = this._onOrientationEvent.bind(this);
|
|
|
+ this._gamepads = new BABYLON.Gamepads(function (gamepad) {
|
|
|
+ _this._onNewGameConnected(gamepad);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ OculusGamepadCamera.prototype._onNewGameConnected = function (gamepad) {
|
|
|
+ // Only the first gamepad can control the camera
|
|
|
+ if (gamepad.index === 0) {
|
|
|
+ this._gamepad = gamepad;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ OculusGamepadCamera.prototype._update = function () {
|
|
|
+ this._leftCamera.position.copyFrom(this.position);
|
|
|
+ this._rightCamera.position.copyFrom(this.position);
|
|
|
+
|
|
|
+ this._updateCamera(this._leftCamera);
|
|
|
+ this._updateCamera(this._rightCamera);
|
|
|
+
|
|
|
+ _super.prototype._update.call(this);
|
|
|
+ };
|
|
|
+
|
|
|
+ OculusGamepadCamera.prototype._checkInputs = function () {
|
|
|
+ if (!this._gamepad) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ var LSValues = this._gamepad.leftStick;
|
|
|
+ var normalizedLX = LSValues.x / this.moveSensibility;
|
|
|
+ var normalizedLY = LSValues.y / this.moveSensibility;
|
|
|
+ LSValues.x = Math.abs(normalizedLX) > 0.005 ? 0 + normalizedLX : 0;
|
|
|
+ LSValues.y = Math.abs(normalizedLY) > 0.005 ? 0 + normalizedLY : 0;
|
|
|
+
|
|
|
+ var cameraTransform = BABYLON.Matrix.RotationYawPitchRoll(this.rotation.y, this.rotation.x, 0);
|
|
|
+ var deltaTransform = BABYLON.Vector3.TransformCoordinates(new BABYLON.Vector3(LSValues.x, 0, -LSValues.y), cameraTransform);
|
|
|
+ this.cameraDirection = this.cameraDirection.add(deltaTransform);
|
|
|
+ };
|
|
|
+
|
|
|
+ OculusGamepadCamera.prototype._updateCamera = function (camera) {
|
|
|
+ camera.minZ = this.minZ;
|
|
|
+ camera.maxZ = this.maxZ;
|
|
|
+
|
|
|
+ camera.rotation.x = this.rotation.x;
|
|
|
+ camera.rotation.y = this.rotation.y;
|
|
|
+ camera.rotation.z = this.rotation.z;
|
|
|
+ };
|
|
|
+
|
|
|
+ // Oculus events
|
|
|
+ OculusGamepadCamera.prototype._onOrientationEvent = function (evt) {
|
|
|
+ var yaw = evt.alpha / 180 * Math.PI;
|
|
|
+ var pitch = evt.beta / 180 * Math.PI;
|
|
|
+ var roll = evt.gamma / 180 * Math.PI;
|
|
|
+
|
|
|
+ if (!this._offsetOrientation) {
|
|
|
+ this._offsetOrientation = {
|
|
|
+ yaw: yaw,
|
|
|
+ pitch: pitch,
|
|
|
+ roll: roll
|
|
|
+ };
|
|
|
+ return;
|
|
|
+ } else {
|
|
|
+ this.rotation.y += yaw - this._offsetOrientation.yaw;
|
|
|
+ this.rotation.x += pitch - this._offsetOrientation.pitch;
|
|
|
+ this.rotation.z += this._offsetOrientation.roll - roll;
|
|
|
+
|
|
|
+ this._offsetOrientation.yaw = yaw;
|
|
|
+ this._offsetOrientation.pitch = pitch;
|
|
|
+ this._offsetOrientation.roll = roll;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ OculusGamepadCamera.prototype.attachControl = function (element, noPreventDefault) {
|
|
|
+ _super.prototype.attachControl.call(this, element, noPreventDefault);
|
|
|
+
|
|
|
+ window.addEventListener("deviceorientation", this._deviceOrientationHandler);
|
|
|
+ };
|
|
|
+
|
|
|
+ OculusGamepadCamera.prototype.detachControl = function (element) {
|
|
|
+ _super.prototype.detachControl.call(this, element);
|
|
|
+
|
|
|
+ window.removeEventListener("deviceorientation", this._deviceOrientationHandler);
|
|
|
+ };
|
|
|
+
|
|
|
+ OculusGamepadCamera.prototype.dispose = function () {
|
|
|
+ this._gamepads.dispose();
|
|
|
+ _super.prototype.dispose.call(this);
|
|
|
+ };
|
|
|
+ return OculusGamepadCamera;
|
|
|
+ })(BABYLON.FreeCamera);
|
|
|
+ BABYLON.OculusGamepadCamera = OculusGamepadCamera;
|
|
|
+})(BABYLON || (BABYLON = {}));
|
|
|
+//# sourceMappingURL=babylon.oculusGamepadCamera.js.map
|