diff --git a/Source/Scene/ScreenSpaceCameraController.js b/Source/Scene/ScreenSpaceCameraController.js index 59fd6f251463..7e0de7296f25 100644 --- a/Source/Scene/ScreenSpaceCameraController.js +++ b/Source/Scene/ScreenSpaceCameraController.js @@ -446,6 +446,13 @@ define([ var scratchCartesian = new Cartesian3(); var scratchCartesianTwo = new Cartesian3(); var scratchCartesianThree = new Cartesian3(); + var scratchZoomViewOptions = { + orientation: { + heading: 0, + pitch: 0, + roll: 0 + } + }; function handleZoom(object, startPosition, movement, zoomFactor, distanceMeasure, unitPositionDotDirection) { var percentage = 1.0; @@ -485,6 +492,11 @@ define([ var camera = scene.camera; var mode = scene.mode; + var orientation = scratchZoomViewOptions.orientation; + orientation.heading = camera.heading; + orientation.pitch = camera.pitch; + orientation.roll = camera.roll; + if (camera.frustum instanceof OrthographicFrustum) { if (Math.abs(distance) > 0.0) { camera.zoomIn(distance); @@ -646,6 +658,7 @@ define([ Cartesian3.cross(camera.direction, camera.up, camera.right); Cartesian3.cross(camera.right, camera.direction, camera.up); + camera.setView(scratchZoomViewOptions); return; } @@ -691,6 +704,8 @@ define([ } else { camera.zoomIn(distance); } + + camera.setView(scratchZoomViewOptions); } var translate2DStart = new Ray(); diff --git a/Specs/Scene/ScreenSpaceCameraControllerSpec.js b/Specs/Scene/ScreenSpaceCameraControllerSpec.js index 088d263eb09b..6b71846515ae 100644 --- a/Specs/Scene/ScreenSpaceCameraControllerSpec.js +++ b/Specs/Scene/ScreenSpaceCameraControllerSpec.js @@ -849,19 +849,31 @@ defineSuite([ it('zoom in 3D with wheel', function() { setUp3D(); var position = Cartesian3.clone(camera.position); + var heading = camera.heading; + var pitch = camera.pitch; + var roll = camera.roll; simulateMouseWheel(120); updateController(); expect(Cartesian3.magnitude(position)).toBeGreaterThan(Cartesian3.magnitude(camera.position)); + expect(camera.heading).toBeCloseTo(heading, 10); + expect(camera.pitch).toBeCloseTo(pitch, 10); + expect(camera.roll).toBeCloseTo(roll, 10); }); it('zoom out in 3D with wheel', function() { setUp3D(); var position = Cartesian3.clone(camera.position); + var heading = camera.heading; + var pitch = camera.pitch; + var roll = camera.roll; simulateMouseWheel(-120); updateController(); expect(Cartesian3.magnitude(position)).toBeLessThan(Cartesian3.magnitude(camera.position)); + expect(camera.heading).toBeCloseTo(heading, 10); + expect(camera.pitch).toBeCloseTo(pitch, 10); + expect(camera.roll).toBeCloseTo(roll, 10); }); it('zoom in 3D with orthographic projection', function() {