diff --git a/Source/Scene/Camera.js b/Source/Scene/Camera.js index 50b48178c9d3..c4c3de7c4d49 100644 --- a/Source/Scene/Camera.js +++ b/Source/Scene/Camera.js @@ -1013,7 +1013,7 @@ define([ mousePosition.y = scene.drawingBufferHeight / 2.0; var ray = this.getPickRay(mousePosition, pickGlobeScratchRay); - rayIntersection = globe.pick(ray, scene, scratchRayIntersection); + rayIntersection = globe.pickProjected(ray, scene, scratchRayIntersection); if (scene.pickPositionSupported) { depthIntersection = scene.pickPositionWorldCoordinates(mousePosition, scratchDepthIntersection); diff --git a/Source/Scene/Globe.js b/Source/Scene/Globe.js index 29b77bbac8f5..6f8ab8dcf4b1 100644 --- a/Source/Scene/Globe.js +++ b/Source/Scene/Globe.js @@ -407,14 +407,11 @@ define([ * @param {Ray} ray The ray to test for intersection. * @param {Scene} scene The scene. * @param {Cartesian3} [result] The object onto which to store the result. - * @returns {Cartesian3|undefined} The intersection or undefined if none was found. + * @returns {Cartesian3|undefined} The intersection or undefined if none was found. The returned position is in projected coordinates for 2D and Columbus View. * - * @example - * // find intersection of ray through a pixel and the globe - * var ray = viewer.camera.getPickRay(windowCoordinates); - * var intersection = globe.pick(ray, scene); + * @private */ - Globe.prototype.pick = function(ray, scene, result) { + Globe.prototype.pickProjected = function(ray, scene, result) { //>>includeStart('debug', pragmas.debug); if (!defined(ray)) { throw new DeveloperError('ray is required'); @@ -472,6 +469,35 @@ define([ return intersection; }; + var pickScratch = new Cartesian3(); + var cartoScratch = new Cartographic(); + /** + * Find an intersection between a ray and the globe surface that was rendered. The ray must be given in world coordinates. + * + * @param {Ray} ray The ray to test for intersection. + * @param {Scene} scene The scene. + * @param {Cartesian3} [result] The object onto which to store the result. + * @returns {Cartesian3|undefined} The intersection in world coordinates or undefined if none was found. + * + * @example + * // find intersection of ray through a pixel and the globe + * var ray = viewer.camera.getPickRay(windowCoordinates); + * var intersection = globe.pick(ray, scene); + */ + Globe.prototype.pick = function(ray, scene, result) { + result = this.pickProjected(ray, scene, result); + if (defined(result) && scene.mode === SceneMode.COLUMBUS_VIEW) { + pickScratch.x = result.y; + pickScratch.y = result.z; + pickScratch.z = result.x; + var carto = scene.mapProjection.unproject(pickScratch, cartoScratch); + result = scene.globe.ellipsoid.cartographicToCartesian(carto, result); + } + //TODO: is always undefined for 2D + + return result; + }; + var scratchGetHeightCartesian = new Cartesian3(); var scratchGetHeightIntersection = new Cartesian3(); var scratchGetHeightCartographic = new Cartographic(); diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index b69d36c93c8d..ff443175c3b3 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -530,7 +530,7 @@ define([ var globe = scene.globe; if (defined(globe)) { - var pickPos = globe.pick(ray, scene, scratchCVTo2DPickPos); + var pickPos = globe.pickProjected(ray, scene, scratchCVTo2DPickPos); if (defined(pickPos)) { Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE, pickPos, endPos); endPos.z += Cartesian3.distance(startPos, endPos); @@ -634,7 +634,7 @@ define([ var globe = scene.globe; if (defined(globe)) { - var pickedPos = globe.pick(ray, scene, scratch3DTo2DPickPosition); + var pickedPos = globe.pickProjected(ray, scene, scratch3DTo2DPickPosition); if (defined(pickedPos)) { var height = Cartesian3.distance(camera2D.position2D, pickedPos); pickedPos.x += height; diff --git a/Source/Scene/ScreenSpaceCameraController.js b/Source/Scene/ScreenSpaceCameraController.js index 02037bbbb2e7..db9588da04e4 100644 --- a/Source/Scene/ScreenSpaceCameraController.js +++ b/Source/Scene/ScreenSpaceCameraController.js @@ -832,7 +832,7 @@ define([ } var ray = camera.getPickRay(mousePosition, pickGlobeScratchRay); - var rayIntersection = globe.pick(ray, scene, scratchRayIntersection); + var rayIntersection = globe.pickProjected(ray, scene, scratchRayIntersection); var pickDistance = defined(depthIntersection) ? Cartesian3.distance(depthIntersection, camera.positionWC) : Number.POSITIVE_INFINITY; var rayDistance = defined(rayIntersection) ? Cartesian3.distance(rayIntersection, camera.positionWC) : Number.POSITIVE_INFINITY; diff --git a/Specs/Scene/ScreenSpaceCameraControllerSpec.js b/Specs/Scene/ScreenSpaceCameraControllerSpec.js index 6b71846515ae..2c80e374aa4e 100644 --- a/Specs/Scene/ScreenSpaceCameraControllerSpec.js +++ b/Specs/Scene/ScreenSpaceCameraControllerSpec.js @@ -64,7 +64,7 @@ defineSuite([ this.getHeight = function(cartographic) { return 0.0; }; - this.pick = function() { + this.pickProjected = function() { return new Cartesian3(0.0, 0.0, 1.0); }; this._surface = {