From 67953aa320a7dc869a152efdd31e80006823e837 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Fri, 29 Jan 2016 10:56:44 -0500 Subject: [PATCH 01/24] Keep same position/orientation when morphing from 3D to Columbus view. --- Source/Scene/SceneTransitioner.js | 76 ++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 21 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 4124a222d29..1245444f982 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -11,6 +11,7 @@ define([ '../Core/Matrix4', '../Core/ScreenSpaceEventHandler', '../Core/ScreenSpaceEventType', + '../Core/Transforms', './Camera', './OrthographicFrustum', './PerspectiveFrustum', @@ -27,6 +28,7 @@ define([ Matrix4, ScreenSpaceEventHandler, ScreenSpaceEventType, + Transforms, Camera, OrthographicFrustum, PerspectiveFrustum, @@ -178,7 +180,38 @@ define([ if (this._previousMode === SceneMode.SCENE2D) { morphFrom2DToColumbusView(this, duration, ellipsoid, completeColumbusViewCallback); } else { - morphFrom3DToColumbusView(this, duration, this._cameraCV, completeColumbusViewCallback); + var camera = scene.camera; + var position = camera.positionWC; + var direction = camera.directionWC; + var up = camera.upWC; + + var surfacePoint = ellipsoid.scaleToGeodeticSurface(position); + var fromENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid); + var toENU = Matrix4.inverseTransformation(fromENU, new Matrix4()); + + position = scene.mapProjection.project(ellipsoid.cartesianToCartographic(position)); + direction = Matrix4.multiplyByPointAsVector(toENU, direction, new Cartesian3()); + up = Matrix4.multiplyByPointAsVector(toENU, up, new Cartesian3()); + + var position2D = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, position, new Cartesian3()); + var direction2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, new Cartesian3()); + var up2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, up, new Cartesian3()); + + var frustum = new PerspectiveFrustum(); + frustum.aspectRatio = scene.drawingBufferWidth / scene.drawingBufferHeight; + frustum.fov = CesiumMath.toRadians(60.0); + + var cameraCV = { + position : position, + direction : direction, + up : up, + position2D : position2D, + direction2D : direction2D, + up2D : up2D, + frustum : frustum + }; + + morphFrom3DToColumbusView(this, duration, cameraCV, completeColumbusViewCallback(cameraCV)); } if (duration === 0.0 && defined(this._completeMorph)) { @@ -675,30 +708,31 @@ define([ transitioner._scene.morphComplete.raiseEvent(transitioner, transitioner._previousMode, SceneMode.SCENE2D, wasMorphing); } - function completeColumbusViewCallback(transitioner) { - var scene = transitioner._scene; - scene._mode = SceneMode.COLUMBUS_VIEW; - scene.morphTime = SceneMode.getMorphTime(SceneMode.COLUMBUS_VIEW); + function completeColumbusViewCallback(cameraCV) { + return function(transitioner) { + var scene = transitioner._scene; + scene._mode = SceneMode.COLUMBUS_VIEW; + scene.morphTime = SceneMode.getMorphTime(SceneMode.COLUMBUS_VIEW); - destroyMorphHandler(transitioner); - updateFrustums(transitioner); + destroyMorphHandler(transitioner); + updateFrustums(transitioner); - if (transitioner._previousModeMode !== SceneMode.MORPHING || transitioner._morphCancelled) { - transitioner._morphCancelled = false; + if (transitioner._previousModeMode !== SceneMode.MORPHING || transitioner._morphCancelled) { + transitioner._morphCancelled = false; - // TODO: Match incoming 2D or 3D position - var camera = scene.camera; - Cartesian3.clone(transitioner._cameraCV.position, camera.position); - Cartesian3.clone(transitioner._cameraCV.direction, camera.direction); - Cartesian3.clone(transitioner._cameraCV.up, camera.up); - Cartesian3.cross(camera.direction, camera.up, camera.right); - Cartesian3.normalize(camera.right, camera.right); - } + var camera = scene.camera; + Cartesian3.clone(cameraCV.position, camera.position); + Cartesian3.clone(cameraCV.direction, camera.direction); + Cartesian3.clone(cameraCV.up, camera.up); + Cartesian3.cross(camera.direction, camera.up, camera.right); + Cartesian3.normalize(camera.right, camera.right); + } - var wasMorphing = defined(transitioner._completeMorph); - transitioner._completeMorph = undefined; - scene.camera.update(scene.mode); - transitioner._scene.morphComplete.raiseEvent(transitioner, transitioner._previousMode, SceneMode.COLUMBUS_VIEW, wasMorphing); + var wasMorphing = defined(transitioner._completeMorph); + transitioner._completeMorph = undefined; + scene.camera.update(scene.mode); + transitioner._scene.morphComplete.raiseEvent(transitioner, transitioner._previousMode, SceneMode.COLUMBUS_VIEW, wasMorphing); + }; } return SceneTransitioner; From e497bdb1491e5633c0807656131c6d5685ab12e1 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Fri, 29 Jan 2016 15:28:09 -0500 Subject: [PATCH 02/24] Update 3D to 2D that mostly works. --- Source/Scene/SceneTransitioner.js | 93 ++++++++++++++++++------------- 1 file changed, 54 insertions(+), 39 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 1245444f982..febb123351b 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -152,7 +152,7 @@ define([ if (this._previousMode === SceneMode.COLUMBUS_VIEW) { morphFromColumbusViewTo2D(this, duration, ellipsoid, complete2DCallback); } else { - morphFrom3DTo2D(this, duration, ellipsoid, complete2DCallback); + morphFrom3DTo2D(this, duration, ellipsoid); } if (duration === 0.0 && defined(this._completeMorph)) { @@ -353,22 +353,18 @@ define([ return Cartesian3.lerp(startPosition, endPosition, time, new Cartesian3()); } - function morphPerspectiveToOrthographic(transitioner, duration, complete) { + function morphPerspectiveToOrthographic(transitioner, duration, endCamera, complete) { var scene = transitioner._scene; var camera = scene.camera; - var startPos = camera.position; var startFOV = camera.frustum.fov; var endFOV = CesiumMath.RADIANS_PER_DEGREE * 0.5; - var d = Cartesian3.magnitude(startPos) * Math.tan(startFOV * 0.5); + var d = endCamera.position.z * Math.tan(startFOV * 0.5); camera.frustum.far = d / Math.tan(endFOV * 0.5) + 10000000.0; function update(value) { camera.frustum.fov = CesiumMath.lerp(startFOV, endFOV, value.time); - - var distance = d / Math.tan(camera.frustum.fov * 0.5); - var pos = new Cartesian3(); - camera.position = Cartesian3.multiplyByScalar(Cartesian3.normalize(camera.position, pos), distance, pos); + camera.position.x = d / Math.tan(camera.frustum.fov * 0.5); } var tween = scene.tweens.add({ duration : duration, @@ -381,7 +377,7 @@ define([ }, update : update, complete : function() { - camera.frustum = transitioner._camera2D.frustum.clone(); + camera.frustum = endCamera.frustum.clone(); complete(transitioner); } }); @@ -432,25 +428,43 @@ define([ transitioner._currentTweens.push(tween); } - function morphFrom3DTo2D(transitioner, duration, ellipsoid, complete) { + function morphFrom3DTo2D(transitioner, duration, ellipsoid) { duration *= 0.5; - var maxRadii = ellipsoid.maximumRadius; + var scene = transitioner._scene; - var tanPhi = Math.tan(transitioner._camera3D.frustum.fovy * 0.5); - var tanTheta = transitioner._camera3D.frustum.aspectRatio * tanPhi; - var d = (maxRadii * Math.PI) / tanTheta; + var position = scene.mapProjection.project(ellipsoid.cartesianToCartographic(scene.camera.positionWC)); - var camera3DTo2D = {}; - var pos2D = new Cartesian3(); - camera3DTo2D.position2D = Cartesian3.multiplyByScalar(Cartesian3.normalize(transitioner._camera2D.position2D, pos2D), d, pos2D); - camera3DTo2D.direction2D = Cartesian3.clone(transitioner._camera2D.direction2D); - camera3DTo2D.up2D = Cartesian3.clone(transitioner._camera2D.up2D); + var frustum = new OrthographicFrustum(); + frustum.right = position.z; + frustum.left = -frustum.right; + frustum.top = frustum.right * (scene.drawingBufferHeight / scene.drawingBufferWidth); + frustum.bottom = -frustum.top; + + var direction = Cartesian3.negate(Cartesian3.UNIT_Z, new Cartesian3()); + var up = Cartesian3.clone(Cartesian3.UNIT_Y); + + var position2D = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, position, new Cartesian3()); + var direction2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, new Cartesian3()); + var up2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, up, new Cartesian3()); + + var camera2D = { + position : position, + direction : direction, + up : up, + position2D : position2D, + direction2D : direction2D, + up2D : up2D, + frustum : frustum + }; + + var complete = complete2DCallback(camera2D); + createMorphHandler(transitioner, complete); function completeCallback() { - morphPerspectiveToOrthographic(transitioner, duration, complete); + morphPerspectiveToOrthographic(transitioner, duration, camera2D, complete); } - morphFrom3DToColumbusView(transitioner, duration, camera3DTo2D, completeCallback); + morphFrom3DToColumbusView(transitioner, duration, camera2D, completeCallback); } function morphOrthographicToPerspective(transitioner, duration, ellipsoid, complete) { @@ -685,27 +699,28 @@ define([ transitioner._scene.morphComplete.raiseEvent(transitioner, transitioner._previousMode, SceneMode.SCENE3D, wasMorphing); } - function complete2DCallback(transitioner) { - var scene = transitioner._scene; + function complete2DCallback(camera2D) { + return function(transitioner) { + var scene = transitioner._scene; - scene._mode = SceneMode.SCENE2D; - scene.morphTime = SceneMode.getMorphTime(SceneMode.SCENE2D); + scene._mode = SceneMode.SCENE2D; + scene.morphTime = SceneMode.getMorphTime(SceneMode.SCENE2D); - destroyMorphHandler(transitioner); - updateFrustums(transitioner); + destroyMorphHandler(transitioner); - // TODO: Match incoming columbus-view or 3D position - var camera = scene.camera; - Cartesian3.clone(transitioner._camera2D.position, camera.position); - Cartesian3.clone(transitioner._camera2D.direction, camera.direction); - Cartesian3.clone(transitioner._camera2D.up, camera.up); - Cartesian3.cross(camera.direction, camera.up, camera.right); - Cartesian3.normalize(camera.right, camera.right); + var camera = scene.camera; + Cartesian3.clone(camera2D.position, camera.position); + Cartesian3.clone(camera2D.direction, camera.direction); + Cartesian3.clone(camera2D.up, camera.up); + Cartesian3.cross(camera.direction, camera.up, camera.right); + Cartesian3.normalize(camera.right, camera.right); + camera.frustum = camera2D.frustum.clone(); - var wasMorphing = defined(transitioner._completeMorph); - transitioner._completeMorph = undefined; - scene.camera.update(scene.mode); - transitioner._scene.morphComplete.raiseEvent(transitioner, transitioner._previousMode, SceneMode.SCENE2D, wasMorphing); + var wasMorphing = defined(transitioner._completeMorph); + transitioner._completeMorph = undefined; + scene.camera.update(scene.mode); + transitioner._scene.morphComplete.raiseEvent(transitioner, transitioner._previousMode, SceneMode.SCENE2D, wasMorphing); + }; } function completeColumbusViewCallback(cameraCV) { @@ -715,7 +730,7 @@ define([ scene.morphTime = SceneMode.getMorphTime(SceneMode.COLUMBUS_VIEW); destroyMorphHandler(transitioner); - updateFrustums(transitioner); + scene.camera.frustum = cameraCV.frustum.clone(); if (transitioner._previousModeMode !== SceneMode.MORPHING || transitioner._morphCancelled) { transitioner._morphCancelled = false; From 0521a8160aa5c7986e0c5bce80a5f4a001351ebc Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Mon, 1 Feb 2016 13:25:22 -0500 Subject: [PATCH 03/24] Update CV to 2D and fix 3D to 2D. --- Source/Scene/SceneTransitioner.js | 53 ++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index febb123351b..595c86d21ad 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -353,7 +353,7 @@ define([ return Cartesian3.lerp(startPosition, endPosition, time, new Cartesian3()); } - function morphPerspectiveToOrthographic(transitioner, duration, endCamera, complete) { + function morphPerspectiveToOrthographic(transitioner, duration, endCamera, updateHeight, complete) { var scene = transitioner._scene; var camera = scene.camera; @@ -364,7 +364,8 @@ define([ function update(value) { camera.frustum.fov = CesiumMath.lerp(startFOV, endFOV, value.time); - camera.position.x = d / Math.tan(camera.frustum.fov * 0.5); + var height = d / Math.tan(camera.frustum.fov * 0.5); + updateHeight(camera, height); } var tween = scene.tweens.add({ duration : duration, @@ -384,33 +385,45 @@ define([ transitioner._currentTweens.push(tween); } - function morphFromColumbusViewTo2D(transitioner, duration, ellipsoid, complete) { + function morphFromColumbusViewTo2D(transitioner, duration, ellipsoid) { + duration *= 0.5; + var scene = transitioner._scene; var camera = scene.camera; - camera._setTransform(Matrix4.IDENTITY); - var maxRadii = ellipsoid.maximumRadius; - var startPos = Cartesian3.clone(camera.position); + var position = Cartesian3.clone(camera.position); var startDir = Cartesian3.clone(camera.direction); var startUp = Cartesian3.clone(camera.up); - var tanPhi = Math.tan(transitioner._cameraCV.frustum.fovy * 0.5); - var tanTheta = transitioner._cameraCV.frustum.aspectRatio * tanPhi; - var d = (maxRadii * Math.PI) / tanTheta; + var endDir = Cartesian3.negate(Cartesian3.UNIT_Z, new Cartesian3()); + var endUp = Cartesian3.clone(Cartesian3.UNIT_Y); - var endPos = new Cartesian3(); - endPos = Cartesian3.multiplyByScalar(Cartesian3.normalize(transitioner._camera2D.position, endPos), d, endPos); - var endDir = Cartesian3.clone(transitioner._camera2D.direction); - var endUp = Cartesian3.clone(transitioner._camera2D.up); + var frustum = new OrthographicFrustum(); + frustum.right = position.z * 0.5; + frustum.left = -frustum.right; + frustum.top = frustum.right * (scene.drawingBufferHeight / scene.drawingBufferWidth); + frustum.bottom = -frustum.top; + + var camera2D = { + position : position, + direction : endDir, + up : endUp, + frustum : frustum + }; + var complete = complete2DCallback(camera2D); + createMorphHandler(transitioner, complete); function updateCV(value) { - camera.position = columbusViewMorph(startPos, endPos, value.time); camera.direction = columbusViewMorph(startDir, endDir, value.time); camera.up = columbusViewMorph(startUp, endUp, value.time); camera.right = Cartesian3.cross(camera.direction, camera.up, camera.right); Cartesian3.normalize(camera.right, camera.right); } - duration *= 0.5; + + function updateHeight(camera, height) { + camera.position.z = height; + } + var tween = scene.tweens.add({ duration : duration, easingFunction : EasingFunction.QUARTIC_OUT, @@ -422,7 +435,7 @@ define([ }, update : updateCV, complete : function() { - morphPerspectiveToOrthographic(transitioner, duration, complete); + morphPerspectiveToOrthographic(transitioner, duration, camera2D, updateHeight, complete); } }); transitioner._currentTweens.push(tween); @@ -436,7 +449,7 @@ define([ var position = scene.mapProjection.project(ellipsoid.cartesianToCartographic(scene.camera.positionWC)); var frustum = new OrthographicFrustum(); - frustum.right = position.z; + frustum.right = position.z * 0.5; frustum.left = -frustum.right; frustum.top = frustum.right * (scene.drawingBufferHeight / scene.drawingBufferWidth); frustum.bottom = -frustum.top; @@ -458,11 +471,15 @@ define([ frustum : frustum }; + function updateHeight(camera, height) { + camera.position.x = height; + } + var complete = complete2DCallback(camera2D); createMorphHandler(transitioner, complete); function completeCallback() { - morphPerspectiveToOrthographic(transitioner, duration, camera2D, complete); + morphPerspectiveToOrthographic(transitioner, duration, camera2D, updateHeight, complete); } morphFrom3DToColumbusView(transitioner, duration, camera2D, completeCallback); } From bc767d2af64c6b1bc4cd8c23932f25b37db7c9cb Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Wed, 3 Feb 2016 10:15:07 -0500 Subject: [PATCH 04/24] Update CV to 3D. WIP. --- Source/Scene/SceneTransitioner.js | 72 +++++++++++++++++++------------ 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 595c86d21ad..99094b3c617 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -239,7 +239,7 @@ define([ if (this._previousMode === SceneMode.SCENE2D) { morphFrom2DTo3D(this, duration, ellipsoid, complete3DCallback); } else { - morphFromColumbusViewTo3D(this, duration, ellipsoid, complete3DCallback); + morphFromColumbusViewTo3D(this, duration, ellipsoid); } if (duration === 0.0 && defined(this._completeMorph)) { @@ -299,19 +299,28 @@ define([ transitioner._morphHandler = transitioner._morphHandler && transitioner._morphHandler.destroy(); } - function morphFromColumbusViewTo3D(transitioner, duration, ellipsoid, complete) { + function morphFromColumbusViewTo3D(transitioner, duration, ellipsoid) { var scene = transitioner._scene; var camera = scene.camera; camera._setTransform(Matrix4.IDENTITY); - var startPos = camera.position; - var startDir = camera.direction; - var startUp = camera.up; + var startPos = Cartesian3.clone(camera.position); + var startDir = Cartesian3.clone(camera.direction); + var startUp = Cartesian3.clone(camera.up); + + var positionCarto = scene.mapProjection.unproject(camera.position); + var position = ellipsoid.cartographicToCartesian(positionCarto); + var surfacePoint = ellipsoid.scaleToGeodeticSurface(position); - var endPos = Cartesian3.clone(transitioner._camera2D.position); - var endDir = Cartesian3.clone(transitioner._camera2D.direction); - var endUp = Cartesian3.clone(transitioner._camera2D.up); + var fromENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid); + + var endPos = Cartesian3.clone(position); + var endDir = Cartesian3.clone(startDir); + var endUp = Cartesian3.clone(startUp); + + Matrix4.multiplyByPointAsVector(fromENU, endDir, endDir); + Matrix4.multiplyByPointAsVector(fromENU, endUp, endUp); function update(value) { camera.position = columbusViewMorph(startPos, endPos, value.time); @@ -320,6 +329,7 @@ define([ camera.right = Cartesian3.cross(camera.direction, camera.up, camera.right); Cartesian3.normalize(camera.right, camera.right); } + var tween = scene.tweens.add({ duration : duration, easingFunction : EasingFunction.QUARTIC_OUT, @@ -333,6 +343,9 @@ define([ }); transitioner._currentTweens.push(tween); + var complete = complete3DCallback(); + createMorphHandler(transitioner, complete); + addMorphTimeAnimations(transitioner, scene, 0.0, 1.0, duration, complete); } @@ -690,30 +703,33 @@ define([ } } - function complete3DCallback(transitioner) { - var scene = transitioner._scene; - scene._mode = SceneMode.SCENE3D; - scene.morphTime = SceneMode.getMorphTime(SceneMode.SCENE3D); + function complete3DCallback() { + return function(transitioner) { + var scene = transitioner._scene; + scene._mode = SceneMode.SCENE3D; + scene.morphTime = SceneMode.getMorphTime(SceneMode.SCENE3D); - destroyMorphHandler(transitioner); - updateFrustums(transitioner); + destroyMorphHandler(transitioner); + updateFrustums(transitioner); - if (transitioner._previousMode !== SceneMode.MORPHING || transitioner._morphCancelled) { - transitioner._morphCancelled = false; + if (transitioner._previousMode !== SceneMode.MORPHING || transitioner._morphCancelled) { + transitioner._morphCancelled = false; - // TODO: Match incoming columbus-view or 2D position - var camera = scene.camera; - camera.position = Cartesian3.clone(transitioner._camera3D.position); - camera.direction = Cartesian3.clone(transitioner._camera3D.direction); - camera.up = Cartesian3.clone(transitioner._camera3D.up); - camera.right = Cartesian3.cross(camera.direction, camera.up, camera.right); - Cartesian3.normalize(camera.right, camera.right); - } + /* + var camera = scene.camera; + camera.position = Cartesian3.clone(camera3D.position); + camera.direction = Cartesian3.clone(camera3D.direction); + camera.up = Cartesian3.clone(camera3D.up); + camera.right = Cartesian3.cross(camera.direction, camera.up, camera.right); + Cartesian3.normalize(camera.right, camera.right); + */ + } - var wasMorphing = defined(transitioner._completeMorph); - transitioner._completeMorph = undefined; - scene.camera.update(scene.mode); - transitioner._scene.morphComplete.raiseEvent(transitioner, transitioner._previousMode, SceneMode.SCENE3D, wasMorphing); + var wasMorphing = defined(transitioner._completeMorph); + transitioner._completeMorph = undefined; + scene.camera.update(scene.mode); + transitioner._scene.morphComplete.raiseEvent(transitioner, transitioner._previousMode, SceneMode.SCENE3D, wasMorphing); + }; } function complete2DCallback(camera2D) { From e269e94dc9f182a86ba6b82276da407becb19156 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Wed, 3 Feb 2016 11:40:09 -0500 Subject: [PATCH 05/24] Mirror morph from perspective to orthographic projections when doing the opposite. --- Source/Scene/SceneTransitioner.js | 169 +++++++++--------------------- 1 file changed, 49 insertions(+), 120 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 99094b3c617..df90776d896 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -175,42 +175,41 @@ define([ updateFrustums(this); scene._mode = SceneMode.MORPHING; - createMorphHandler(this, completeColumbusViewCallback); + + var camera = scene.camera; + var position = camera.positionWC; + var direction = camera.directionWC; + var up = camera.upWC; + + var surfacePoint = ellipsoid.scaleToGeodeticSurface(position); + var fromENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid); + var toENU = Matrix4.inverseTransformation(fromENU, new Matrix4()); + + position = scene.mapProjection.project(ellipsoid.cartesianToCartographic(position)); + direction = Matrix4.multiplyByPointAsVector(toENU, direction, new Cartesian3()); + up = Matrix4.multiplyByPointAsVector(toENU, up, new Cartesian3()); + + var position2D = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, position, new Cartesian3()); + var direction2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, new Cartesian3()); + var up2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, up, new Cartesian3()); + + var frustum = new PerspectiveFrustum(); + frustum.aspectRatio = scene.drawingBufferWidth / scene.drawingBufferHeight; + frustum.fov = CesiumMath.toRadians(60.0); + + var cameraCV = { + position : position, + direction : direction, + up : up, + position2D : position2D, + direction2D : direction2D, + up2D : up2D, + frustum : frustum + }; if (this._previousMode === SceneMode.SCENE2D) { - morphFrom2DToColumbusView(this, duration, ellipsoid, completeColumbusViewCallback); + morphFrom2DToColumbusView(this, duration, cameraCV, ellipsoid, completeColumbusViewCallback(cameraCV)); } else { - var camera = scene.camera; - var position = camera.positionWC; - var direction = camera.directionWC; - var up = camera.upWC; - - var surfacePoint = ellipsoid.scaleToGeodeticSurface(position); - var fromENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid); - var toENU = Matrix4.inverseTransformation(fromENU, new Matrix4()); - - position = scene.mapProjection.project(ellipsoid.cartesianToCartographic(position)); - direction = Matrix4.multiplyByPointAsVector(toENU, direction, new Cartesian3()); - up = Matrix4.multiplyByPointAsVector(toENU, up, new Cartesian3()); - - var position2D = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, position, new Cartesian3()); - var direction2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, new Cartesian3()); - var up2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, up, new Cartesian3()); - - var frustum = new PerspectiveFrustum(); - frustum.aspectRatio = scene.drawingBufferWidth / scene.drawingBufferHeight; - frustum.fov = CesiumMath.toRadians(60.0); - - var cameraCV = { - position : position, - direction : direction, - up : up, - position2D : position2D, - direction2D : direction2D, - up2D : up2D, - frustum : frustum - }; - morphFrom3DToColumbusView(this, duration, cameraCV, completeColumbusViewCallback(cameraCV)); } @@ -497,115 +496,45 @@ define([ morphFrom3DToColumbusView(transitioner, duration, camera2D, completeCallback); } - function morphOrthographicToPerspective(transitioner, duration, ellipsoid, complete) { + function morphOrthographicToPerspective(transitioner, duration, cameraCV, complete) { var scene = transitioner._scene; var camera = scene.camera; - var maxRadii = ellipsoid.maximumRadius; - var tanPhi = Math.tan(transitioner._cameraCV.frustum.fovy * 0.5); - var tanTheta = transitioner._cameraCV.frustum.aspectRatio * tanPhi; - var d = (maxRadii * Math.PI) / tanTheta; - var endPos2D = new Cartesian3(); - endPos2D = Cartesian3.multiplyByScalar(Cartesian3.normalize(transitioner._camera2D.position, endPos2D), d, endPos2D); + camera.frustum = cameraCV.frustum.clone(); + var endFOV = camera.frustum.fov; + var startFOV = CesiumMath.RADIANS_PER_DEGREE * 0.5; + var d = camera.position.z * Math.tan(endFOV * 0.5); + camera.frustum.far = d / Math.tan(startFOV * 0.5) + 10000000.0; - var top = camera.frustum.top; - var bottom = camera.frustum.bottom; - var right = camera.frustum.right; - var left = camera.frustum.left; - - var frustum2D = transitioner._camera2D.frustum; - var frustumCV = transitioner._cameraCV.frustum; - - var startPos = Cartesian3.clone(camera.position); - - function update2D(value) { - camera.position = columbusViewMorph(startPos, endPos2D, value.time); - camera.frustum.top = CesiumMath.lerp(top, frustum2D.top, value.time); - camera.frustum.bottom = CesiumMath.lerp(bottom, frustum2D.bottom, value.time); - camera.frustum.right = CesiumMath.lerp(right, frustum2D.right, value.time); - camera.frustum.left = CesiumMath.lerp(left, frustum2D.left, value.time); - } - var startTime = (right - left) / (2.0 * maxRadii * Math.PI); - var endTime = 1.0; - if (startTime > endTime) { - startTime = 0.0; - } - - var partialDuration = (endTime - startTime) * duration; - if (partialDuration < CesiumMath.EPSILON6) { - if (!Cartesian3.equalsEpsilon(startPos, endPos2D, CesiumMath.EPSILON6)) { - partialDuration = duration; - startTime = 0.0; - endTime = 1.0; - } else { - // If the camera and frustum are already in position for the switch to - // a perspective projection, nothing needs to be animated. - camera.position = endPos2D; - camera.frustum = frustumCV.clone(); - complete(transitioner); - return; - } + function update(value) { + camera.frustum.fov = CesiumMath.lerp(startFOV, endFOV, value.time); + camera.position.z = d / Math.tan(camera.frustum.fov * 0.5); } - var tween = scene.tweens.add({ + duration : duration, easingFunction : EasingFunction.QUARTIC_OUT, - duration : partialDuration, startObject : { - time : startTime + time : 0.0 }, stopObject : { - time : endTime + time : 1.0 }, - update : update2D, + update : update, complete : function() { - camera.frustum = frustumCV.clone(); + camera.frustum = cameraCV.frustum.clone(); complete(transitioner); } }); transitioner._currentTweens.push(tween); } - function morphFrom2DToColumbusView(transitioner, duration, ellipsoid, complete) { + function morphFrom2DToColumbusView(transitioner, duration, cameraCV, ellipsoid, complete) { var scene = transitioner._scene; var camera = scene.camera; camera._setTransform(Matrix4.IDENTITY); - duration *= 0.5; - - function completeFrustumChange() { - var startPos = Cartesian3.clone(camera.position); - var startDir = Cartesian3.clone(camera.direction); - var startUp = Cartesian3.clone(camera.up); - - var endPos = Cartesian3.clone(transitioner._cameraCV.position); - var endDir = Cartesian3.clone(transitioner._cameraCV.direction); - var endUp = Cartesian3.clone(transitioner._cameraCV.up); - - function updateCV(value) { - camera.position = columbusViewMorph(startPos, endPos, value.time); - camera.direction = columbusViewMorph(startDir, endDir, value.time); - camera.up = columbusViewMorph(startUp, endUp, value.time); - camera.right = Cartesian3.cross(camera.direction, camera.up, camera.right); - Cartesian3.normalize(camera.right, camera.right); - } - var tween = scene.tweens.add({ - duration : duration, - easingFunction : EasingFunction.QUARTIC_OUT, - startObject : { - time : 0.0 - }, - stopObject : { - time : 1.0 - }, - update : updateCV, - complete : function() { - complete(transitioner); - } - }); - - transitioner._currentTweens.push(tween); - } - morphOrthographicToPerspective(transitioner, duration, ellipsoid, completeFrustumChange); + createMorphHandler(transitioner, complete); + morphOrthographicToPerspective(transitioner, duration, cameraCV, complete); } function morphFrom3DToColumbusView(transitioner, duration, endCamera, complete) { From 22d1f620cb9471de2782b7dd2998f57393a7a617 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Wed, 3 Feb 2016 12:05:24 -0500 Subject: [PATCH 06/24] Fix end position when morphing from 2D to CV. --- Source/Scene/SceneTransitioner.js | 42 +++++++++++++++++++------------ 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index df90776d896..0d23299c578 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -177,21 +177,27 @@ define([ scene._mode = SceneMode.MORPHING; var camera = scene.camera; - var position = camera.positionWC; - var direction = camera.directionWC; - var up = camera.upWC; + var position; + var direction; + var up; - var surfacePoint = ellipsoid.scaleToGeodeticSurface(position); - var fromENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid); - var toENU = Matrix4.inverseTransformation(fromENU, new Matrix4()); + if (this._previousMode === SceneMode.SCENE2D) { + position = Cartesian3.clone(camera.position); + direction = Cartesian3.negate(Cartesian3.UNIT_Z, new Cartesian3()); + up = Cartesian3.clone(Cartesian3.UNIT_Y); + } else { + position = camera.positionWC; + direction = camera.directionWC; + up = camera.upWC; - position = scene.mapProjection.project(ellipsoid.cartesianToCartographic(position)); - direction = Matrix4.multiplyByPointAsVector(toENU, direction, new Cartesian3()); - up = Matrix4.multiplyByPointAsVector(toENU, up, new Cartesian3()); + var surfacePoint = ellipsoid.scaleToGeodeticSurface(position); + var fromENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid); + var toENU = Matrix4.inverseTransformation(fromENU, new Matrix4()); - var position2D = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, position, new Cartesian3()); - var direction2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, new Cartesian3()); - var up2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, up, new Cartesian3()); + position = scene.mapProjection.project(ellipsoid.cartesianToCartographic(position)); + direction = Matrix4.multiplyByPointAsVector(toENU, direction, new Cartesian3()); + up = Matrix4.multiplyByPointAsVector(toENU, up, new Cartesian3()); + } var frustum = new PerspectiveFrustum(); frustum.aspectRatio = scene.drawingBufferWidth / scene.drawingBufferHeight; @@ -201,15 +207,20 @@ define([ position : position, direction : direction, up : up, - position2D : position2D, - direction2D : direction2D, - up2D : up2D, frustum : frustum }; if (this._previousMode === SceneMode.SCENE2D) { morphFrom2DToColumbusView(this, duration, cameraCV, ellipsoid, completeColumbusViewCallback(cameraCV)); } else { + var position2D = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, position, new Cartesian3()); + var direction2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, new Cartesian3()); + var up2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, up, new Cartesian3()); + + cameraCV.position2D = position2D; + cameraCV.direction2D = direction2D; + cameraCV.up2D = up2D; + morphFrom3DToColumbusView(this, duration, cameraCV, completeColumbusViewCallback(cameraCV)); } @@ -521,7 +532,6 @@ define([ }, update : update, complete : function() { - camera.frustum = cameraCV.frustum.clone(); complete(transitioner); } }); From 06dd00cf0c83f036f0a94f12f43add44f02e6b0f Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Wed, 3 Feb 2016 12:19:49 -0500 Subject: [PATCH 07/24] Remove unnecessary code to set the frustum. --- Source/Scene/SceneTransitioner.js | 51 +++++-------------------------- 1 file changed, 8 insertions(+), 43 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 0d23299c578..b27f8f5219b 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -145,12 +145,10 @@ define([ } this._scene.morphStart.raiseEvent(this, this._previousMode, SceneMode.SCENE2D, true); - updateFrustums(this); scene._mode = SceneMode.MORPHING; - createMorphHandler(this, complete2DCallback); if (this._previousMode === SceneMode.COLUMBUS_VIEW) { - morphFromColumbusViewTo2D(this, duration, ellipsoid, complete2DCallback); + morphFromColumbusViewTo2D(this, duration); } else { morphFrom3DTo2D(this, duration, ellipsoid); } @@ -173,7 +171,6 @@ define([ } this._scene.morphStart.raiseEvent(this, this._previousMode, SceneMode.COLUMBUS_VIEW, true); - updateFrustums(this); scene._mode = SceneMode.MORPHING; var camera = scene.camera; @@ -210,8 +207,11 @@ define([ frustum : frustum }; + var complete = completeColumbusViewCallback(cameraCV); + createMorphHandler(this, complete); + if (this._previousMode === SceneMode.SCENE2D) { - morphFrom2DToColumbusView(this, duration, cameraCV, ellipsoid, completeColumbusViewCallback(cameraCV)); + morphFrom2DToColumbusView(this, duration, cameraCV, complete); } else { var position2D = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, position, new Cartesian3()); var direction2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, new Cartesian3()); @@ -221,7 +221,7 @@ define([ cameraCV.direction2D = direction2D; cameraCV.up2D = up2D; - morphFrom3DToColumbusView(this, duration, cameraCV, completeColumbusViewCallback(cameraCV)); + morphFrom3DToColumbusView(this, duration, cameraCV, complete); } if (duration === 0.0 && defined(this._completeMorph)) { @@ -242,7 +242,6 @@ define([ } this._scene.morphStart.raiseEvent(this, this._previousMode, SceneMode.SCENE3D, true); - updateFrustums(this); scene._mode = SceneMode.MORPHING; createMorphHandler(this, complete3DCallback); @@ -408,7 +407,7 @@ define([ transitioner._currentTweens.push(tween); } - function morphFromColumbusViewTo2D(transitioner, duration, ellipsoid) { + function morphFromColumbusViewTo2D(transitioner, duration) { duration *= 0.5; var scene = transitioner._scene; @@ -538,12 +537,10 @@ define([ transitioner._currentTweens.push(tween); } - function morphFrom2DToColumbusView(transitioner, duration, cameraCV, ellipsoid, complete) { + function morphFrom2DToColumbusView(transitioner, duration, cameraCV, complete) { var scene = transitioner._scene; var camera = scene.camera; camera._setTransform(Matrix4.IDENTITY); - - createMorphHandler(transitioner, complete); morphOrthographicToPerspective(transitioner, duration, cameraCV, complete); } @@ -611,37 +608,6 @@ define([ transitioner._currentTweens.push(tween); } - function updateFrustums(transitioner) { - var scene = transitioner._scene; - - var ratio = scene.drawingBufferHeight / scene.drawingBufferWidth; - - var frustum = transitioner._camera2D.frustum; - frustum.top = frustum.right * ratio; - frustum.bottom = -frustum.top; - - ratio = 1.0 / ratio; - - frustum = transitioner._cameraCV.frustum; - frustum.aspectRatio = ratio; - - frustum = transitioner._camera3D.frustum; - frustum.aspectRatio = ratio; - - var camera = scene.camera; - switch (scene.mode) { - case SceneMode.SCENE3D: - camera.frustum = transitioner._camera3D.frustum.clone(); - break; - case SceneMode.COLUMBUS_VIEW: - camera.frustum = transitioner._cameraCV.frustum.clone(); - break; - case SceneMode.SCENE2D: - camera.frustum = transitioner._camera2D.frustum.clone(); - break; - } - } - function complete3DCallback() { return function(transitioner) { var scene = transitioner._scene; @@ -649,7 +615,6 @@ define([ scene.morphTime = SceneMode.getMorphTime(SceneMode.SCENE3D); destroyMorphHandler(transitioner); - updateFrustums(transitioner); if (transitioner._previousMode !== SceneMode.MORPHING || transitioner._morphCancelled) { transitioner._morphCancelled = false; From 62d3f44670290aa988bf14f2cf9791ef8e1b225f Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Wed, 3 Feb 2016 13:36:36 -0500 Subject: [PATCH 08/24] Update 2D to 3D. --- Source/Scene/SceneTransitioner.js | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index b27f8f5219b..895cd4a05db 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -243,10 +243,9 @@ define([ this._scene.morphStart.raiseEvent(this, this._previousMode, SceneMode.SCENE3D, true); scene._mode = SceneMode.MORPHING; - createMorphHandler(this, complete3DCallback); if (this._previousMode === SceneMode.SCENE2D) { - morphFrom2DTo3D(this, duration, ellipsoid, complete3DCallback); + morphFrom2DTo3D(this, duration, ellipsoid); } else { morphFromColumbusViewTo3D(this, duration, ellipsoid); } @@ -358,15 +357,24 @@ define([ addMorphTimeAnimations(transitioner, scene, 0.0, 1.0, duration, complete); } - function morphFrom2DTo3D(transitioner, duration, ellipsoid, complete) { + function morphFrom2DTo3D(transitioner, duration, ellipsoid) { duration *= 0.5; - var camera = transitioner._scene.camera; + var scene = transitioner._scene; + var camera = scene.camera; camera._setTransform(Matrix4.IDENTITY); - morphOrthographicToPerspective(transitioner, duration, ellipsoid, function() { - camera.frustum = transitioner._cameraCV.frustum.clone(); - morphFromColumbusViewTo3D(transitioner, duration, ellipsoid, complete); + var frustum = new PerspectiveFrustum(); + frustum.aspectRatio = scene.drawingBufferWidth / scene.drawingBufferHeight; + frustum.fov = CesiumMath.toRadians(60.0); + + var camera3D = { + frustum : frustum + }; + + morphOrthographicToPerspective(transitioner, duration, camera3D, function() { + camera.frustum = camera3D.frustum.clone(); + morphFromColumbusViewTo3D(transitioner, duration, ellipsoid); }); } From 9e56b1bda0f2a687cc5cb11ef4bf7976c0fbd981 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Wed, 3 Feb 2016 13:41:56 -0500 Subject: [PATCH 09/24] Remove precomputed camera position and orientation for each scene mode. --- Source/Scene/SceneTransitioner.js | 74 ------------------------------- 1 file changed, 74 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 895cd4a05db..1adba161bcb 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -46,80 +46,6 @@ define([ //>>includeEnd('debug'); this._scene = scene; - ellipsoid = defaultValue(ellipsoid, Ellipsoid.WGS84); - - // Position camera and size frustum so the entire 2D map is visible - var maxRadii = ellipsoid.maximumRadius; - var position = new Cartesian3(0.0, 0.0, 2.0 * maxRadii); - var direction = new Cartesian3(); - direction = Cartesian3.normalize(Cartesian3.negate(position, direction), direction); - var up = Cartesian3.clone(Cartesian3.UNIT_Y); - - var position2D = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, position, new Cartesian3()); - var direction2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, new Cartesian3()); - var up2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, up, new Cartesian3()); - - var frustum = new OrthographicFrustum(); - frustum.right = maxRadii * Math.PI; - frustum.left = -frustum.right; - frustum.top = frustum.right * (scene.drawingBufferHeight / scene.drawingBufferWidth); - frustum.bottom = -frustum.top; - - this._camera2D = { - position : position, - direction : direction, - up : up, - position2D : position2D, - direction2D : direction2D, - up2D : up2D, - frustum : frustum - }; - - position = new Cartesian3(0.0, -1.0, 1.0); - position = Cartesian3.multiplyByScalar(Cartesian3.normalize(position, position), 5.0 * maxRadii, position); - direction = new Cartesian3(); - direction = Cartesian3.normalize(Cartesian3.subtract(Cartesian3.ZERO, position, direction), direction); - var right = new Cartesian3(); - right = Cartesian3.normalize(Cartesian3.cross(direction, Cartesian3.UNIT_Z, right), right); - up = new Cartesian3(); - up = Cartesian3.normalize(Cartesian3.cross(right, direction, up), up); - - position2D = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, position, new Cartesian3()); - direction2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, new Cartesian3()); - var right2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, right, new Cartesian3()); - up2D = new Cartesian3(); - up2D = Cartesian3.normalize(Cartesian3.cross(right2D, direction2D, up2D), up2D); - - frustum = new PerspectiveFrustum(); - frustum.aspectRatio = scene.drawingBufferWidth / scene.drawingBufferHeight; - frustum.fov = CesiumMath.toRadians(60.0); - - this._cameraCV = { - position : position, - direction : direction, - up : up, - position2D : position2D, - direction2D : direction2D, - up2D : up2D, - frustum : frustum - }; - - position = new Cartesian3(); - position = Cartesian3.multiplyByScalar(Cartesian3.normalize(new Cartesian3(0.0, -2.0, 1.0), position), 2.0 * maxRadii, position); - direction = new Cartesian3(); - direction = Cartesian3.normalize(Cartesian3.subtract(Cartesian3.ZERO, position, direction), direction); - right = new Cartesian3(); - right = Cartesian3.normalize(Cartesian3.cross(direction, Cartesian3.UNIT_Z, right), right); - up = new Cartesian3(); - up = Cartesian3.normalize(Cartesian3.cross(right, direction, up), up); - - this._camera3D = { - position : position, - direction : direction, - up : up, - frustum : frustum - }; - this._currentTweens = []; this._morphHandler = undefined; this._morphCancelled = false; From 77d51cf61324decf6bf3096304cf7b2f4296feee Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Wed, 3 Feb 2016 14:27:36 -0500 Subject: [PATCH 10/24] Fix CV to 3D. --- Source/Scene/SceneTransitioner.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 1adba161bcb..221c5486c7e 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -256,6 +256,16 @@ define([ Matrix4.multiplyByPointAsVector(fromENU, endDir, endDir); Matrix4.multiplyByPointAsVector(fromENU, endUp, endUp); + var camera3D = { + position : Cartesian3.clone(endPos), + direction : Cartesian3.clone(endDir), + up : Cartesian3.clone(endUp) + }; + + Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, endPos, endPos); + Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE, endDir, endDir); + Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE, endUp, endUp); + function update(value) { camera.position = columbusViewMorph(startPos, endPos, value.time); camera.direction = columbusViewMorph(startDir, endDir, value.time); @@ -277,7 +287,7 @@ define([ }); transitioner._currentTweens.push(tween); - var complete = complete3DCallback(); + var complete = complete3DCallback(camera3D); createMorphHandler(transitioner, complete); addMorphTimeAnimations(transitioner, scene, 0.0, 1.0, duration, complete); @@ -444,10 +454,12 @@ define([ var scene = transitioner._scene; var camera = scene.camera; + var height = camera.frustum.right - camera.frustum.left; + camera.frustum = cameraCV.frustum.clone(); var endFOV = camera.frustum.fov; var startFOV = CesiumMath.RADIANS_PER_DEGREE * 0.5; - var d = camera.position.z * Math.tan(endFOV * 0.5); + var d = height * Math.tan(endFOV * 0.5); camera.frustum.far = d / Math.tan(startFOV * 0.5) + 10000000.0; function update(value) { @@ -542,7 +554,7 @@ define([ transitioner._currentTweens.push(tween); } - function complete3DCallback() { + function complete3DCallback(camera3D) { return function(transitioner) { var scene = transitioner._scene; scene._mode = SceneMode.SCENE3D; @@ -553,14 +565,12 @@ define([ if (transitioner._previousMode !== SceneMode.MORPHING || transitioner._morphCancelled) { transitioner._morphCancelled = false; - /* var camera = scene.camera; camera.position = Cartesian3.clone(camera3D.position); camera.direction = Cartesian3.clone(camera3D.direction); camera.up = Cartesian3.clone(camera3D.up); camera.right = Cartesian3.cross(camera.direction, camera.up, camera.right); Cartesian3.normalize(camera.right, camera.right); - */ } var wasMorphing = defined(transitioner._completeMorph); From 6b17b77b6ffd6b6488975dab24bca4bf5f32939e Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Wed, 3 Feb 2016 15:29:01 -0500 Subject: [PATCH 11/24] Fix 2D to 3D. --- Source/Scene/SceneTransitioner.js | 61 +++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 221c5486c7e..031ce1dd846 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -308,10 +308,62 @@ define([ frustum : frustum }; - morphOrthographicToPerspective(transitioner, duration, camera3D, function() { - camera.frustum = camera3D.frustum.clone(); - morphFromColumbusViewTo3D(transitioner, duration, ellipsoid); - }); + function columbusViewTo3D() { + var startPos = Cartesian3.clone(camera.position); + var startDir = Cartesian3.clone(camera.direction); + var startUp = Cartesian3.clone(camera.up); + + var positionCarto = scene.mapProjection.unproject(camera.position); + var position = ellipsoid.cartographicToCartesian(positionCarto); + var surfacePoint = ellipsoid.scaleToGeodeticSurface(position); + + var fromENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid); + + var endPos = Cartesian3.clone(position); + var endDir = Cartesian3.clone(startDir); + var endUp = Cartesian3.clone(startUp); + + Matrix4.multiplyByPointAsVector(fromENU, endDir, endDir); + Matrix4.multiplyByPointAsVector(fromENU, endUp, endUp); + + var camera3D = { + position : Cartesian3.clone(endPos), + direction : Cartesian3.clone(endDir), + up : Cartesian3.clone(endUp) + }; + + Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, endPos, endPos); + Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE, endDir, endDir); + Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE, endUp, endUp); + + function update(value) { + camera.position = columbusViewMorph(startPos, endPos, value.time); + camera.direction = columbusViewMorph(startDir, endDir, value.time); + camera.up = columbusViewMorph(startUp, endUp, value.time); + camera.right = Cartesian3.cross(camera.direction, camera.up, camera.right); + Cartesian3.normalize(camera.right, camera.right); + } + + var tween = scene.tweens.add({ + duration : duration, + easingFunction : EasingFunction.QUARTIC_OUT, + startObject : { + time : 0.0 + }, + stopObject : { + time : 1.0 + }, + update : update + }); + transitioner._currentTweens.push(tween); + + var complete = complete3DCallback(camera3D); + createMorphHandler(transitioner, complete); + + addMorphTimeAnimations(transitioner, scene, 0.0, 1.0, duration, complete); + } + + morphOrthographicToPerspective(transitioner, duration, camera3D, columbusViewTo3D); } function columbusViewMorph(startPosition, endPosition, time) { @@ -461,6 +513,7 @@ define([ var startFOV = CesiumMath.RADIANS_PER_DEGREE * 0.5; var d = height * Math.tan(endFOV * 0.5); camera.frustum.far = d / Math.tan(startFOV * 0.5) + 10000000.0; + camera.frustum.fov = startFOV; function update(value) { camera.frustum.fov = CesiumMath.lerp(startFOV, endFOV, value.time); From ae6cde6fee4bd6c15ac34c4824a45c26ebf55a76 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Wed, 3 Feb 2016 15:34:29 -0500 Subject: [PATCH 12/24] Better fix for 2D to 3D (Remove duplicate code). --- Source/Scene/SceneTransitioner.js | 71 +++---------------------------- 1 file changed, 6 insertions(+), 65 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 031ce1dd846..9cc92a52bad 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -72,6 +72,7 @@ define([ this._scene.morphStart.raiseEvent(this, this._previousMode, SceneMode.SCENE2D, true); scene._mode = SceneMode.MORPHING; + scene.camera._setTransform(Matrix4.IDENTITY); if (this._previousMode === SceneMode.COLUMBUS_VIEW) { morphFromColumbusViewTo2D(this, duration); @@ -98,6 +99,7 @@ define([ this._scene.morphStart.raiseEvent(this, this._previousMode, SceneMode.COLUMBUS_VIEW, true); scene._mode = SceneMode.MORPHING; + scene.camera._setTransform(Matrix4.IDENTITY); var camera = scene.camera; var position; @@ -169,6 +171,7 @@ define([ this._scene.morphStart.raiseEvent(this, this._previousMode, SceneMode.SCENE3D, true); scene._mode = SceneMode.MORPHING; + scene.camera._setTransform(Matrix4.IDENTITY); if (this._previousMode === SceneMode.SCENE2D) { morphFrom2DTo3D(this, duration, ellipsoid); @@ -235,9 +238,7 @@ define([ function morphFromColumbusViewTo3D(transitioner, duration, ellipsoid) { var scene = transitioner._scene; - var camera = scene.camera; - camera._setTransform(Matrix4.IDENTITY); var startPos = Cartesian3.clone(camera.position); var startDir = Cartesian3.clone(camera.direction); @@ -297,9 +298,6 @@ define([ duration *= 0.5; var scene = transitioner._scene; - var camera = scene.camera; - camera._setTransform(Matrix4.IDENTITY); - var frustum = new PerspectiveFrustum(); frustum.aspectRatio = scene.drawingBufferWidth / scene.drawingBufferHeight; frustum.fov = CesiumMath.toRadians(60.0); @@ -308,62 +306,9 @@ define([ frustum : frustum }; - function columbusViewTo3D() { - var startPos = Cartesian3.clone(camera.position); - var startDir = Cartesian3.clone(camera.direction); - var startUp = Cartesian3.clone(camera.up); - - var positionCarto = scene.mapProjection.unproject(camera.position); - var position = ellipsoid.cartographicToCartesian(positionCarto); - var surfacePoint = ellipsoid.scaleToGeodeticSurface(position); - - var fromENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid); - - var endPos = Cartesian3.clone(position); - var endDir = Cartesian3.clone(startDir); - var endUp = Cartesian3.clone(startUp); - - Matrix4.multiplyByPointAsVector(fromENU, endDir, endDir); - Matrix4.multiplyByPointAsVector(fromENU, endUp, endUp); - - var camera3D = { - position : Cartesian3.clone(endPos), - direction : Cartesian3.clone(endDir), - up : Cartesian3.clone(endUp) - }; - - Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, endPos, endPos); - Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE, endDir, endDir); - Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE, endUp, endUp); - - function update(value) { - camera.position = columbusViewMorph(startPos, endPos, value.time); - camera.direction = columbusViewMorph(startDir, endDir, value.time); - camera.up = columbusViewMorph(startUp, endUp, value.time); - camera.right = Cartesian3.cross(camera.direction, camera.up, camera.right); - Cartesian3.normalize(camera.right, camera.right); - } - - var tween = scene.tweens.add({ - duration : duration, - easingFunction : EasingFunction.QUARTIC_OUT, - startObject : { - time : 0.0 - }, - stopObject : { - time : 1.0 - }, - update : update - }); - transitioner._currentTweens.push(tween); - - var complete = complete3DCallback(camera3D); - createMorphHandler(transitioner, complete); - - addMorphTimeAnimations(transitioner, scene, 0.0, 1.0, duration, complete); - } - - morphOrthographicToPerspective(transitioner, duration, camera3D, columbusViewTo3D); + morphOrthographicToPerspective(transitioner, duration, camera3D, function() { + morphFromColumbusViewTo3D(transitioner, duration, ellipsoid); + }); } function columbusViewMorph(startPosition, endPosition, time) { @@ -537,16 +482,12 @@ define([ } function morphFrom2DToColumbusView(transitioner, duration, cameraCV, complete) { - var scene = transitioner._scene; - var camera = scene.camera; - camera._setTransform(Matrix4.IDENTITY); morphOrthographicToPerspective(transitioner, duration, cameraCV, complete); } function morphFrom3DToColumbusView(transitioner, duration, endCamera, complete) { var scene = transitioner._scene; var camera = scene.camera; - camera._setTransform(Matrix4.IDENTITY); var startPos = Cartesian3.clone(camera.position); var startDir = Cartesian3.clone(camera.direction); From 9d63107ce0b59fb2cea1e7976f50c7343f0f424a Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Wed, 3 Feb 2016 16:15:46 -0500 Subject: [PATCH 13/24] Fix picking and billboard collection tests. --- Specs/Scene/BillboardCollectionSpec.js | 6 +++ Specs/Scene/PickSpec.js | 55 ++++++-------------------- 2 files changed, 18 insertions(+), 43 deletions(-) diff --git a/Specs/Scene/BillboardCollectionSpec.js b/Specs/Scene/BillboardCollectionSpec.js index 49e4f2ea5f6..39a45ef2131 100644 --- a/Specs/Scene/BillboardCollectionSpec.js +++ b/Specs/Scene/BillboardCollectionSpec.js @@ -11,6 +11,7 @@ defineSuite([ 'Core/loadImage', 'Core/Math', 'Core/NearFarScalar', + 'Core/Rectangle', 'Renderer/ContextLimits', 'Scene/HeightReference', 'Scene/HorizontalOrigin', @@ -32,6 +33,7 @@ defineSuite([ loadImage, CesiumMath, NearFarScalar, + Rectangle, ContextLimits, HeightReference, HorizontalOrigin, @@ -1196,6 +1198,10 @@ defineSuite([ orthoFrustum.near = 0.01 * maxRadii; orthoFrustum.far = 60.0 * maxRadii; + camera.setView({ + destination : Rectangle.fromDegrees(-60.0, -60.0, -40.0, 60.0) + }); + // Update scene state scene.morphTo2D(0); scene.renderForSpecs(); diff --git a/Specs/Scene/PickSpec.js b/Specs/Scene/PickSpec.js index c16e6892072..8f5b202b9ee 100644 --- a/Specs/Scene/PickSpec.js +++ b/Specs/Scene/PickSpec.js @@ -38,6 +38,7 @@ defineSuite([ var scene; var primitives; var camera; + var primitiveRectangle = Rectangle.fromDegrees(-50.0, -50.0, 50.0, 50.0); beforeAll(function() { scene = createScene(); @@ -76,7 +77,7 @@ defineSuite([ var e = new Primitive({ geometryInstances: new GeometryInstance({ geometry: new RectangleGeometry({ - rectangle: Rectangle.fromDegrees(-50.0, -50.0, 50.0, 50.0), + rectangle: primitiveRectangle, vertexFormat: EllipsoidSurfaceAppearance.VERTEX_FORMAT, ellipsoid: ellipsoid, granularity: CesiumMath.toRadians(20.0) @@ -320,58 +321,26 @@ defineSuite([ }); it('picks in 2D', function() { - var ellipsoid = scene.mapProjection.ellipsoid; - var maxRadii = ellipsoid.maximumRadius; - - camera.position = new Cartesian3(0.0, 0.0, 2.0 * maxRadii); - Cartesian3.clone(Cartesian3.UNIT_Z, camera.direction); - Cartesian3.negate(camera.direction, camera.direction); - Cartesian3.negate(Cartesian3.UNIT_X, camera.up); - Cartesian3.clone(Cartesian3.UNIT_Y, camera.right); - - var frustum = new OrthographicFrustum(); - frustum.right = maxRadii * Math.PI; - frustum.left = -frustum.right; - frustum.top = frustum.right * (scene.drawingBufferHeight / scene.drawingBufferWidth); - frustum.bottom = -frustum.top; - frustum.near = 0.01 * maxRadii; - frustum.far = 60.0 * maxRadii; - camera.frustum = frustum; - - scene.mode = SceneMode.SCENE2D; - scene.morphTime = SceneMode.getMorphTime(scene.mode); - + camera.setView({ + destination : primitiveRectangle + }); + scene.morphTo2D(0.0); var rectangle = createRectangle(); scene.initializeFrame(); var pickedObject = scene.pick(new Cartesian2(0, 0)); expect(pickedObject.primitive).toEqual(rectangle); + scene.morphTo3D(0.0); }); it('picks in 2D when rotated', function() { - var ellipsoid = scene.mapProjection.ellipsoid; - var maxRadii = ellipsoid.maximumRadius; - - camera.position = new Cartesian3(0.0, 0.0, 2.0 * maxRadii); - Cartesian3.clone(Cartesian3.UNIT_Z, camera.direction); - Cartesian3.negate(camera.direction, camera.direction); - Cartesian3.negate(Cartesian3.UNIT_X, camera.up); - Cartesian3.clone(Cartesian3.UNIT_Y, camera.right); - - var frustum = new OrthographicFrustum(); - frustum.right = maxRadii * Math.PI; - frustum.left = -frustum.right; - frustum.top = frustum.right * (scene.drawingBufferHeight / scene.drawingBufferWidth); - frustum.bottom = -frustum.top; - frustum.near = 0.01 * maxRadii; - frustum.far = 60.0 * maxRadii; - camera.frustum = frustum; - - scene.mode = SceneMode.SCENE2D; - scene.morphTime = SceneMode.getMorphTime(scene.mode); - + camera.setView({ + destination : primitiveRectangle + }); + scene.morphTo2D(0.0); var rectangle = createRectangle(); scene.initializeFrame(); var pickedObject = scene.pick(new Cartesian2(0.0, 0.0)); expect(pickedObject.primitive).toEqual(rectangle); + scene.morphTo3D(0.0); }); }, 'WebGL'); From 549b60f754937763fba0acfd9efe026128dcc312 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Thu, 4 Feb 2016 11:20:39 -0500 Subject: [PATCH 14/24] Fix LabelCollection, PointPrimitiveCollection, and SceneTransforms tests. --- Specs/Scene/LabelCollectionSpec.js | 16 +++++----------- Specs/Scene/PointPrimitiveCollectionSpec.js | 16 +++++----------- Specs/Scene/SceneTransformsSpec.js | 6 ++++++ 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/Specs/Scene/LabelCollectionSpec.js b/Specs/Scene/LabelCollectionSpec.js index f47fb93e572..d2cf1959e4b 100644 --- a/Specs/Scene/LabelCollectionSpec.js +++ b/Specs/Scene/LabelCollectionSpec.js @@ -9,6 +9,7 @@ defineSuite([ 'Core/Ellipsoid', 'Core/Math', 'Core/NearFarScalar', + 'Core/Rectangle', 'Renderer/ContextLimits', 'Scene/HeightReference', 'Scene/HorizontalOrigin', @@ -26,6 +27,7 @@ defineSuite([ Ellipsoid, CesiumMath, NearFarScalar, + Rectangle, ContextLimits, HeightReference, HorizontalOrigin, @@ -1447,21 +1449,13 @@ defineSuite([ text : 'two' }); - var maxRadii = ellipsoid.maximumRadius; - var orthoFrustum = new OrthographicFrustum(); - orthoFrustum.right = maxRadii * Math.PI; - orthoFrustum.left = -orthoFrustum.right; - orthoFrustum.top = orthoFrustum.right; - orthoFrustum.bottom = -orthoFrustum.top; - orthoFrustum.near = 0.01 * maxRadii; - orthoFrustum.far = 60.0 * maxRadii; + camera.setView({ + destination : Rectangle.fromDegrees(-60.0, -60.0, -40.0, 60.0) + }); - // Update scene state scene.morphTo2D(0); scene.renderForSpecs(); - camera.frustum = orthoFrustum; - scene.renderForSpecs(); var actual = scene.frameState.commandList[0].boundingVolume; diff --git a/Specs/Scene/PointPrimitiveCollectionSpec.js b/Specs/Scene/PointPrimitiveCollectionSpec.js index c1a7770a55c..246d8f6a16e 100644 --- a/Specs/Scene/PointPrimitiveCollectionSpec.js +++ b/Specs/Scene/PointPrimitiveCollectionSpec.js @@ -7,6 +7,7 @@ defineSuite([ 'Core/Color', 'Core/Math', 'Core/NearFarScalar', + 'Core/Rectangle', 'Scene/OrthographicFrustum', 'Specs/createScene' ], function( @@ -17,6 +18,7 @@ defineSuite([ Color, CesiumMath, NearFarScalar, + Rectangle, OrthographicFrustum, createScene) { "use strict"; @@ -781,21 +783,13 @@ defineSuite([ position : Cartesian3.fromDegrees(-50.0, 50.0) }); - var maxRadii = ellipsoid.maximumRadius; - var orthoFrustum = new OrthographicFrustum(); - orthoFrustum.right = maxRadii * Math.PI; - orthoFrustum.left = -orthoFrustum.right; - orthoFrustum.top = orthoFrustum.right; - orthoFrustum.bottom = -orthoFrustum.top; - orthoFrustum.near = 0.01 * maxRadii; - orthoFrustum.far = 60.0 * maxRadii; + camera.setView({ + destination : Rectangle.fromDegrees(-60.0, -60.0, -40.0, 60.0) + }); - // Update scene state scene.morphTo2D(0); scene.renderForSpecs(); - camera.frustum = orthoFrustum; - scene.renderForSpecs(); var actual = scene.frameState.commandList[0].boundingVolume; diff --git a/Specs/Scene/SceneTransformsSpec.js b/Specs/Scene/SceneTransformsSpec.js index cf796020533..888f32d64bf 100644 --- a/Specs/Scene/SceneTransformsSpec.js +++ b/Specs/Scene/SceneTransformsSpec.js @@ -5,6 +5,7 @@ defineSuite([ 'Core/Cartesian3', 'Core/Ellipsoid', 'Core/Math', + 'Core/Rectangle', 'Scene/Camera', 'Specs/createScene' ], function( @@ -13,6 +14,7 @@ defineSuite([ Cartesian3, Ellipsoid, CesiumMath, + Rectangle, Camera, createScene) { "use strict"; @@ -158,6 +160,10 @@ defineSuite([ }); it('returns correct window position in 2D', function() { + scene.camera.setView({ + destination : Rectangle.fromDegrees(-0.000001, -0.000001, 0.000001, 0.000001) + }); + // Update scene state scene.morphTo2D(0); scene.initializeFrame(); From 988c32e06677260a5d5d4f33b6094d2b232b2e96 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Thu, 4 Feb 2016 12:05:25 -0500 Subject: [PATCH 15/24] Fix issue where morphing from 2D to 3D could not be cancelled. Fixes remaining tests. --- Source/Scene/SceneTransitioner.js | 52 ++++++++++++++++++------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 9cc92a52bad..6e5a34265bd 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -176,7 +176,11 @@ define([ if (this._previousMode === SceneMode.SCENE2D) { morphFrom2DTo3D(this, duration, ellipsoid); } else { - morphFromColumbusViewTo3D(this, duration, ellipsoid); + var camera3D = getColumbusViewTo3DCamera(this, ellipsoid); + var complete = complete3DCallback(camera3D); + createMorphHandler(this, complete); + + morphFromColumbusViewTo3D(this, duration, camera3D, complete); } if (duration === 0.0 && defined(this._completeMorph)) { @@ -236,14 +240,10 @@ define([ transitioner._morphHandler = transitioner._morphHandler && transitioner._morphHandler.destroy(); } - function morphFromColumbusViewTo3D(transitioner, duration, ellipsoid) { + function getColumbusViewTo3DCamera(transitioner, ellipsoid) { var scene = transitioner._scene; var camera = scene.camera; - var startPos = Cartesian3.clone(camera.position); - var startDir = Cartesian3.clone(camera.direction); - var startUp = Cartesian3.clone(camera.up); - var positionCarto = scene.mapProjection.unproject(camera.position); var position = ellipsoid.cartographicToCartesian(positionCarto); var surfacePoint = ellipsoid.scaleToGeodeticSurface(position); @@ -251,21 +251,30 @@ define([ var fromENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid); var endPos = Cartesian3.clone(position); - var endDir = Cartesian3.clone(startDir); - var endUp = Cartesian3.clone(startUp); + var endDir = Cartesian3.clone(camera.direction); + var endUp = Cartesian3.clone(camera.up); Matrix4.multiplyByPointAsVector(fromENU, endDir, endDir); Matrix4.multiplyByPointAsVector(fromENU, endUp, endUp); - var camera3D = { - position : Cartesian3.clone(endPos), - direction : Cartesian3.clone(endDir), - up : Cartesian3.clone(endUp) + return { + position : endPos, + direction : endDir, + up : endUp }; + } + + function morphFromColumbusViewTo3D(transitioner, duration, endCamera, complete) { + var scene = transitioner._scene; + var camera = scene.camera; + + var startPos = Cartesian3.clone(camera.position); + var startDir = Cartesian3.clone(camera.direction); + var startUp = Cartesian3.clone(camera.up); - Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, endPos, endPos); - Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE, endDir, endDir); - Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE, endUp, endUp); + var endPos = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, endCamera.position, new Cartesian3()); + var endDir = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE, endCamera.direction, new Cartesian3()); + var endUp = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE, endCamera.up, new Cartesian3()); function update(value) { camera.position = columbusViewMorph(startPos, endPos, value.time); @@ -288,9 +297,6 @@ define([ }); transitioner._currentTweens.push(tween); - var complete = complete3DCallback(camera3D); - createMorphHandler(transitioner, complete); - addMorphTimeAnimations(transitioner, scene, 0.0, 1.0, duration, complete); } @@ -302,12 +308,14 @@ define([ frustum.aspectRatio = scene.drawingBufferWidth / scene.drawingBufferHeight; frustum.fov = CesiumMath.toRadians(60.0); - var camera3D = { - frustum : frustum - }; + var camera3D = getColumbusViewTo3DCamera(transitioner, ellipsoid); + camera3D.frustum = frustum; + + var complete = complete3DCallback(camera3D); + createMorphHandler(transitioner, complete); morphOrthographicToPerspective(transitioner, duration, camera3D, function() { - morphFromColumbusViewTo3D(transitioner, duration, ellipsoid); + morphFromColumbusViewTo3D(transitioner, duration, camera3D, complete); }); } From a6c761b52121ab5e922c471394629f7cb228a809 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Thu, 4 Feb 2016 14:20:30 -0500 Subject: [PATCH 16/24] Reduce amount of garbage generated from morphs. --- Source/Scene/SceneTransitioner.js | 272 ++++++++++++++++++------------ 1 file changed, 160 insertions(+), 112 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 6e5a34265bd..95eb1c32d98 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -1,6 +1,7 @@ /*global define*/ define([ '../Core/Cartesian3', + '../Core/Cartographic', '../Core/defaultValue', '../Core/defined', '../Core/destroyObject', @@ -18,6 +19,7 @@ define([ './SceneMode' ], function( Cartesian3, + Cartographic, defaultValue, defined, destroyObject, @@ -85,6 +87,26 @@ define([ } }; + var scratchToCVPosition = new Cartesian3(); + var scratchToCVDirection = new Cartesian3(); + var scratchToCVUp = new Cartesian3(); + var scratchToCVPosition2D = new Cartesian3(); + var scratchToCVDirection2D = new Cartesian3(); + var scratchToCVUp2D = new Cartesian3(); + var scratchToCVSurfacePosition = new Cartesian3(); + var scratchToCVCartographic = new Cartographic(); + var scratchToCVToENU = new Matrix4(); + var scratchToCVFrustum = new PerspectiveFrustum(); + var scratchToCVCamera = { + position : undefined, + direction : undefined, + up : undefined, + position2D : undefined, + direction2D : undefined, + up2D : undefined, + frustum : undefined + }; + SceneTransitioner.prototype.morphToColumbusView = function(duration, ellipsoid) { if (defined(this._completeMorph)) { this._completeMorph(); @@ -102,38 +124,37 @@ define([ scene.camera._setTransform(Matrix4.IDENTITY); var camera = scene.camera; - var position; - var direction; - var up; + var position = scratchToCVPosition; + var direction = scratchToCVDirection; + var up = scratchToCVUp; if (this._previousMode === SceneMode.SCENE2D) { - position = Cartesian3.clone(camera.position); - direction = Cartesian3.negate(Cartesian3.UNIT_Z, new Cartesian3()); - up = Cartesian3.clone(Cartesian3.UNIT_Y); + Cartesian3.clone(camera.position, position); + Cartesian3.negate(Cartesian3.UNIT_Z, direction); + Cartesian3.clone(Cartesian3.UNIT_Y, up); } else { - position = camera.positionWC; - direction = camera.directionWC; - up = camera.upWC; + Cartesian3.clone(camera.positionWC, position); + Cartesian3.clone(camera.directionWC, direction); + Cartesian3.clone(camera.upWC, up); - var surfacePoint = ellipsoid.scaleToGeodeticSurface(position); - var fromENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid); - var toENU = Matrix4.inverseTransformation(fromENU, new Matrix4()); + var surfacePoint = ellipsoid.scaleToGeodeticSurface(position, scratchToCVSurfacePosition); + var toENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid, scratchToCVToENU); + Matrix4.inverseTransformation(toENU, toENU); - position = scene.mapProjection.project(ellipsoid.cartesianToCartographic(position)); - direction = Matrix4.multiplyByPointAsVector(toENU, direction, new Cartesian3()); - up = Matrix4.multiplyByPointAsVector(toENU, up, new Cartesian3()); + scene.mapProjection.project(ellipsoid.cartesianToCartographic(position, scratchToCVCartographic), position); + Matrix4.multiplyByPointAsVector(toENU, direction, direction); + Matrix4.multiplyByPointAsVector(toENU, up, up); } - var frustum = new PerspectiveFrustum(); + var frustum = scratchToCVFrustum; frustum.aspectRatio = scene.drawingBufferWidth / scene.drawingBufferHeight; frustum.fov = CesiumMath.toRadians(60.0); - var cameraCV = { - position : position, - direction : direction, - up : up, - frustum : frustum - }; + var cameraCV = scratchToCVCamera; + cameraCV.position = position; + cameraCV.direction = direction; + cameraCV.up = up; + cameraCV.frustum = frustum; var complete = completeColumbusViewCallback(cameraCV); createMorphHandler(this, complete); @@ -141,14 +162,9 @@ define([ if (this._previousMode === SceneMode.SCENE2D) { morphFrom2DToColumbusView(this, duration, cameraCV, complete); } else { - var position2D = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, position, new Cartesian3()); - var direction2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, new Cartesian3()); - var up2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, up, new Cartesian3()); - - cameraCV.position2D = position2D; - cameraCV.direction2D = direction2D; - cameraCV.up2D = up2D; - + cameraCV.position2D = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, position, scratchToCVPosition2D); + cameraCV.direction2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, scratchToCVDirection2D); + cameraCV.up2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, up, scratchToCVUp2D); morphFrom3DToColumbusView(this, duration, cameraCV, complete); } @@ -240,47 +256,61 @@ define([ transitioner._morphHandler = transitioner._morphHandler && transitioner._morphHandler.destroy(); } + var scratchCVTo3DCartographic = new Cartographic(); + var scratchCVTo3DSurfacePoint = new Cartesian3(); + var scratchCVTo3DFromENU = new Matrix4(); + var scratchCVTo3DCamera = { + position : new Cartesian3(), + direction : new Cartesian3(), + up : new Cartesian3(), + frustum : undefined + }; + function getColumbusViewTo3DCamera(transitioner, ellipsoid) { var scene = transitioner._scene; var camera = scene.camera; - var positionCarto = scene.mapProjection.unproject(camera.position); - var position = ellipsoid.cartographicToCartesian(positionCarto); - var surfacePoint = ellipsoid.scaleToGeodeticSurface(position); + var camera3D = scratchCVTo3DCamera; + var position = camera3D.position; + var direction = camera3D.direction; + var up = camera3D.up; - var fromENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid); + var positionCarto = scene.mapProjection.unproject(camera.position, scratchCVTo3DCartographic); + ellipsoid.cartographicToCartesian(positionCarto, position); + var surfacePoint = ellipsoid.scaleToGeodeticSurface(position, scratchCVTo3DSurfacePoint); - var endPos = Cartesian3.clone(position); - var endDir = Cartesian3.clone(camera.direction); - var endUp = Cartesian3.clone(camera.up); + var fromENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid, scratchCVTo3DFromENU); - Matrix4.multiplyByPointAsVector(fromENU, endDir, endDir); - Matrix4.multiplyByPointAsVector(fromENU, endUp, endUp); + Matrix4.multiplyByPointAsVector(fromENU, camera.direction, direction); + Matrix4.multiplyByPointAsVector(fromENU, camera.up, up); - return { - position : endPos, - direction : endDir, - up : endUp - }; + return camera3D; } + var scratchCVTo3DStartPos = new Cartesian3(); + var scratchCVTo3DStartDir = new Cartesian3(); + var scratchCVTo3DStartUp = new Cartesian3(); + var scratchCVTo3DEndPos = new Cartesian3(); + var scratchCVTo3DEndDir = new Cartesian3(); + var scratchCVTo3DEndUp = new Cartesian3(); + function morphFromColumbusViewTo3D(transitioner, duration, endCamera, complete) { var scene = transitioner._scene; var camera = scene.camera; - var startPos = Cartesian3.clone(camera.position); - var startDir = Cartesian3.clone(camera.direction); - var startUp = Cartesian3.clone(camera.up); + var startPos = Cartesian3.clone(camera.position, scratchCVTo3DStartPos); + var startDir = Cartesian3.clone(camera.direction, scratchCVTo3DStartDir); + var startUp = Cartesian3.clone(camera.up, scratchCVTo3DStartUp); - var endPos = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, endCamera.position, new Cartesian3()); - var endDir = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE, endCamera.direction, new Cartesian3()); - var endUp = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE, endCamera.up, new Cartesian3()); + var endPos = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, endCamera.position, scratchCVTo3DEndPos); + var endDir = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE, endCamera.direction, scratchCVTo3DEndDir); + var endUp = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE, endCamera.up, scratchCVTo3DEndUp); function update(value) { - camera.position = columbusViewMorph(startPos, endPos, value.time); - camera.direction = columbusViewMorph(startDir, endDir, value.time); - camera.up = columbusViewMorph(startUp, endUp, value.time); - camera.right = Cartesian3.cross(camera.direction, camera.up, camera.right); + columbusViewMorph(startPos, endPos, value.time, camera.position); + columbusViewMorph(startDir, endDir, value.time, camera.direction); + columbusViewMorph(startUp, endUp, value.time, camera.up); + Cartesian3.cross(camera.direction, camera.up, camera.right); Cartesian3.normalize(camera.right, camera.right); } @@ -300,11 +330,13 @@ define([ addMorphTimeAnimations(transitioner, scene, 0.0, 1.0, duration, complete); } + var scratch2DTo3DFrustum = new PerspectiveFrustum(); + function morphFrom2DTo3D(transitioner, duration, ellipsoid) { duration *= 0.5; var scene = transitioner._scene; - var frustum = new PerspectiveFrustum(); + var frustum = scratch2DTo3DFrustum; frustum.aspectRatio = scene.drawingBufferWidth / scene.drawingBufferHeight; frustum.fov = CesiumMath.toRadians(60.0); @@ -319,9 +351,9 @@ define([ }); } - function columbusViewMorph(startPosition, endPosition, time) { + function columbusViewMorph(startPosition, endPosition, time, result) { // Just linear for now. - return Cartesian3.lerp(startPosition, endPosition, time, new Cartesian3()); + return Cartesian3.lerp(startPosition, endPosition, time, result); } function morphPerspectiveToOrthographic(transitioner, duration, endCamera, updateHeight, complete) { @@ -356,38 +388,51 @@ define([ transitioner._currentTweens.push(tween); } + var scratchCVTo2DStartPos = new Cartesian3(); + var scratchCVTo2DStartDir = new Cartesian3(); + var scratchCVTo2DStartUp = new Cartesian3(); + var scratchCVTo2DEndDir = new Cartesian3(); + var scratchCVTo2DEndUp = new Cartesian3(); + var scratchCVTo2DFrustum = new OrthographicFrustum(); + var scratchCVTo2DCamera = { + position : undefined, + direction : undefined, + up : undefined, + frustum : undefined + }; + function morphFromColumbusViewTo2D(transitioner, duration) { duration *= 0.5; var scene = transitioner._scene; var camera = scene.camera; - var position = Cartesian3.clone(camera.position); - var startDir = Cartesian3.clone(camera.direction); - var startUp = Cartesian3.clone(camera.up); + var position = Cartesian3.clone(camera.position, scratchCVTo2DStartPos); + var startDir = Cartesian3.clone(camera.direction, scratchCVTo2DStartDir); + var startUp = Cartesian3.clone(camera.up, scratchCVTo2DStartUp); - var endDir = Cartesian3.negate(Cartesian3.UNIT_Z, new Cartesian3()); - var endUp = Cartesian3.clone(Cartesian3.UNIT_Y); + var endDir = Cartesian3.negate(Cartesian3.UNIT_Z, scratchCVTo2DEndDir); + var endUp = Cartesian3.clone(Cartesian3.UNIT_Y, scratchCVTo2DEndUp); - var frustum = new OrthographicFrustum(); + var frustum = scratchCVTo2DFrustum; frustum.right = position.z * 0.5; frustum.left = -frustum.right; frustum.top = frustum.right * (scene.drawingBufferHeight / scene.drawingBufferWidth); frustum.bottom = -frustum.top; - var camera2D = { - position : position, - direction : endDir, - up : endUp, - frustum : frustum - }; + var camera2D = scratchCVTo2DCamera; + camera2D.position = position; + camera2D.direction = endDir; + camera2D.up = endUp; + camera2D.frustum = frustum; + var complete = complete2DCallback(camera2D); createMorphHandler(transitioner, complete); function updateCV(value) { - camera.direction = columbusViewMorph(startDir, endDir, value.time); - camera.up = columbusViewMorph(startUp, endUp, value.time); - camera.right = Cartesian3.cross(camera.direction, camera.up, camera.right); + columbusViewMorph(startDir, endDir, value.time, camera.direction); + columbusViewMorph(startUp, endUp, value.time, camera.up); + Cartesian3.cross(camera.direction, camera.up, camera.right); Cartesian3.normalize(camera.right, camera.right); } @@ -412,35 +457,38 @@ define([ transitioner._currentTweens.push(tween); } + var scratch3DTo2DCartographic = new Cartographic(); + var scratch3DTo2DCamera = { + position : new Cartesian3(), + direction : new Cartesian3(), + up : new Cartesian3(), + position2D : new Cartesian3(), + direction2D : new Cartesian3(), + up2D : new Cartesian3(), + frustum : new OrthographicFrustum() + }; + function morphFrom3DTo2D(transitioner, duration, ellipsoid) { duration *= 0.5; var scene = transitioner._scene; + var camera2D = scratch3DTo2DCamera; - var position = scene.mapProjection.project(ellipsoid.cartesianToCartographic(scene.camera.positionWC)); + ellipsoid.cartesianToCartographic(scene.camera.positionWC, scratch3DTo2DCartographic); + var position = scene.mapProjection.project(scratch3DTo2DCartographic, camera2D.position); - var frustum = new OrthographicFrustum(); + var frustum = camera2D.frustum; frustum.right = position.z * 0.5; frustum.left = -frustum.right; frustum.top = frustum.right * (scene.drawingBufferHeight / scene.drawingBufferWidth); frustum.bottom = -frustum.top; - var direction = Cartesian3.negate(Cartesian3.UNIT_Z, new Cartesian3()); - var up = Cartesian3.clone(Cartesian3.UNIT_Y); - - var position2D = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, position, new Cartesian3()); - var direction2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, new Cartesian3()); - var up2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, up, new Cartesian3()); - - var camera2D = { - position : position, - direction : direction, - up : up, - position2D : position2D, - direction2D : direction2D, - up2D : up2D, - frustum : frustum - }; + var direction = Cartesian3.negate(Cartesian3.UNIT_Z, camera2D.direction); + var up = Cartesian3.clone(Cartesian3.UNIT_Y, camera2D.up); + + Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, position, camera2D.position2D); + Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, camera2D.direction2D); + Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, up, camera2D.up2D); function updateHeight(camera, height) { camera.position.x = height; @@ -493,23 +541,30 @@ define([ morphOrthographicToPerspective(transitioner, duration, cameraCV, complete); } + var scratch3DToCVStartPos = new Cartesian3(); + var scratch3DToCVStartDir = new Cartesian3(); + var scratch3DToCVStartUp = new Cartesian3(); + var scratch3DToCVEndPos = new Cartesian3(); + var scratch3DToCVEndDir = new Cartesian3(); + var scratch3DToCVEndUp = new Cartesian3(); + function morphFrom3DToColumbusView(transitioner, duration, endCamera, complete) { var scene = transitioner._scene; var camera = scene.camera; - var startPos = Cartesian3.clone(camera.position); - var startDir = Cartesian3.clone(camera.direction); - var startUp = Cartesian3.clone(camera.up); + var startPos = Cartesian3.clone(camera.position, scratch3DToCVStartPos); + var startDir = Cartesian3.clone(camera.direction, scratch3DToCVStartDir); + var startUp = Cartesian3.clone(camera.up, scratch3DToCVStartUp); - var endPos = Cartesian3.clone(endCamera.position2D); - var endDir = Cartesian3.clone(endCamera.direction2D); - var endUp = Cartesian3.clone(endCamera.up2D); + var endPos = Cartesian3.clone(endCamera.position2D, scratch3DToCVEndPos); + var endDir = Cartesian3.clone(endCamera.direction2D, scratch3DToCVEndDir); + var endUp = Cartesian3.clone(endCamera.up2D, scratch3DToCVEndUp); function update(value) { - camera.position = columbusViewMorph(startPos, endPos, value.time); - camera.direction = columbusViewMorph(startDir, endDir, value.time); - camera.up = columbusViewMorph(startUp, endUp, value.time); - camera.right = Cartesian3.cross(camera.direction, camera.up, camera.right); + columbusViewMorph(startPos, endPos, value.time, camera.position); + columbusViewMorph(startDir, endDir, value.time, camera.direction); + columbusViewMorph(startUp, endUp, value.time, camera.up); + Cartesian3.cross(camera.direction, camera.up, camera.right); Cartesian3.normalize(camera.right, camera.right); } var tween = scene.tweens.add({ @@ -521,14 +576,7 @@ define([ stopObject : { time : 1.0 }, - update : update, - complete : function() { - camera.position = endPos; - camera.direction = endDir; - camera.up = endUp; - camera.right = Cartesian3.cross(endDir, endUp, camera.right); - Cartesian3.normalize(camera.right, camera.right); - } + update : update }); transitioner._currentTweens.push(tween); @@ -568,10 +616,10 @@ define([ transitioner._morphCancelled = false; var camera = scene.camera; - camera.position = Cartesian3.clone(camera3D.position); - camera.direction = Cartesian3.clone(camera3D.direction); - camera.up = Cartesian3.clone(camera3D.up); - camera.right = Cartesian3.cross(camera.direction, camera.up, camera.right); + Cartesian3.clone(camera3D.position, camera.position); + Cartesian3.clone(camera3D.direction, camera.direction); + Cartesian3.clone(camera3D.up, camera.up); + Cartesian3.cross(camera.direction, camera.up, camera.right); Cartesian3.normalize(camera.right, camera.right); } From 532b6018de4e12edafdad8ee6996575de4c310c2 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Thu, 4 Feb 2016 16:52:51 -0500 Subject: [PATCH 17/24] Fix height of camera when using orthographic projection that was causing the terrain to disappear. --- Source/Scene/SceneTransitioner.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 95eb1c32d98..d6176e19ba6 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -130,6 +130,7 @@ define([ if (this._previousMode === SceneMode.SCENE2D) { Cartesian3.clone(camera.position, position); + position.z = camera.frustum.right - camera.frustum.left; Cartesian3.negate(Cartesian3.UNIT_Z, direction); Cartesian3.clone(Cartesian3.UNIT_Y, up); } else { @@ -340,6 +341,9 @@ define([ frustum.aspectRatio = scene.drawingBufferWidth / scene.drawingBufferHeight; frustum.fov = CesiumMath.toRadians(60.0); + var camera = scene.camera; + camera.position.z = camera.frustum.right - camera.frustum.left; + var camera3D = getColumbusViewTo3DCamera(transitioner, ellipsoid); camera3D.frustum = frustum; @@ -507,12 +511,10 @@ define([ var scene = transitioner._scene; var camera = scene.camera; - var height = camera.frustum.right - camera.frustum.left; - camera.frustum = cameraCV.frustum.clone(); var endFOV = camera.frustum.fov; var startFOV = CesiumMath.RADIANS_PER_DEGREE * 0.5; - var d = height * Math.tan(endFOV * 0.5); + var d = cameraCV.position.z * Math.tan(endFOV * 0.5); camera.frustum.far = d / Math.tan(startFOV * 0.5) + 10000000.0; camera.frustum.fov = startFOV; @@ -641,6 +643,7 @@ define([ var camera = scene.camera; Cartesian3.clone(camera2D.position, camera.position); + camera.position.z = scene.mapProjection.ellipsoid.maximumRadius * 2.0; Cartesian3.clone(camera2D.direction, camera.direction); Cartesian3.clone(camera2D.up, camera.up); Cartesian3.cross(camera.direction, camera.up, camera.right); From 0df28c76f852ebb875b91b872a4d70b8111d8831 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Thu, 4 Feb 2016 17:01:37 -0500 Subject: [PATCH 18/24] Update quadtree primitive to not update tiles during a morph and render the last tiles that were rendered before the morph was started. --- Source/Scene/QuadtreePrimitive.js | 17 ++++++++++++----- Source/Shaders/GlobeVS.glsl | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Source/Scene/QuadtreePrimitive.js b/Source/Scene/QuadtreePrimitive.js index 87e1e4c05a4..7f611d42e45 100644 --- a/Source/Scene/QuadtreePrimitive.js +++ b/Source/Scene/QuadtreePrimitive.js @@ -263,13 +263,20 @@ define([ var passes = frameState.passes; if (passes.render) { - this._tileProvider.beginUpdate(frameState); + if (frameState.mode !== SceneMode.MORPHING) { + this._tileProvider.beginUpdate(frameState); - selectTilesForRendering(this, frameState); - processTileLoadQueue(this, frameState); - createRenderCommandsForSelectedTiles(this, frameState); + selectTilesForRendering(this, frameState); + processTileLoadQueue(this, frameState); + createRenderCommandsForSelectedTiles(this, frameState); - this._tileProvider.endUpdate(frameState); + this._tileProvider.endUpdate(frameState); + } else { + // Do not update tiles when morphing. Render all tiles in the last frame before the morph started. + this._tileProvider.beginUpdate(frameState); + createRenderCommandsForSelectedTiles(this, frameState); + this._tileProvider.endUpdate(frameState); + } } if (passes.pick && this._tilesToRender.length > 0) { diff --git a/Source/Shaders/GlobeVS.glsl b/Source/Shaders/GlobeVS.glsl index bd9567806f7..ac8b98b1593 100644 --- a/Source/Shaders/GlobeVS.glsl +++ b/Source/Shaders/GlobeVS.glsl @@ -86,7 +86,7 @@ vec4 getPositionMorphingMode(vec3 position, float height, vec2 textureCoordinate // This is unlikely to be noticeable, though. vec3 position3DWC = position + u_center3D; float yPositionFraction = get2DYPositionFraction(textureCoordinates); - vec4 position2DWC = vec4(0.0, mix(u_tileRectangle.st, u_tileRectangle.pq, vec2(textureCoordinates.x, yPositionFraction)), 1.0); + vec4 position2DWC = vec4(height, mix(u_tileRectangle.st, u_tileRectangle.pq, vec2(textureCoordinates.x, yPositionFraction)), 1.0); vec4 morphPosition = czm_columbusViewMorph(position2DWC, vec4(position3DWC, 1.0), czm_morphTime); return czm_modelViewProjection * morphPosition; } From 023df2fff6a8e8a21f6d48ddf355c4148c26a067 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Fri, 5 Feb 2016 12:08:33 -0500 Subject: [PATCH 19/24] Fix position change when morphing from 2D. --- Source/Scene/SceneTransitioner.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index d6176e19ba6..781a716c690 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -511,10 +511,12 @@ define([ var scene = transitioner._scene; var camera = scene.camera; + var height = camera.frustum.right - camera.frustum.left; camera.frustum = cameraCV.frustum.clone(); + var endFOV = camera.frustum.fov; var startFOV = CesiumMath.RADIANS_PER_DEGREE * 0.5; - var d = cameraCV.position.z * Math.tan(endFOV * 0.5); + var d = height * Math.tan(endFOV * 0.5); camera.frustum.far = d / Math.tan(startFOV * 0.5) + 10000000.0; camera.frustum.fov = startFOV; From 3786d187c151b576e4573c9d1fabb0cbb31a6fe1 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Fri, 5 Feb 2016 14:54:45 -0500 Subject: [PATCH 20/24] Have the camera rotate to lokk down at the point intersecting the camera direction in the center of the screen when going from Columbus view to 2D. --- Source/Scene/SceneTransitioner.js | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 781a716c690..6b02bb697dc 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -10,6 +10,7 @@ define([ '../Core/Ellipsoid', '../Core/Math', '../Core/Matrix4', + '../Core/Ray', '../Core/ScreenSpaceEventHandler', '../Core/ScreenSpaceEventType', '../Core/Transforms', @@ -28,6 +29,7 @@ define([ Ellipsoid, CesiumMath, Matrix4, + Ray, ScreenSpaceEventHandler, ScreenSpaceEventType, Transforms, @@ -395,9 +397,12 @@ define([ var scratchCVTo2DStartPos = new Cartesian3(); var scratchCVTo2DStartDir = new Cartesian3(); var scratchCVTo2DStartUp = new Cartesian3(); + var scratchCVTo2DEndPos = new Cartesian3(); var scratchCVTo2DEndDir = new Cartesian3(); var scratchCVTo2DEndUp = new Cartesian3(); var scratchCVTo2DFrustum = new OrthographicFrustum(); + var scratchCVTo2DRay = new Ray(); + var scratchCVTo2DPickPos = new Cartesian3(); var scratchCVTo2DCamera = { position : undefined, direction : undefined, @@ -411,21 +416,31 @@ define([ var scene = transitioner._scene; var camera = scene.camera; - var position = Cartesian3.clone(camera.position, scratchCVTo2DStartPos); + var startPos = Cartesian3.clone(camera.position, scratchCVTo2DStartPos); var startDir = Cartesian3.clone(camera.direction, scratchCVTo2DStartDir); var startUp = Cartesian3.clone(camera.up, scratchCVTo2DStartUp); + var endPos = Cartesian3.clone(startPos, scratchCVTo2DEndPos); var endDir = Cartesian3.negate(Cartesian3.UNIT_Z, scratchCVTo2DEndDir); var endUp = Cartesian3.clone(Cartesian3.UNIT_Y, scratchCVTo2DEndUp); + var ray = scratchCVTo2DRay; + Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, startPos, ray.origin); + Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, startDir, ray.direction); + var pickPos = scene.globe.pick(ray, scene, scratchCVTo2DPickPos); + if (defined(pickPos)) { + Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, pickPos, endPos); + endPos.z += Cartesian3.distance(startPos, endPos); + } + var frustum = scratchCVTo2DFrustum; - frustum.right = position.z * 0.5; + frustum.right = startPos.z * 0.5; frustum.left = -frustum.right; frustum.top = frustum.right * (scene.drawingBufferHeight / scene.drawingBufferWidth); frustum.bottom = -frustum.top; var camera2D = scratchCVTo2DCamera; - camera2D.position = position; + camera2D.position = endPos; camera2D.direction = endDir; camera2D.up = endUp; camera2D.frustum = frustum; @@ -434,6 +449,7 @@ define([ createMorphHandler(transitioner, complete); function updateCV(value) { + columbusViewMorph(startPos, endPos, value.time, camera.position); columbusViewMorph(startDir, endDir, value.time, camera.direction); columbusViewMorph(startUp, endUp, value.time, camera.up); Cartesian3.cross(camera.direction, camera.up, camera.right); From 09c0374933be8fea37c3d90efac9af6fb1d8d9f6 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Fri, 5 Feb 2016 16:56:30 -0500 Subject: [PATCH 21/24] Add rotate camera to top down view to morph from 3D to 2D. --- Source/Scene/SceneTransitioner.js | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 6b02bb697dc..8af6746fa02 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -492,9 +492,10 @@ define([ duration *= 0.5; var scene = transitioner._scene; + var camera = scene.camera; var camera2D = scratch3DTo2DCamera; - ellipsoid.cartesianToCartographic(scene.camera.positionWC, scratch3DTo2DCartographic); + ellipsoid.cartesianToCartographic(camera.positionWC, scratch3DTo2DCartographic); var position = scene.mapProjection.project(scratch3DTo2DCartographic, camera2D.position); var frustum = camera2D.frustum; @@ -510,11 +511,33 @@ define([ Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, camera2D.direction2D); Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, up, camera2D.up2D); + var rayDirection = Cartesian3.clone(camera.directionWC); + var surfacePoint = ellipsoid.scaleToGeodeticSurface(camera.positionWC); + var toENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid); + Matrix4.inverseTransformation(toENU, toENU); + Matrix4.multiplyByPointAsVector(toENU, rayDirection, rayDirection); + Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, rayDirection, rayDirection); + + var ray = new Ray(camera2D.position2D, rayDirection); + var pickedPos = scene.globe.pick(ray, scene); + if (defined(pickedPos)) { + var height = Cartesian3.distance(camera2D.position2D, pickedPos); + pickedPos.x += height; + Cartesian3.clone(pickedPos, camera2D.position2D); + } + function updateHeight(camera, height) { camera.position.x = height; } - var complete = complete2DCallback(camera2D); + var endPos = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, camera2D.position2D, new Cartesian3()); + var endCamera = { + position : endPos, + direction : camera2D.direction, + up : camera2D.up, + frustum : frustum + }; + var complete = complete2DCallback(endCamera); createMorphHandler(transitioner, complete); function completeCallback() { From cb61b2763ad8af885da70d4f71ef6ef7e88a9659 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Fri, 5 Feb 2016 17:13:14 -0500 Subject: [PATCH 22/24] Reduce garbage generated during morph. --- Source/Scene/SceneTransitioner.js | 34 ++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 8af6746fa02..96a549d8101 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -487,6 +487,16 @@ define([ up2D : new Cartesian3(), frustum : new OrthographicFrustum() }; + var scratch3DTo2DEndCamera = { + position : new Cartesian3(), + direction : new Cartesian3(), + up : new Cartesian3(), + frustum : undefined + }; + var scratch3DTo2DPickPosition = new Cartesian3(); + var scratch3DTo2DRay = new Ray(); + var scratch3DTo2DToENU = new Matrix4(); + var scratch3DTo2DSurfacePoint = new Cartesian3(); function morphFrom3DTo2D(transitioner, duration, ellipsoid) { duration *= 0.5; @@ -511,15 +521,16 @@ define([ Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, camera2D.direction2D); Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, up, camera2D.up2D); - var rayDirection = Cartesian3.clone(camera.directionWC); - var surfacePoint = ellipsoid.scaleToGeodeticSurface(camera.positionWC); - var toENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid); + var ray = scratch3DTo2DRay; + Cartesian3.clone(camera2D.position2D, ray.origin); + var rayDirection = Cartesian3.clone(camera.directionWC, ray.direction); + var surfacePoint = ellipsoid.scaleToGeodeticSurface(camera.positionWC, scratch3DTo2DSurfacePoint); + var toENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid, scratch3DTo2DToENU); Matrix4.inverseTransformation(toENU, toENU); Matrix4.multiplyByPointAsVector(toENU, rayDirection, rayDirection); Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, rayDirection, rayDirection); - var ray = new Ray(camera2D.position2D, rayDirection); - var pickedPos = scene.globe.pick(ray, scene); + var pickedPos = scene.globe.pick(ray, scene, scratch3DTo2DPickPosition); if (defined(pickedPos)) { var height = Cartesian3.distance(camera2D.position2D, pickedPos); pickedPos.x += height; @@ -530,13 +541,12 @@ define([ camera.position.x = height; } - var endPos = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, camera2D.position2D, new Cartesian3()); - var endCamera = { - position : endPos, - direction : camera2D.direction, - up : camera2D.up, - frustum : frustum - }; + var endCamera = scratch3DTo2DEndCamera; + Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, camera2D.position2D, endCamera.position); + Cartesian3.clone(camera2D.direction, endCamera.direction); + Cartesian3.clone(camera2D.up, endCamera.up); + endCamera.frustum = frustum; + var complete = complete2DCallback(endCamera); createMorphHandler(transitioner, complete); From 58d57e5df774faa7cecd3f6b221eea8ea684630f Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Wed, 10 Feb 2016 17:21:05 -0500 Subject: [PATCH 23/24] Revert to morph to fly out but add option to jump straight to the end without changing the scene position. --- Source/Scene/QuadtreePrimitive.js | 17 +-- Source/Scene/SceneTransitioner.js | 224 +++++++++++++++++++++--------- 2 files changed, 165 insertions(+), 76 deletions(-) diff --git a/Source/Scene/QuadtreePrimitive.js b/Source/Scene/QuadtreePrimitive.js index 3e72d8ba586..1400fa346f7 100644 --- a/Source/Scene/QuadtreePrimitive.js +++ b/Source/Scene/QuadtreePrimitive.js @@ -271,20 +271,13 @@ define([ var passes = frameState.passes; if (passes.render) { - if (frameState.mode !== SceneMode.MORPHING) { - this._tileProvider.beginUpdate(frameState); + this._tileProvider.beginUpdate(frameState); - selectTilesForRendering(this, frameState); - processTileLoadQueue(this, frameState); - createRenderCommandsForSelectedTiles(this, frameState); + selectTilesForRendering(this, frameState); + processTileLoadQueue(this, frameState); + createRenderCommandsForSelectedTiles(this, frameState); - this._tileProvider.endUpdate(frameState); - } else { - // Do not update tiles when morphing. Render all tiles in the last frame before the morph started. - this._tileProvider.beginUpdate(frameState); - createRenderCommandsForSelectedTiles(this, frameState); - this._tileProvider.endUpdate(frameState); - } + this._tileProvider.endUpdate(frameState); } if (passes.pick && this._tilesToRender.length > 0) { diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 986181d50f1..a18afde6ed7 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -122,31 +122,39 @@ define([ } this._scene.morphStart.raiseEvent(this, this._previousMode, SceneMode.COLUMBUS_VIEW, true); - scene._mode = SceneMode.MORPHING; scene.camera._setTransform(Matrix4.IDENTITY); - var camera = scene.camera; var position = scratchToCVPosition; var direction = scratchToCVDirection; var up = scratchToCVUp; - if (this._previousMode === SceneMode.SCENE2D) { - Cartesian3.clone(camera.position, position); - position.z = camera.frustum.right - camera.frustum.left; + if (duration > 0.0) { + position.x = 0.0; + position.y = 0.0; + position.z = 5.0 * ellipsoid.maximumRadius; + Cartesian3.negate(Cartesian3.UNIT_Z, direction); Cartesian3.clone(Cartesian3.UNIT_Y, up); } else { - Cartesian3.clone(camera.positionWC, position); - Cartesian3.clone(camera.directionWC, direction); - Cartesian3.clone(camera.upWC, up); - - var surfacePoint = ellipsoid.scaleToGeodeticSurface(position, scratchToCVSurfacePosition); - var toENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid, scratchToCVToENU); - Matrix4.inverseTransformation(toENU, toENU); - - scene.mapProjection.project(ellipsoid.cartesianToCartographic(position, scratchToCVCartographic), position); - Matrix4.multiplyByPointAsVector(toENU, direction, direction); - Matrix4.multiplyByPointAsVector(toENU, up, up); + var camera = scene.camera; + if (this._previousMode === SceneMode.SCENE2D) { + Cartesian3.clone(camera.position, position); + position.z = camera.frustum.right - camera.frustum.left; + Cartesian3.negate(Cartesian3.UNIT_Z, direction); + Cartesian3.clone(Cartesian3.UNIT_Y, up); + } else { + Cartesian3.clone(camera.positionWC, position); + Cartesian3.clone(camera.directionWC, direction); + Cartesian3.clone(camera.upWC, up); + + var surfacePoint = ellipsoid.scaleToGeodeticSurface(position, scratchToCVSurfacePosition); + var toENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid, scratchToCVToENU); + Matrix4.inverseTransformation(toENU, toENU); + + scene.mapProjection.project(ellipsoid.cartesianToCartographic(position, scratchToCVCartographic), position); + Matrix4.multiplyByPointAsVector(toENU, direction, direction); + Matrix4.multiplyByPointAsVector(toENU, up, up); + } } var frustum = scratchToCVFrustum; @@ -168,6 +176,8 @@ define([ cameraCV.position2D = Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, position, scratchToCVPosition2D); cameraCV.direction2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, scratchToCVDirection2D); cameraCV.up2D = Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, up, scratchToCVUp2D); + + scene._mode = SceneMode.MORPHING; morphFrom3DToColumbusView(this, duration, cameraCV, complete); } @@ -195,7 +205,16 @@ define([ if (this._previousMode === SceneMode.SCENE2D) { morphFrom2DTo3D(this, duration, ellipsoid); } else { - var camera3D = getColumbusViewTo3DCamera(this, ellipsoid); + var camera3D; + if (duration > 0.0) { + camera3D = scratchCVTo3DCamera; + Cartesian3.fromDegrees(0.0, 0.0, 5.0 * ellipsoid.maximumRadius, ellipsoid, camera3D.position); + Cartesian3.negate(camera3D.position, camera3D.direction); + Cartesian3.normalize(camera3D.direction, camera3D.direction); + Cartesian3.clone(Cartesian3.UNIT_Z, camera3D.up); + } else { + camera3D = getColumbusViewTo3DCamera(this, ellipsoid); + } var complete = complete3DCallback(camera3D); createMorphHandler(this, complete); @@ -298,6 +317,8 @@ define([ var scratchCVTo3DEndUp = new Cartesian3(); function morphFromColumbusViewTo3D(transitioner, duration, endCamera, complete) { + duration *= 0.5; + var scene = transitioner._scene; var camera = scene.camera; @@ -326,11 +347,12 @@ define([ stopObject : { time : 1.0 }, - update : update + update : update, + complete : function() { + addMorphTimeAnimations(transitioner, scene, 0.0, 1.0, duration, complete); + } }); transitioner._currentTweens.push(tween); - - addMorphTimeAnimations(transitioner, scene, 0.0, 1.0, duration, complete); } var scratch2DTo3DFrustum = new PerspectiveFrustum(); @@ -343,10 +365,20 @@ define([ frustum.aspectRatio = scene.drawingBufferWidth / scene.drawingBufferHeight; frustum.fov = CesiumMath.toRadians(60.0); - var camera = scene.camera; - camera.position.z = camera.frustum.right - camera.frustum.left; + var camera3D; + if (duration > 0.0) { + camera3D = scratchCVTo3DCamera; + Cartesian3.fromDegrees(0.0, 0.0, 5.0 * ellipsoid.maximumRadius, ellipsoid, camera3D.position); + Cartesian3.negate(camera3D.position, camera3D.direction); + Cartesian3.normalize(camera3D.direction, camera3D.direction); + Cartesian3.clone(Cartesian3.UNIT_Z, camera3D.up); + } else { + var camera = scene.camera; + camera.position.z = camera.frustum.right - camera.frustum.left; + + camera3D = getColumbusViewTo3DCamera(transitioner, ellipsoid); + } - var camera3D = getColumbusViewTo3DCamera(transitioner, ellipsoid); camera3D.frustum = frustum; var complete = complete3DCallback(camera3D); @@ -420,21 +452,29 @@ define([ var startDir = Cartesian3.clone(camera.direction, scratchCVTo2DStartDir); var startUp = Cartesian3.clone(camera.up, scratchCVTo2DStartUp); - var endPos = Cartesian3.clone(startPos, scratchCVTo2DEndPos); var endDir = Cartesian3.negate(Cartesian3.UNIT_Z, scratchCVTo2DEndDir); var endUp = Cartesian3.clone(Cartesian3.UNIT_Y, scratchCVTo2DEndUp); - var ray = scratchCVTo2DRay; - Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, startPos, ray.origin); - Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, startDir, ray.direction); - var pickPos = scene.globe.pick(ray, scene, scratchCVTo2DPickPos); - if (defined(pickPos)) { - Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, pickPos, endPos); - endPos.z += Cartesian3.distance(startPos, endPos); + var endPos = scratchCVTo2DEndPos; + + if (duration > 0.0) { + Cartesian3.clone(Cartesian3.ZERO, scratchCVTo2DEndPos); + endPos.z = 5.0 * scene.mapProjection.ellipsoid.maximumRadius; + } else { + Cartesian3.clone(startPos, scratchCVTo2DEndPos); + + var ray = scratchCVTo2DRay; + Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, startPos, ray.origin); + Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, startDir, ray.direction); + var pickPos = scene.globe.pick(ray, scene, scratchCVTo2DPickPos); + if (defined(pickPos)) { + Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, pickPos, endPos); + endPos.z += Cartesian3.distance(startPos, endPos); + } } var frustum = scratchCVTo2DFrustum; - frustum.right = startPos.z * 0.5; + frustum.right = endPos.z * 0.5; frustum.left = -frustum.right; frustum.top = frustum.right * (scene.drawingBufferHeight / scene.drawingBufferWidth); frustum.bottom = -frustum.top; @@ -505,42 +545,49 @@ define([ var camera = scene.camera; var camera2D = scratch3DTo2DCamera; - ellipsoid.cartesianToCartographic(camera.positionWC, scratch3DTo2DCartographic); - var position = scene.mapProjection.project(scratch3DTo2DCartographic, camera2D.position); + if (duration > 0.0) { + Cartesian3.clone(Cartesian3.ZERO, camera2D.position); + camera2D.position.z = 5.0 * ellipsoid.maximumRadius; + Cartesian3.negate(Cartesian3.UNIT_Z, camera2D.direction); + Cartesian3.clone(Cartesian3.UNIT_Y, camera2D.up); + } else { + ellipsoid.cartesianToCartographic(camera.positionWC, scratch3DTo2DCartographic); + scene.mapProjection.project(scratch3DTo2DCartographic, camera2D.position); - var frustum = camera2D.frustum; - frustum.right = position.z * 0.5; - frustum.left = -frustum.right; - frustum.top = frustum.right * (scene.drawingBufferHeight / scene.drawingBufferWidth); - frustum.bottom = -frustum.top; + Cartesian3.negate(Cartesian3.UNIT_Z, camera2D.direction); + Cartesian3.clone(Cartesian3.UNIT_Y, camera2D.up); - var direction = Cartesian3.negate(Cartesian3.UNIT_Z, camera2D.direction); - var up = Cartesian3.clone(Cartesian3.UNIT_Y, camera2D.up); - - Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, position, camera2D.position2D); - Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, direction, camera2D.direction2D); - Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, up, camera2D.up2D); - - var ray = scratch3DTo2DRay; - Cartesian3.clone(camera2D.position2D, ray.origin); - var rayDirection = Cartesian3.clone(camera.directionWC, ray.direction); - var surfacePoint = ellipsoid.scaleToGeodeticSurface(camera.positionWC, scratch3DTo2DSurfacePoint); - var toENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid, scratch3DTo2DToENU); - Matrix4.inverseTransformation(toENU, toENU); - Matrix4.multiplyByPointAsVector(toENU, rayDirection, rayDirection); - Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, rayDirection, rayDirection); - - var pickedPos = scene.globe.pick(ray, scene, scratch3DTo2DPickPosition); - if (defined(pickedPos)) { - var height = Cartesian3.distance(camera2D.position2D, pickedPos); - pickedPos.x += height; - Cartesian3.clone(pickedPos, camera2D.position2D); + var ray = scratch3DTo2DRay; + Cartesian3.clone(camera2D.position2D, ray.origin); + var rayDirection = Cartesian3.clone(camera.directionWC, ray.direction); + var surfacePoint = ellipsoid.scaleToGeodeticSurface(camera.positionWC, scratch3DTo2DSurfacePoint); + var toENU = Transforms.eastNorthUpToFixedFrame(surfacePoint, ellipsoid, scratch3DTo2DToENU); + Matrix4.inverseTransformation(toENU, toENU); + Matrix4.multiplyByPointAsVector(toENU, rayDirection, rayDirection); + Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, rayDirection, rayDirection); + + var pickedPos = scene.globe.pick(ray, scene, scratch3DTo2DPickPosition); + if (defined(pickedPos)) { + var height = Cartesian3.distance(camera2D.position2D, pickedPos); + pickedPos.x += height; + Cartesian3.clone(pickedPos, camera2D.position2D); + } } function updateHeight(camera, height) { camera.position.x = height; } + Matrix4.multiplyByPoint(Camera.TRANSFORM_2D, camera2D.position, camera2D.position2D); + Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, camera2D.direction, camera2D.direction2D); + Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D, camera2D.up, camera2D.up2D); + + var frustum = camera2D.frustum; + frustum.right = camera2D.position.z * 0.5; + frustum.left = -frustum.right; + frustum.top = frustum.right * (scene.drawingBufferHeight / scene.drawingBufferWidth); + frustum.bottom = -frustum.top; + var endCamera = scratch3DTo2DEndCamera; Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, camera2D.position2D, endCamera.position); Cartesian3.clone(camera2D.direction, endCamera.direction); @@ -591,7 +638,53 @@ define([ } function morphFrom2DToColumbusView(transitioner, duration, cameraCV, complete) { - morphOrthographicToPerspective(transitioner, duration, cameraCV, complete); + duration *= 0.5; + + var scene = transitioner._scene; + var camera = scene.camera; + + var startPos = Cartesian3.clone(camera.position, scratch3DToCVStartPos); + var startDir = Cartesian3.clone(camera.direction, scratch3DToCVStartDir); + var startUp = Cartesian3.clone(camera.up, scratch3DToCVStartUp); + + var endPos = Cartesian3.clone(cameraCV.position, scratch3DToCVEndPos); + var endDir = Cartesian3.clone(cameraCV.direction, scratch3DToCVEndDir); + var endUp = Cartesian3.clone(cameraCV.up, scratch3DToCVEndUp); + + var startRight = camera.frustum.right; + var endRight = endPos.z * 0.5; + + function update(value) { + columbusViewMorph(startPos, endPos, value.time, camera.position); + columbusViewMorph(startDir, endDir, value.time, camera.direction); + columbusViewMorph(startUp, endUp, value.time, camera.up); + Cartesian3.cross(camera.direction, camera.up, camera.right); + Cartesian3.normalize(camera.right, camera.right); + + var frustum = camera.frustum; + frustum.right = CesiumMath.lerp(startRight, endRight, value.time); + frustum.left = -frustum.right; + frustum.top = frustum.right * (scene.drawingBufferHeight / scene.drawingBufferWidth); + frustum.bottom = -frustum.top; + + camera.position.z = 2.0 * scene.mapProjection.ellipsoid.maximumRadius; + } + var tween = scene.tweens.add({ + duration : duration, + easingFunction : EasingFunction.QUARTIC_OUT, + startObject : { + time : 0.0 + }, + stopObject : { + time : 1.0 + }, + update : update, + complete : function() { + scene._mode = SceneMode.MORPHING; + morphOrthographicToPerspective(transitioner, duration, cameraCV, complete); + } + }); + transitioner._currentTweens.push(tween); } var scratch3DToCVStartPos = new Cartesian3(); @@ -629,11 +722,12 @@ define([ stopObject : { time : 1.0 }, - update : update + update : update, + complete : function() { + addMorphTimeAnimations(transitioner, scene, 1.0, 0.0, duration, complete); + } }); transitioner._currentTweens.push(tween); - - addMorphTimeAnimations(transitioner, scene, 1.0, 0.0, duration, complete); } function addMorphTimeAnimations(transitioner, scene, start, stop, duration, complete) { @@ -674,6 +768,8 @@ define([ Cartesian3.clone(camera3D.up, camera.up); Cartesian3.cross(camera.direction, camera.up, camera.right); Cartesian3.normalize(camera.right, camera.right); + + camera.frustum = camera3D.frustum.clone(); } var wasMorphing = defined(transitioner._completeMorph); From 0c2833e8ebbee4a5542bad1d7b38ac1c4ec499a9 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Fri, 12 Feb 2016 13:40:28 -0500 Subject: [PATCH 24/24] Fix error when transitioning from CV to 3D. --- Source/Scene/SceneTransitioner.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index a18afde6ed7..1b29dc5f256 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -769,7 +769,9 @@ define([ Cartesian3.cross(camera.direction, camera.up, camera.right); Cartesian3.normalize(camera.right, camera.right); - camera.frustum = camera3D.frustum.clone(); + if (defined(camera3D.frustum)) { + camera.frustum = camera3D.frustum.clone(); + } } var wasMorphing = defined(transitioner._completeMorph);