cesium 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE.md +259 -0
- data/README.rdoc +90 -0
- data/Rakefile +40 -0
- data/app/assets/javascripts/Assets/Assets.profile.js +8 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
- data/app/assets/javascripts/Assets/Textures/NE2_LR_LC_SR_W_DR_2048.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/waterNormals.jpg +0 -0
- data/app/assets/javascripts/Assets/package.json +6 -0
- data/app/assets/javascripts/Cesium.js +320 -0
- data/app/assets/javascripts/Core/AnimationController.js +148 -0
- data/app/assets/javascripts/Core/AxisAlignedBoundingBox.js +243 -0
- data/app/assets/javascripts/Core/BoundingRectangle.js +364 -0
- data/app/assets/javascripts/Core/BoundingSphere.js +819 -0
- data/app/assets/javascripts/Core/BoxTessellator.js +93 -0
- data/app/assets/javascripts/Core/Cartesian2.js +762 -0
- data/app/assets/javascripts/Core/Cartesian3.js +861 -0
- data/app/assets/javascripts/Core/Cartesian4.js +762 -0
- data/app/assets/javascripts/Core/Cartographic.js +211 -0
- data/app/assets/javascripts/Core/CatmullRomSpline.js +232 -0
- data/app/assets/javascripts/Core/Clock.js +195 -0
- data/app/assets/javascripts/Core/ClockRange.js +37 -0
- data/app/assets/javascripts/Core/ClockStep.js +32 -0
- data/app/assets/javascripts/Core/Color.js +1629 -0
- data/app/assets/javascripts/Core/ComponentDatatype.js +119 -0
- data/app/assets/javascripts/Core/Core.profile.js +8 -0
- data/app/assets/javascripts/Core/CubeMapEllipsoidTessellator.js +198 -0
- data/app/assets/javascripts/Core/CubicRealPolynomial.js +251 -0
- data/app/assets/javascripts/Core/DefaultProxy.js +30 -0
- data/app/assets/javascripts/Core/DeveloperError.js +60 -0
- data/app/assets/javascripts/Core/EarthOrientationParameters.js +383 -0
- data/app/assets/javascripts/Core/EarthOrientationParametersSample.js +50 -0
- data/app/assets/javascripts/Core/Ellipsoid.js +539 -0
- data/app/assets/javascripts/Core/EllipsoidTangentPlane.js +207 -0
- data/app/assets/javascripts/Core/EllipsoidalOccluder.js +151 -0
- data/app/assets/javascripts/Core/EncodedCartesian3.js +197 -0
- data/app/assets/javascripts/Core/Enumeration.js +67 -0
- data/app/assets/javascripts/Core/Event.js +122 -0
- data/app/assets/javascripts/Core/Extent.js +383 -0
- data/app/assets/javascripts/Core/ExtentTessellator.js +384 -0
- data/app/assets/javascripts/Core/FAR.js +13 -0
- data/app/assets/javascripts/Core/FeatureDetection.js +126 -0
- data/app/assets/javascripts/Core/Fullscreen.js +235 -0
- data/app/assets/javascripts/Core/GeographicProjection.js +107 -0
- data/app/assets/javascripts/Core/HermitePolynomialApproximation.js +176 -0
- data/app/assets/javascripts/Core/HermiteSpline.js +234 -0
- data/app/assets/javascripts/Core/Iau2006XysData.js +259 -0
- data/app/assets/javascripts/Core/Iau2006XysSample.js +36 -0
- data/app/assets/javascripts/Core/IndexDatatype.js +28 -0
- data/app/assets/javascripts/Core/Intersect.js +40 -0
- data/app/assets/javascripts/Core/IntersectionTests.js +359 -0
- data/app/assets/javascripts/Core/Interval.js +27 -0
- data/app/assets/javascripts/Core/Iso8601.js +46 -0
- data/app/assets/javascripts/Core/JulianDate.js +1228 -0
- data/app/assets/javascripts/Core/KeyboardEventModifier.js +38 -0
- data/app/assets/javascripts/Core/LagrangePolynomialApproximation.js +96 -0
- data/app/assets/javascripts/Core/LeapSecond.js +158 -0
- data/app/assets/javascripts/Core/LinearApproximation.js +98 -0
- data/app/assets/javascripts/Core/Math.js +532 -0
- data/app/assets/javascripts/Core/Matrix2.js +833 -0
- data/app/assets/javascripts/Core/Matrix3.js +1099 -0
- data/app/assets/javascripts/Core/Matrix4.js +2164 -0
- data/app/assets/javascripts/Core/MeshFilters.js +568 -0
- data/app/assets/javascripts/Core/Occluder.js +474 -0
- data/app/assets/javascripts/Core/OrientationInterpolator.js +109 -0
- data/app/assets/javascripts/Core/PlaneTessellator.js +74 -0
- data/app/assets/javascripts/Core/PolygonPipeline.js +792 -0
- data/app/assets/javascripts/Core/PolylinePipeline.js +90 -0
- data/app/assets/javascripts/Core/PrimitiveType.js +80 -0
- data/app/assets/javascripts/Core/QuadraticRealPolynomial.js +146 -0
- data/app/assets/javascripts/Core/QuarticRealPolynomial.js +339 -0
- data/app/assets/javascripts/Core/Quaternion.js +947 -0
- data/app/assets/javascripts/Core/Queue.js +95 -0
- data/app/assets/javascripts/Core/Ray.js +64 -0
- data/app/assets/javascripts/Core/ReferenceFrame.js +25 -0
- data/app/assets/javascripts/Core/RequestErrorEvent.js +35 -0
- data/app/assets/javascripts/Core/RuntimeError.js +59 -0
- data/app/assets/javascripts/Core/ScreenSpaceEventHandler.js +658 -0
- data/app/assets/javascripts/Core/ScreenSpaceEventType.js +149 -0
- data/app/assets/javascripts/Core/Shapes.js +230 -0
- data/app/assets/javascripts/Core/Spherical.js +192 -0
- data/app/assets/javascripts/Core/TaskProcessor.js +131 -0
- data/app/assets/javascripts/Core/TimeConstants.js +85 -0
- data/app/assets/javascripts/Core/TimeInterval.js +305 -0
- data/app/assets/javascripts/Core/TimeIntervalCollection.js +543 -0
- data/app/assets/javascripts/Core/TimeStandard.js +31 -0
- data/app/assets/javascripts/Core/Tipsify.js +285 -0
- data/app/assets/javascripts/Core/Transforms.js +614 -0
- data/app/assets/javascripts/Core/TridiagonalSystemSolver.js +102 -0
- data/app/assets/javascripts/Core/Visibility.js +38 -0
- data/app/assets/javascripts/Core/WebMercatorProjection.js +154 -0
- data/app/assets/javascripts/Core/WindingOrder.js +40 -0
- data/app/assets/javascripts/Core/binarySearch.js +69 -0
- data/app/assets/javascripts/Core/buildModuleUrl.js +77 -0
- data/app/assets/javascripts/Core/clone.js +21 -0
- data/app/assets/javascripts/Core/combine.js +81 -0
- data/app/assets/javascripts/Core/computeSunPosition.js +116 -0
- data/app/assets/javascripts/Core/createGuid.js +25 -0
- data/app/assets/javascripts/Core/defaultValue.js +22 -0
- data/app/assets/javascripts/Core/destroyObject.js +61 -0
- data/app/assets/javascripts/Core/freezeObject.js +20 -0
- data/app/assets/javascripts/Core/getImagePixels.js +46 -0
- data/app/assets/javascripts/Core/isLeapYear.js +30 -0
- data/app/assets/javascripts/Core/jsonp.js +116 -0
- data/app/assets/javascripts/Core/loadArrayBuffer.js +76 -0
- data/app/assets/javascripts/Core/loadImage.js +85 -0
- data/app/assets/javascripts/Core/loadJson.js +54 -0
- data/app/assets/javascripts/Core/loadText.js +78 -0
- data/app/assets/javascripts/Core/loadXML.js +76 -0
- data/app/assets/javascripts/Core/package.json +6 -0
- data/app/assets/javascripts/Core/pointInsideTriangle2D.js +41 -0
- data/app/assets/javascripts/Core/requestAnimationFrame.js +61 -0
- data/app/assets/javascripts/Core/throttleRequestByServer.js +74 -0
- data/app/assets/javascripts/Core/writeTextToCanvas.js +92 -0
- data/app/assets/javascripts/DynamicScene/CompositeDynamicObjectCollection.js +254 -0
- data/app/assets/javascripts/DynamicScene/CzmlBoolean.js +57 -0
- data/app/assets/javascripts/DynamicScene/CzmlCartesian2.js +96 -0
- data/app/assets/javascripts/DynamicScene/CzmlCartesian3.js +99 -0
- data/app/assets/javascripts/DynamicScene/CzmlCartographic.js +125 -0
- data/app/assets/javascripts/DynamicScene/CzmlColor.js +127 -0
- data/app/assets/javascripts/DynamicScene/CzmlDefaults.js +135 -0
- data/app/assets/javascripts/DynamicScene/CzmlHorizontalOrigin.js +59 -0
- data/app/assets/javascripts/DynamicScene/CzmlImage.js +61 -0
- data/app/assets/javascripts/DynamicScene/CzmlLabelStyle.js +59 -0
- data/app/assets/javascripts/DynamicScene/CzmlNumber.js +82 -0
- data/app/assets/javascripts/DynamicScene/CzmlString.js +56 -0
- data/app/assets/javascripts/DynamicScene/CzmlUnitCartesian3.js +99 -0
- data/app/assets/javascripts/DynamicScene/CzmlUnitQuaternion.js +172 -0
- data/app/assets/javascripts/DynamicScene/CzmlUnitSpherical.js +98 -0
- data/app/assets/javascripts/DynamicScene/CzmlVerticalOrigin.js +59 -0
- data/app/assets/javascripts/DynamicScene/DynamicBillboard.js +245 -0
- data/app/assets/javascripts/DynamicScene/DynamicBillboardVisualizer.js +347 -0
- data/app/assets/javascripts/DynamicScene/DynamicColorMaterial.js +78 -0
- data/app/assets/javascripts/DynamicScene/DynamicCone.js +291 -0
- data/app/assets/javascripts/DynamicScene/DynamicConeVisualizer.js +350 -0
- data/app/assets/javascripts/DynamicScene/DynamicConeVisualizerUsingCustomSensor.js +389 -0
- data/app/assets/javascripts/DynamicScene/DynamicDirectionsProperty.js +163 -0
- data/app/assets/javascripts/DynamicScene/DynamicEllipsoid.js +158 -0
- data/app/assets/javascripts/DynamicScene/DynamicEllipsoidVisualizer.js +277 -0
- data/app/assets/javascripts/DynamicScene/DynamicImageMaterial.js +136 -0
- data/app/assets/javascripts/DynamicScene/DynamicLabel.js +286 -0
- data/app/assets/javascripts/DynamicScene/DynamicLabelVisualizer.js +341 -0
- data/app/assets/javascripts/DynamicScene/DynamicMaterialProperty.js +125 -0
- data/app/assets/javascripts/DynamicScene/DynamicObject.js +364 -0
- data/app/assets/javascripts/DynamicScene/DynamicObjectCollection.js +137 -0
- data/app/assets/javascripts/DynamicScene/DynamicObjectView.js +299 -0
- data/app/assets/javascripts/DynamicScene/DynamicPath.js +214 -0
- data/app/assets/javascripts/DynamicScene/DynamicPathVisualizer.js +402 -0
- data/app/assets/javascripts/DynamicScene/DynamicPoint.js +184 -0
- data/app/assets/javascripts/DynamicScene/DynamicPointVisualizer.js +323 -0
- data/app/assets/javascripts/DynamicScene/DynamicPolygon.js +138 -0
- data/app/assets/javascripts/DynamicScene/DynamicPolygonVisualizer.js +251 -0
- data/app/assets/javascripts/DynamicScene/DynamicPolyline.js +183 -0
- data/app/assets/javascripts/DynamicScene/DynamicPolylineVisualizer.js +268 -0
- data/app/assets/javascripts/DynamicScene/DynamicPositionProperty.js +525 -0
- data/app/assets/javascripts/DynamicScene/DynamicProperty.js +352 -0
- data/app/assets/javascripts/DynamicScene/DynamicPyramid.js +204 -0
- data/app/assets/javascripts/DynamicScene/DynamicPyramidVisualizer.js +302 -0
- data/app/assets/javascripts/DynamicScene/DynamicScene.profile.js +8 -0
- data/app/assets/javascripts/DynamicScene/DynamicVertexPositionsProperty.js +199 -0
- data/app/assets/javascripts/DynamicScene/ReferenceProperty.js +155 -0
- data/app/assets/javascripts/DynamicScene/VisualizerCollection.js +181 -0
- data/app/assets/javascripts/DynamicScene/package.json +6 -0
- data/app/assets/javascripts/DynamicScene/processCzml.js +77 -0
- data/app/assets/javascripts/Renderer/BlendEquation.js +52 -0
- data/app/assets/javascripts/Renderer/BlendFunction.js +158 -0
- data/app/assets/javascripts/Renderer/BlendingState.js +64 -0
- data/app/assets/javascripts/Renderer/Buffer.js +141 -0
- data/app/assets/javascripts/Renderer/BufferUsage.js +48 -0
- data/app/assets/javascripts/Renderer/ClearCommand.js +40 -0
- data/app/assets/javascripts/Renderer/CommandLists.js +42 -0
- data/app/assets/javascripts/Renderer/Context.js +2805 -0
- data/app/assets/javascripts/Renderer/CubeMap.js +358 -0
- data/app/assets/javascripts/Renderer/CubeMapFace.js +202 -0
- data/app/assets/javascripts/Renderer/CullFace.js +50 -0
- data/app/assets/javascripts/Renderer/DepthFunction.js +95 -0
- data/app/assets/javascripts/Renderer/DrawCommand.js +96 -0
- data/app/assets/javascripts/Renderer/Framebuffer.js +435 -0
- data/app/assets/javascripts/Renderer/MipmapHint.js +50 -0
- data/app/assets/javascripts/Renderer/PickFramebuffer.js +178 -0
- data/app/assets/javascripts/Renderer/PixelDatatype.js +86 -0
- data/app/assets/javascripts/Renderer/PixelFormat.js +113 -0
- data/app/assets/javascripts/Renderer/Renderbuffer.js +102 -0
- data/app/assets/javascripts/Renderer/RenderbufferFormat.js +77 -0
- data/app/assets/javascripts/Renderer/Renderer.profile.js +8 -0
- data/app/assets/javascripts/Renderer/ShaderCache.js +121 -0
- data/app/assets/javascripts/Renderer/ShaderProgram.js +2402 -0
- data/app/assets/javascripts/Renderer/StencilFunction.js +95 -0
- data/app/assets/javascripts/Renderer/StencilOperation.js +95 -0
- data/app/assets/javascripts/Renderer/Texture.js +395 -0
- data/app/assets/javascripts/Renderer/TextureAtlas.js +472 -0
- data/app/assets/javascripts/Renderer/TextureAtlasBuilder.js +133 -0
- data/app/assets/javascripts/Renderer/TextureMagnificationFilter.js +41 -0
- data/app/assets/javascripts/Renderer/TextureMinificationFilter.js +77 -0
- data/app/assets/javascripts/Renderer/TextureWrap.js +50 -0
- data/app/assets/javascripts/Renderer/UniformDatatype.js +218 -0
- data/app/assets/javascripts/Renderer/UniformState.js +799 -0
- data/app/assets/javascripts/Renderer/VertexArray.js +365 -0
- data/app/assets/javascripts/Renderer/VertexArrayFacade.js +574 -0
- data/app/assets/javascripts/Renderer/VertexLayout.js +49 -0
- data/app/assets/javascripts/Renderer/loadCubeMap.js +92 -0
- data/app/assets/javascripts/Renderer/package.json +6 -0
- data/app/assets/javascripts/Scene/AnimationCollection.js +249 -0
- data/app/assets/javascripts/Scene/ArcGisMapServerImageryProvider.js +384 -0
- data/app/assets/javascripts/Scene/Billboard.js +680 -0
- data/app/assets/javascripts/Scene/BillboardCollection.js +1209 -0
- data/app/assets/javascripts/Scene/BingMapsImageryProvider.js +460 -0
- data/app/assets/javascripts/Scene/BingMapsStyle.js +55 -0
- data/app/assets/javascripts/Scene/Camera.js +358 -0
- data/app/assets/javascripts/Scene/CameraColumbusViewMode.js +30 -0
- data/app/assets/javascripts/Scene/CameraController.js +1258 -0
- data/app/assets/javascripts/Scene/CameraEventAggregator.js +270 -0
- data/app/assets/javascripts/Scene/CameraEventType.js +53 -0
- data/app/assets/javascripts/Scene/CameraFlightPath.js +495 -0
- data/app/assets/javascripts/Scene/CentralBody.js +817 -0
- data/app/assets/javascripts/Scene/CentralBodySurface.js +1120 -0
- data/app/assets/javascripts/Scene/CentralBodySurfaceShaderSet.js +107 -0
- data/app/assets/javascripts/Scene/ComplexConicSensorVolume.js +511 -0
- data/app/assets/javascripts/Scene/CompositePrimitive.js +454 -0
- data/app/assets/javascripts/Scene/CullingVolume.js +59 -0
- data/app/assets/javascripts/Scene/CustomSensorVolume.js +440 -0
- data/app/assets/javascripts/Scene/DiscardMissingTileImagePolicy.js +134 -0
- data/app/assets/javascripts/Scene/EllipsoidPrimitive.js +412 -0
- data/app/assets/javascripts/Scene/EllipsoidTerrainProvider.js +182 -0
- data/app/assets/javascripts/Scene/FrameState.js +86 -0
- data/app/assets/javascripts/Scene/FrustumCommands.js +32 -0
- data/app/assets/javascripts/Scene/GeographicTilingScheme.js +265 -0
- data/app/assets/javascripts/Scene/HorizontalOrigin.js +39 -0
- data/app/assets/javascripts/Scene/Imagery.js +85 -0
- data/app/assets/javascripts/Scene/ImageryLayer.js +876 -0
- data/app/assets/javascripts/Scene/ImageryLayerCollection.js +403 -0
- data/app/assets/javascripts/Scene/ImageryProvider.js +185 -0
- data/app/assets/javascripts/Scene/ImageryProviderError.js +149 -0
- data/app/assets/javascripts/Scene/ImageryState.js +20 -0
- data/app/assets/javascripts/Scene/Label.js +706 -0
- data/app/assets/javascripts/Scene/LabelCollection.js +697 -0
- data/app/assets/javascripts/Scene/LabelStyle.js +39 -0
- data/app/assets/javascripts/Scene/Material.js +1177 -0
- data/app/assets/javascripts/Scene/NeverTileDiscardPolicy.js +38 -0
- data/app/assets/javascripts/Scene/OpenStreetMapImageryProvider.js +282 -0
- data/app/assets/javascripts/Scene/OrthographicFrustum.js +345 -0
- data/app/assets/javascripts/Scene/PerformanceDisplay.js +183 -0
- data/app/assets/javascripts/Scene/PerspectiveFrustum.js +239 -0
- data/app/assets/javascripts/Scene/PerspectiveOffCenterFrustum.js +394 -0
- data/app/assets/javascripts/Scene/Polygon.js +886 -0
- data/app/assets/javascripts/Scene/Polyline.js +441 -0
- data/app/assets/javascripts/Scene/PolylineCollection.js +1532 -0
- data/app/assets/javascripts/Scene/Projections.js +93 -0
- data/app/assets/javascripts/Scene/RectangularPyramidSensorVolume.js +224 -0
- data/app/assets/javascripts/Scene/Scene.js +632 -0
- data/app/assets/javascripts/Scene/Scene.profile.js +8 -0
- data/app/assets/javascripts/Scene/SceneMode.js +51 -0
- data/app/assets/javascripts/Scene/SceneTransitioner.js +776 -0
- data/app/assets/javascripts/Scene/ScreenSpaceCameraController.js +1063 -0
- data/app/assets/javascripts/Scene/SensorVolumeCollection.js +192 -0
- data/app/assets/javascripts/Scene/SingleTileImageryProvider.js +295 -0
- data/app/assets/javascripts/Scene/SkyAtmosphere.js +239 -0
- data/app/assets/javascripts/Scene/SkyBox.js +231 -0
- data/app/assets/javascripts/Scene/TerrainProvider.js +229 -0
- data/app/assets/javascripts/Scene/TexturePool.js +154 -0
- data/app/assets/javascripts/Scene/Tile.js +322 -0
- data/app/assets/javascripts/Scene/TileDiscardPolicy.js +42 -0
- data/app/assets/javascripts/Scene/TileImagery.js +36 -0
- data/app/assets/javascripts/Scene/TileLoadQueue.js +123 -0
- data/app/assets/javascripts/Scene/TileMapServiceImageryProvider.js +337 -0
- data/app/assets/javascripts/Scene/TileReplacementQueue.js +139 -0
- data/app/assets/javascripts/Scene/TileState.js +19 -0
- data/app/assets/javascripts/Scene/TilingScheme.js +213 -0
- data/app/assets/javascripts/Scene/VerticalOrigin.js +39 -0
- data/app/assets/javascripts/Scene/ViewportQuad.js +256 -0
- data/app/assets/javascripts/Scene/WebMapServiceImageryProvider.js +374 -0
- data/app/assets/javascripts/Scene/WebMercatorTilingScheme.js +291 -0
- data/app/assets/javascripts/Scene/package.json +6 -0
- data/app/assets/javascripts/Shaders/BillboardCollectionFS.glsl +30 -0
- data/app/assets/javascripts/Shaders/BillboardCollectionFS.js +31 -0
- data/app/assets/javascripts/Shaders/BillboardCollectionVS.glsl +68 -0
- data/app/assets/javascripts/Shaders/BillboardCollectionVS.js +54 -0
- data/app/assets/javascripts/Shaders/BuiltinFunctions.glsl +927 -0
- data/app/assets/javascripts/Shaders/BuiltinFunctions.js +322 -0
- data/app/assets/javascripts/Shaders/CentralBodyFS.glsl +106 -0
- data/app/assets/javascripts/Shaders/CentralBodyFS.js +82 -0
- data/app/assets/javascripts/Shaders/CentralBodyFSDepth.glsl +20 -0
- data/app/assets/javascripts/Shaders/CentralBodyFSDepth.js +22 -0
- data/app/assets/javascripts/Shaders/CentralBodyFSPole.glsl +29 -0
- data/app/assets/javascripts/Shaders/CentralBodyFSPole.js +28 -0
- data/app/assets/javascripts/Shaders/CentralBodyVS.glsl +88 -0
- data/app/assets/javascripts/Shaders/CentralBodyVS.js +69 -0
- data/app/assets/javascripts/Shaders/CentralBodyVSDepth.glsl +9 -0
- data/app/assets/javascripts/Shaders/CentralBodyVSDepth.js +13 -0
- data/app/assets/javascripts/Shaders/CentralBodyVSPole.glsl +12 -0
- data/app/assets/javascripts/Shaders/CentralBodyVSPole.js +15 -0
- data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeFS.glsl +448 -0
- data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeFS.js +361 -0
- data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeVS.glsl +19 -0
- data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeVS.js +20 -0
- data/app/assets/javascripts/Shaders/ConstructiveSolidGeometry.glsl +886 -0
- data/app/assets/javascripts/Shaders/ConstructiveSolidGeometry.js +586 -0
- data/app/assets/javascripts/Shaders/CustomSensorVolumeFS.glsl +126 -0
- data/app/assets/javascripts/Shaders/CustomSensorVolumeFS.js +95 -0
- data/app/assets/javascripts/Shaders/CustomSensorVolumeVS.glsl +14 -0
- data/app/assets/javascripts/Shaders/CustomSensorVolumeVS.js +18 -0
- data/app/assets/javascripts/Shaders/EllipsoidFS.glsl +40 -0
- data/app/assets/javascripts/Shaders/EllipsoidFS.js +38 -0
- data/app/assets/javascripts/Shaders/EllipsoidVS.glsl +26 -0
- data/app/assets/javascripts/Shaders/EllipsoidVS.js +16 -0
- data/app/assets/javascripts/Shaders/Materials/AsphaltMaterial.glsl +25 -0
- data/app/assets/javascripts/Shaders/Materials/AsphaltMaterial.js +23 -0
- data/app/assets/javascripts/Shaders/Materials/BlobMaterial.glsl +18 -0
- data/app/assets/javascripts/Shaders/Materials/BlobMaterial.js +19 -0
- data/app/assets/javascripts/Shaders/Materials/BrickMaterial.glsl +42 -0
- data/app/assets/javascripts/Shaders/Materials/BrickMaterial.js +36 -0
- data/app/assets/javascripts/Shaders/Materials/BumpMapMaterial.glsl +29 -0
- data/app/assets/javascripts/Shaders/Materials/BumpMapMaterial.js +27 -0
- data/app/assets/javascripts/Shaders/Materials/CementMaterial.glsl +19 -0
- data/app/assets/javascripts/Shaders/Materials/CementMaterial.js +20 -0
- data/app/assets/javascripts/Shaders/Materials/CheckerboardMaterial.glsl +38 -0
- data/app/assets/javascripts/Shaders/Materials/CheckerboardMaterial.js +32 -0
- data/app/assets/javascripts/Shaders/Materials/DotMaterial.glsl +17 -0
- data/app/assets/javascripts/Shaders/Materials/DotMaterial.js +18 -0
- data/app/assets/javascripts/Shaders/Materials/ErosionMaterial.glsl +23 -0
- data/app/assets/javascripts/Shaders/Materials/ErosionMaterial.js +24 -0
- data/app/assets/javascripts/Shaders/Materials/FacetMaterial.glsl +18 -0
- data/app/assets/javascripts/Shaders/Materials/FacetMaterial.js +19 -0
- data/app/assets/javascripts/Shaders/Materials/FresnelMaterial.glsl +12 -0
- data/app/assets/javascripts/Shaders/Materials/FresnelMaterial.js +15 -0
- data/app/assets/javascripts/Shaders/Materials/GrassMaterial.glsl +28 -0
- data/app/assets/javascripts/Shaders/Materials/GrassMaterial.js +26 -0
- data/app/assets/javascripts/Shaders/Materials/NormalMapMaterial.glsl +19 -0
- data/app/assets/javascripts/Shaders/Materials/NormalMapMaterial.js +21 -0
- data/app/assets/javascripts/Shaders/Materials/ReflectionMaterial.glsl +13 -0
- data/app/assets/javascripts/Shaders/Materials/ReflectionMaterial.js +16 -0
- data/app/assets/javascripts/Shaders/Materials/RefractionMaterial.glsl +14 -0
- data/app/assets/javascripts/Shaders/Materials/RefractionMaterial.js +17 -0
- data/app/assets/javascripts/Shaders/Materials/RimLightingMaterial.glsl +18 -0
- data/app/assets/javascripts/Shaders/Materials/RimLightingMaterial.js +19 -0
- data/app/assets/javascripts/Shaders/Materials/StripeMaterial.glsl +29 -0
- data/app/assets/javascripts/Shaders/Materials/StripeMaterial.js +26 -0
- data/app/assets/javascripts/Shaders/Materials/TieDyeMaterial.glsl +17 -0
- data/app/assets/javascripts/Shaders/Materials/TieDyeMaterial.js +19 -0
- data/app/assets/javascripts/Shaders/Materials/Water.glsl +91 -0
- data/app/assets/javascripts/Shaders/Materials/Water.js +60 -0
- data/app/assets/javascripts/Shaders/Materials/WoodMaterial.glsl +36 -0
- data/app/assets/javascripts/Shaders/Materials/WoodMaterial.js +31 -0
- data/app/assets/javascripts/Shaders/Noise.glsl +453 -0
- data/app/assets/javascripts/Shaders/Noise.js +242 -0
- data/app/assets/javascripts/Shaders/PolygonFS.glsl +27 -0
- data/app/assets/javascripts/Shaders/PolygonFS.js +23 -0
- data/app/assets/javascripts/Shaders/PolygonFSPick.glsl +6 -0
- data/app/assets/javascripts/Shaders/PolygonFSPick.js +11 -0
- data/app/assets/javascripts/Shaders/PolygonVS.glsl +38 -0
- data/app/assets/javascripts/Shaders/PolygonVS.js +39 -0
- data/app/assets/javascripts/Shaders/PolygonVSPick.glsl +30 -0
- data/app/assets/javascripts/Shaders/PolygonVSPick.js +32 -0
- data/app/assets/javascripts/Shaders/PolylineFS.glsl +6 -0
- data/app/assets/javascripts/Shaders/PolylineFS.js +11 -0
- data/app/assets/javascripts/Shaders/PolylineVS.glsl +34 -0
- data/app/assets/javascripts/Shaders/PolylineVS.js +35 -0
- data/app/assets/javascripts/Shaders/Ray.glsl +532 -0
- data/app/assets/javascripts/Shaders/Ray.js +357 -0
- data/app/assets/javascripts/Shaders/ReprojectWebMercatorFS.glsl +26 -0
- data/app/assets/javascripts/Shaders/ReprojectWebMercatorFS.js +22 -0
- data/app/assets/javascripts/Shaders/ReprojectWebMercatorVS.glsl +11 -0
- data/app/assets/javascripts/Shaders/ReprojectWebMercatorVS.js +14 -0
- data/app/assets/javascripts/Shaders/SensorVolume.glsl +43 -0
- data/app/assets/javascripts/Shaders/SensorVolume.js +31 -0
- data/app/assets/javascripts/Shaders/Shaders.profile.js +8 -0
- data/app/assets/javascripts/Shaders/SkyAtmosphereFS.glsl +70 -0
- data/app/assets/javascripts/Shaders/SkyAtmosphereFS.js +62 -0
- data/app/assets/javascripts/Shaders/SkyAtmosphereVS.glsl +131 -0
- data/app/assets/javascripts/Shaders/SkyAtmosphereVS.js +115 -0
- data/app/assets/javascripts/Shaders/SkyBoxFS.glsl +10 -0
- data/app/assets/javascripts/Shaders/SkyBoxFS.js +14 -0
- data/app/assets/javascripts/Shaders/SkyBoxVS.glsl +10 -0
- data/app/assets/javascripts/Shaders/SkyBoxVS.js +14 -0
- data/app/assets/javascripts/Shaders/ViewportQuadFS.glsl +16 -0
- data/app/assets/javascripts/Shaders/ViewportQuadFS.js +17 -0
- data/app/assets/javascripts/Shaders/ViewportQuadVS.glsl +10 -0
- data/app/assets/javascripts/Shaders/ViewportQuadVS.js +14 -0
- data/app/assets/javascripts/Shaders/package.json +6 -0
- data/app/assets/javascripts/ThirdParty/ThirdParty.profile.js +8 -0
- data/app/assets/javascripts/ThirdParty/Tween.js +678 -0
- data/app/assets/javascripts/ThirdParty/Uri.js +277 -0
- data/app/assets/javascripts/ThirdParty/measureText.js +197 -0
- data/app/assets/javascripts/ThirdParty/package.json +6 -0
- data/app/assets/javascripts/ThirdParty/sprintf.js +319 -0
- data/app/assets/javascripts/ThirdParty/when.js +748 -0
- data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.css +175 -0
- data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.html +52 -0
- data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.js +1237 -0
- data/app/assets/javascripts/Widgets/Dojo/CesiumWidget.html +4 -0
- data/app/assets/javascripts/Widgets/Dojo/CesiumWidget.js +349 -0
- data/app/assets/javascripts/Widgets/Dojo/TimelineWidget.css +1 -0
- data/app/assets/javascripts/Widgets/Dojo/TimelineWidget.js +47 -0
- data/app/assets/javascripts/Widgets/Dojo/checkForChromeFrame.js +71 -0
- data/app/assets/javascripts/Widgets/Images/Bing_Logo_51x19_White.png +0 -0
- data/app/assets/javascripts/Widgets/Images/Cesium_Logo_overlay.png +0 -0
- data/app/assets/javascripts/Widgets/Images/TimelineIcons.png +0 -0
- data/app/assets/javascripts/Widgets/Images/ajax-loader.gif +0 -0
- data/app/assets/javascripts/Widgets/Images/animationBar.png +0 -0
- data/app/assets/javascripts/Widgets/Images/viewControlBar.png +0 -0
- data/app/assets/javascripts/Widgets/Timeline.css +113 -0
- data/app/assets/javascripts/Widgets/Timeline.js +629 -0
- data/app/assets/javascripts/Widgets/TimelineHighlightRange.js +51 -0
- data/app/assets/javascripts/Widgets/TimelineTrack.js +54 -0
- data/app/assets/javascripts/Widgets/Widgets.profile.js +8 -0
- data/app/assets/javascripts/Widgets/package.json +6 -0
- data/app/assets/javascripts/Workers/Workers.profile.js +8 -0
- data/app/assets/javascripts/Workers/cesiumWorkerBootstrapper.js +2015 -0
- data/app/assets/javascripts/Workers/createTaskProcessorWorker.js +55 -0
- data/app/assets/javascripts/Workers/createVerticesFromExtent.js +24 -0
- data/app/assets/javascripts/Workers/package.json +6 -0
- data/app/assets/javascripts/copyrightHeader.js +22 -0
- data/app/assets/javascripts/main.js +10 -0
- data/app/assets/stylesheets/cesium.css +4 -0
- data/app/controllers/cesium_controller.rb +4 -0
- data/app/helpers/cesium_helper.rb +2 -0
- data/app/views/cesium/index.html.erb +3 -0
- data/config/routes.rb +3 -0
- data/lib/cesium.rb +4 -0
- data/lib/cesium/engine.rb +4 -0
- data/lib/cesium/version.rb +3 -0
- data/lib/tasks/cesium_tasks.rake +4 -0
- data/test/cesium_test.rb +7 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/adapters/jquery-adapter.js.coffee +4 -0
- data/test/dummy/app/assets/javascripts/app.js.coffee +11 -0
- data/test/dummy/app/assets/javascripts/application.js.coffee +73 -0
- data/test/dummy/app/assets/stylesheets/application.css +12 -0
- data/test/dummy/app/controllers/application_controller.rb +4 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +21 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/requirejs.yml +10 -0
- data/test/dummy/config/routes.rb +3 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/functional/cesium_controller_test.rb +9 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/test_helper.rb +15 -0
- data/test/unit/helpers/cesium_helper_test.rb +4 -0
- metadata +641 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
/*global define*/
|
2
|
+
define(['../Core/Enumeration'], function(Enumeration) {
|
3
|
+
"use strict";
|
4
|
+
|
5
|
+
/**
|
6
|
+
* An enumeration of the types of imagery provided by Bing Maps.
|
7
|
+
*
|
8
|
+
* @exports BingMapsStyle
|
9
|
+
*
|
10
|
+
* @see BingMapsImageryProvider
|
11
|
+
*/
|
12
|
+
var BingMapsStyle = {
|
13
|
+
/**
|
14
|
+
* Aerial imagery.
|
15
|
+
*
|
16
|
+
* @constant
|
17
|
+
* @type {Enumeration}
|
18
|
+
*/
|
19
|
+
AERIAL : new Enumeration(0, 'AERIAL', { imagerySetName : 'Aerial' }),
|
20
|
+
|
21
|
+
/**
|
22
|
+
* Aerial imagery with a road overlay.
|
23
|
+
*
|
24
|
+
* @constant
|
25
|
+
* @type {Enumeration}
|
26
|
+
*/
|
27
|
+
AERIAL_WITH_LABELS : new Enumeration(1, 'AERIAL_WITH_LABELS', { imagerySetName : 'AerialWithLabels' }),
|
28
|
+
|
29
|
+
/**
|
30
|
+
* Roads without additional imagery.
|
31
|
+
*
|
32
|
+
* @constant
|
33
|
+
* @type {Enumeration}
|
34
|
+
*/
|
35
|
+
ROAD : new Enumeration(2, 'ROAD', { imagerySetName : 'Road' }),
|
36
|
+
|
37
|
+
/**
|
38
|
+
* Ordnance Survey imagery
|
39
|
+
*
|
40
|
+
* @constant
|
41
|
+
* @type {Enumeration}
|
42
|
+
*/
|
43
|
+
ORDNANCE_SURVEY : new Enumeration(3, 'ORDNANCE_SURVEY', { imagerySetName : 'OrdnanceSurvey' }),
|
44
|
+
|
45
|
+
/**
|
46
|
+
* Collins Bart imagery.
|
47
|
+
*
|
48
|
+
* @constant
|
49
|
+
* @type {Enumeration}
|
50
|
+
*/
|
51
|
+
COLLINS_BART : new Enumeration(4, 'COLLINS_BART', { imagerySetName : 'CollinsBart' })
|
52
|
+
};
|
53
|
+
|
54
|
+
return BingMapsStyle;
|
55
|
+
});
|
@@ -0,0 +1,358 @@
|
|
1
|
+
/*global define*/
|
2
|
+
define([
|
3
|
+
'../Core/DeveloperError',
|
4
|
+
'../Core/Math',
|
5
|
+
'../Core/Ellipsoid',
|
6
|
+
'../Core/Cartesian3',
|
7
|
+
'../Core/Cartesian4',
|
8
|
+
'../Core/Matrix4',
|
9
|
+
'../Core/Ray',
|
10
|
+
'./CameraController',
|
11
|
+
'./PerspectiveFrustum'
|
12
|
+
], function(
|
13
|
+
DeveloperError,
|
14
|
+
CesiumMath,
|
15
|
+
Ellipsoid,
|
16
|
+
Cartesian3,
|
17
|
+
Cartesian4,
|
18
|
+
Matrix4,
|
19
|
+
Ray,
|
20
|
+
CameraController,
|
21
|
+
PerspectiveFrustum) {
|
22
|
+
"use strict";
|
23
|
+
|
24
|
+
/**
|
25
|
+
* The camera is defined by a position, orientation, and view frustum.
|
26
|
+
* <br /><br />
|
27
|
+
* The orientation forms an orthonormal basis with a view, up and right = view x up unit vectors.
|
28
|
+
* <br /><br />
|
29
|
+
* The viewing frustum is defined by 6 planes.
|
30
|
+
* Each plane is represented by a {Cartesian4} object, where the x, y, and z components
|
31
|
+
* define the unit vector normal to the plane, and the w component is the distance of the
|
32
|
+
* plane from the origin/camera position.
|
33
|
+
*
|
34
|
+
* @alias Camera
|
35
|
+
*
|
36
|
+
* @exception {DeveloperError} canvas is required.
|
37
|
+
*
|
38
|
+
* @constructor
|
39
|
+
*
|
40
|
+
* @example
|
41
|
+
* // Create a camera looking down the negative z-axis, positioned at the origin,
|
42
|
+
* // with a field of view of 60 degrees, and 1:1 aspect ratio.
|
43
|
+
* var camera = new Camera(canvas);
|
44
|
+
* camera.position = new Cartesian3();
|
45
|
+
* camera.direction = Cartesian3.UNIT_Z.negate();
|
46
|
+
* camera.up = Cartesian3.UNIT_Y;
|
47
|
+
* camera.frustum.fovy = CesiumMath.PI_OVER_THREE;
|
48
|
+
* camera.frustum.near = 1.0;
|
49
|
+
* camera.frustum.far = 2.0;
|
50
|
+
*/
|
51
|
+
var Camera = function(canvas) {
|
52
|
+
if (typeof canvas === 'undefined') {
|
53
|
+
throw new DeveloperError('canvas is required.');
|
54
|
+
}
|
55
|
+
|
56
|
+
/**
|
57
|
+
* Modifies the camera's reference frame. The inverse of this transformation is appended to the view matrix.
|
58
|
+
*
|
59
|
+
* @type {Matrix4}
|
60
|
+
*
|
61
|
+
* @see Transforms
|
62
|
+
*/
|
63
|
+
this.transform = Matrix4.IDENTITY.clone();
|
64
|
+
this._transform = this.transform.clone();
|
65
|
+
this._invTransform = Matrix4.IDENTITY.clone();
|
66
|
+
|
67
|
+
var maxRadii = Ellipsoid.WGS84.getMaximumRadius();
|
68
|
+
var position = new Cartesian3(0.0, -2.0, 1.0).normalize().multiplyByScalar(2.0 * maxRadii);
|
69
|
+
|
70
|
+
/**
|
71
|
+
* The position of the camera.
|
72
|
+
*
|
73
|
+
* @type {Cartesian3}
|
74
|
+
*/
|
75
|
+
this.position = position.clone();
|
76
|
+
this._position = position;
|
77
|
+
this._positionWC = position;
|
78
|
+
|
79
|
+
var direction = Cartesian3.ZERO.subtract(position).normalize();
|
80
|
+
|
81
|
+
/**
|
82
|
+
* The view direction of the camera.
|
83
|
+
*
|
84
|
+
* @type {Cartesian3}
|
85
|
+
*/
|
86
|
+
this.direction = direction.clone();
|
87
|
+
this._direction = direction;
|
88
|
+
this._directionWC = direction;
|
89
|
+
|
90
|
+
var right = direction.cross(Cartesian3.UNIT_Z).normalize();
|
91
|
+
var up = right.cross(direction);
|
92
|
+
|
93
|
+
/**
|
94
|
+
* The up direction of the camera.
|
95
|
+
*
|
96
|
+
* @type {Cartesian3}
|
97
|
+
*/
|
98
|
+
this.up = up.clone();
|
99
|
+
this._up = up;
|
100
|
+
this._upWC = up;
|
101
|
+
|
102
|
+
right = direction.cross(up);
|
103
|
+
|
104
|
+
/**
|
105
|
+
* The right direction of the camera.
|
106
|
+
*
|
107
|
+
* @type {Cartesian3}
|
108
|
+
*/
|
109
|
+
this.right = right.clone();
|
110
|
+
this._right = right;
|
111
|
+
this._rightWC = right;
|
112
|
+
|
113
|
+
/**
|
114
|
+
* The region of space in view.
|
115
|
+
*
|
116
|
+
* @type {Frustum}
|
117
|
+
*
|
118
|
+
* @see PerspectiveFrustum
|
119
|
+
* @see PerspectiveOffCenterFrustum
|
120
|
+
* @see OrthographicFrustum
|
121
|
+
*/
|
122
|
+
this.frustum = new PerspectiveFrustum();
|
123
|
+
this.frustum.fovy = CesiumMath.toRadians(60.0);
|
124
|
+
this.frustum.aspectRatio = canvas.clientWidth / canvas.clientHeight;
|
125
|
+
|
126
|
+
/**
|
127
|
+
* Defines camera behavior. The controller can be used to perform common camera manipulations.
|
128
|
+
*
|
129
|
+
* @type {CameraController}
|
130
|
+
*/
|
131
|
+
this.controller = new CameraController(this);
|
132
|
+
|
133
|
+
this._viewMatrix = undefined;
|
134
|
+
this._invViewMatrix = undefined;
|
135
|
+
updateViewMatrix(this);
|
136
|
+
|
137
|
+
this._canvas = canvas;
|
138
|
+
};
|
139
|
+
|
140
|
+
function updateViewMatrix(camera) {
|
141
|
+
var r = camera._right;
|
142
|
+
var u = camera._up;
|
143
|
+
var d = camera._direction;
|
144
|
+
var e = camera._position;
|
145
|
+
|
146
|
+
var viewMatrix = new Matrix4( r.x, r.y, r.z, -r.dot(e),
|
147
|
+
u.x, u.y, u.z, -u.dot(e),
|
148
|
+
-d.x, -d.y, -d.z, d.dot(e),
|
149
|
+
0.0, 0.0, 0.0, 1.0);
|
150
|
+
camera._viewMatrix = viewMatrix.multiply(camera._invTransform);
|
151
|
+
camera._invViewMatrix = camera._viewMatrix.inverseTransformation();
|
152
|
+
}
|
153
|
+
|
154
|
+
function update(camera) {
|
155
|
+
var position = camera._position;
|
156
|
+
var positionChanged = !position.equals(camera.position);
|
157
|
+
if (positionChanged) {
|
158
|
+
position = camera._position = camera.position.clone();
|
159
|
+
}
|
160
|
+
|
161
|
+
var direction = camera._direction;
|
162
|
+
var directionChanged = !direction.equals(camera.direction);
|
163
|
+
if (directionChanged) {
|
164
|
+
direction = camera._direction = camera.direction.clone();
|
165
|
+
}
|
166
|
+
|
167
|
+
var up = camera._up;
|
168
|
+
var upChanged = !up.equals(camera.up);
|
169
|
+
if (upChanged) {
|
170
|
+
up = camera._up = camera.up.clone();
|
171
|
+
}
|
172
|
+
|
173
|
+
var right = camera._right;
|
174
|
+
var rightChanged = !right.equals(camera.right);
|
175
|
+
if (rightChanged) {
|
176
|
+
right = camera._right = camera.right.clone();
|
177
|
+
}
|
178
|
+
|
179
|
+
var transform = camera._transform;
|
180
|
+
var transformChanged = !transform.equals(camera.transform);
|
181
|
+
if (transformChanged) {
|
182
|
+
transform = camera._transform = camera.transform.clone();
|
183
|
+
|
184
|
+
camera._invTransform = camera._transform.inverseTransformation();
|
185
|
+
}
|
186
|
+
|
187
|
+
if (positionChanged || transformChanged) {
|
188
|
+
camera._positionWC = Cartesian3.fromCartesian4(transform.multiplyByPoint(position));
|
189
|
+
}
|
190
|
+
|
191
|
+
if (directionChanged || upChanged || rightChanged) {
|
192
|
+
var det = direction.dot(up.cross(right));
|
193
|
+
if (Math.abs(1.0 - det) > CesiumMath.EPSILON2) {
|
194
|
+
//orthonormalize axes
|
195
|
+
direction = camera._direction = direction.normalize();
|
196
|
+
camera.direction = direction.clone();
|
197
|
+
|
198
|
+
var invUpMag = 1.0 / up.magnitudeSquared();
|
199
|
+
var scalar = up.dot(direction) * invUpMag;
|
200
|
+
var w0 = direction.multiplyByScalar(scalar);
|
201
|
+
up = camera._up = up.subtract(w0).normalize();
|
202
|
+
camera.up = up.clone();
|
203
|
+
|
204
|
+
right = camera._right = direction.cross(up);
|
205
|
+
camera.right = right.clone();
|
206
|
+
}
|
207
|
+
}
|
208
|
+
|
209
|
+
if (directionChanged || transformChanged) {
|
210
|
+
camera._directionWC = Cartesian3.fromCartesian4(transform.multiplyByVector(new Cartesian4(direction.x, direction.y, direction.z, 0.0)));
|
211
|
+
}
|
212
|
+
|
213
|
+
if (upChanged || transformChanged) {
|
214
|
+
camera._upWC = Cartesian3.fromCartesian4(transform.multiplyByVector(new Cartesian4(up.x, up.y, up.z, 0.0)));
|
215
|
+
}
|
216
|
+
|
217
|
+
if (rightChanged || transformChanged) {
|
218
|
+
camera._rightWC = Cartesian3.fromCartesian4(transform.multiplyByVector(new Cartesian4(right.x, right.y, right.z, 0.0)));
|
219
|
+
}
|
220
|
+
|
221
|
+
if (positionChanged || directionChanged || upChanged || rightChanged || transformChanged) {
|
222
|
+
updateViewMatrix(camera);
|
223
|
+
}
|
224
|
+
}
|
225
|
+
|
226
|
+
/**
|
227
|
+
* DOC_TBA
|
228
|
+
*
|
229
|
+
* @memberof Camera
|
230
|
+
*
|
231
|
+
* @return {Matrix4} DOC_TBA
|
232
|
+
*/
|
233
|
+
Camera.prototype.getInverseTransform = function() {
|
234
|
+
update(this);
|
235
|
+
return this._invTransform;
|
236
|
+
};
|
237
|
+
|
238
|
+
/**
|
239
|
+
* Returns the view matrix.
|
240
|
+
*
|
241
|
+
* @memberof Camera
|
242
|
+
*
|
243
|
+
* @return {Matrix4} The view matrix.
|
244
|
+
*
|
245
|
+
* @see UniformState#getView
|
246
|
+
* @see UniformState#setView
|
247
|
+
* @see czm_view
|
248
|
+
*/
|
249
|
+
Camera.prototype.getViewMatrix = function() {
|
250
|
+
update(this);
|
251
|
+
return this._viewMatrix;
|
252
|
+
};
|
253
|
+
|
254
|
+
/**
|
255
|
+
* DOC_TBA
|
256
|
+
* @memberof Camera
|
257
|
+
*/
|
258
|
+
Camera.prototype.getInverseViewMatrix = function() {
|
259
|
+
update(this);
|
260
|
+
return this._invViewMatrix;
|
261
|
+
};
|
262
|
+
|
263
|
+
/**
|
264
|
+
* The position of the camera in world coordinates.
|
265
|
+
*
|
266
|
+
* @type {Cartesian3}
|
267
|
+
*/
|
268
|
+
Camera.prototype.getPositionWC = function() {
|
269
|
+
update(this);
|
270
|
+
return this._positionWC;
|
271
|
+
};
|
272
|
+
|
273
|
+
/**
|
274
|
+
* The view direction of the camera in world coordinates.
|
275
|
+
*
|
276
|
+
* @type {Cartesian3}
|
277
|
+
*/
|
278
|
+
Camera.prototype.getDirectionWC = function() {
|
279
|
+
update(this);
|
280
|
+
return this._directionWC;
|
281
|
+
};
|
282
|
+
|
283
|
+
/**
|
284
|
+
* The up direction of the camera in world coordinates.
|
285
|
+
*
|
286
|
+
* @type {Cartesian3}
|
287
|
+
*/
|
288
|
+
Camera.prototype.getUpWC = function() {
|
289
|
+
update(this);
|
290
|
+
return this._upWC;
|
291
|
+
};
|
292
|
+
|
293
|
+
/**
|
294
|
+
* The right direction of the camera in world coordinates.
|
295
|
+
*
|
296
|
+
* @type {Cartesian3}
|
297
|
+
*/
|
298
|
+
Camera.prototype.getRightWC = function() {
|
299
|
+
update(this);
|
300
|
+
return this._rightWC;
|
301
|
+
};
|
302
|
+
|
303
|
+
/**
|
304
|
+
* Returns a duplicate of a Camera instance.
|
305
|
+
*
|
306
|
+
* @memberof Camera
|
307
|
+
*
|
308
|
+
* @return {Camera} A new copy of the Camera instance.
|
309
|
+
*/
|
310
|
+
Camera.prototype.clone = function() {
|
311
|
+
var camera = new Camera(this._canvas);
|
312
|
+
camera.position = this.position.clone();
|
313
|
+
camera.direction = this.direction.clone();
|
314
|
+
camera.up = this.up.clone();
|
315
|
+
camera.right = this.right.clone();
|
316
|
+
camera.transform = this.transform.clone();
|
317
|
+
camera.frustum = this.frustum.clone();
|
318
|
+
return camera;
|
319
|
+
};
|
320
|
+
|
321
|
+
/**
|
322
|
+
* Transform a vector or point from world coordinates to the camera's reference frame.
|
323
|
+
* @memberof Camera
|
324
|
+
*
|
325
|
+
* @param {Cartesian4} cartesian The vector or point to transform.
|
326
|
+
* @param {Cartesian4} [result] The object onto which to store the result.
|
327
|
+
*
|
328
|
+
* @exception {DeveloperError} cartesian is required.
|
329
|
+
*
|
330
|
+
* @returns {Cartesian4} The transformed vector or point.
|
331
|
+
*/
|
332
|
+
Camera.prototype.worldToCameraCoordinates = function(cartesian, result) {
|
333
|
+
if (typeof cartesian === 'undefined') {
|
334
|
+
throw new DeveloperError('cartesian is required.');
|
335
|
+
}
|
336
|
+
return Matrix4.multiplyByVector(this.getInverseTransform(), cartesian, result);
|
337
|
+
};
|
338
|
+
|
339
|
+
/**
|
340
|
+
* Transform a vector or point from the camera's reference frame to world coordinates.
|
341
|
+
* @memberof Camera
|
342
|
+
*
|
343
|
+
* @param {Cartesian4} vector The vector or point to transform.
|
344
|
+
* @param {Cartesian4} [result] The object onto which to store the result.
|
345
|
+
*
|
346
|
+
* @exception {DeveloperError} cartesian is required.
|
347
|
+
*
|
348
|
+
* @returns {Cartesian4} The transformed vector or point.
|
349
|
+
*/
|
350
|
+
Camera.prototype.cameraToWorldCoordinates = function(cartesian, result) {
|
351
|
+
if (typeof cartesian === 'undefined') {
|
352
|
+
throw new DeveloperError('cartesian is required.');
|
353
|
+
}
|
354
|
+
return Matrix4.multiplyByVector(this.transform, cartesian, result);
|
355
|
+
};
|
356
|
+
|
357
|
+
return Camera;
|
358
|
+
});
|
@@ -0,0 +1,30 @@
|
|
1
|
+
/*global define*/
|
2
|
+
define(['../Core/Enumeration'], function(Enumeration) {
|
3
|
+
"use strict";
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Specifies how to handle mouse events in columbus view mode.
|
7
|
+
*
|
8
|
+
* @exports CameraColumbusViewMode
|
9
|
+
* @see ScreenSpaceCameraController
|
10
|
+
*/
|
11
|
+
var CameraColumbusViewMode = {
|
12
|
+
/**
|
13
|
+
* The camera is free to move about anywhere.
|
14
|
+
*
|
15
|
+
* @constant
|
16
|
+
* @type {Enumeration}
|
17
|
+
*/
|
18
|
+
FREE : new Enumeration(0, 'FREE'),
|
19
|
+
|
20
|
+
/**
|
21
|
+
* The camera is locked looking at a location, but is free to rotate about that single point.
|
22
|
+
*
|
23
|
+
* @constant
|
24
|
+
* @type {Enumeration}
|
25
|
+
*/
|
26
|
+
LOCKED : new Enumeration(1, 'LOCKED')
|
27
|
+
};
|
28
|
+
|
29
|
+
return CameraColumbusViewMode;
|
30
|
+
});
|
@@ -0,0 +1,1258 @@
|
|
1
|
+
/*global define*/
|
2
|
+
define([
|
3
|
+
'../Core/defaultValue',
|
4
|
+
'../Core/Cartesian2',
|
5
|
+
'../Core/Cartesian3',
|
6
|
+
'../Core/Cartesian4',
|
7
|
+
'../Core/Cartographic',
|
8
|
+
'../Core/DeveloperError',
|
9
|
+
'../Core/Ellipsoid',
|
10
|
+
'../Core/GeographicProjection',
|
11
|
+
'../Core/IntersectionTests',
|
12
|
+
'../Core/Math',
|
13
|
+
'../Core/Matrix3',
|
14
|
+
'../Core/Matrix4',
|
15
|
+
'../Core/Quaternion',
|
16
|
+
'../Core/Ray',
|
17
|
+
'./SceneMode',
|
18
|
+
'../ThirdParty/Tween'
|
19
|
+
], function(
|
20
|
+
defaultValue,
|
21
|
+
Cartesian2,
|
22
|
+
Cartesian3,
|
23
|
+
Cartesian4,
|
24
|
+
Cartographic,
|
25
|
+
DeveloperError,
|
26
|
+
Ellipsoid,
|
27
|
+
GeographicProjection,
|
28
|
+
IntersectionTests,
|
29
|
+
CesiumMath,
|
30
|
+
Matrix3,
|
31
|
+
Matrix4,
|
32
|
+
Quaternion,
|
33
|
+
Ray,
|
34
|
+
SceneMode,
|
35
|
+
Tween) {
|
36
|
+
"use strict";
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Provides methods for common camera manipulations.
|
40
|
+
*
|
41
|
+
* @alias CameraController
|
42
|
+
* @constructor
|
43
|
+
*
|
44
|
+
* @exception {DeveloperError} camera is required.
|
45
|
+
*/
|
46
|
+
var CameraController = function(camera) {
|
47
|
+
if (typeof camera === 'undefined') {
|
48
|
+
throw new DeveloperError('camera is required.');
|
49
|
+
}
|
50
|
+
|
51
|
+
this._camera = camera;
|
52
|
+
this._mode = SceneMode.SCENE3D;
|
53
|
+
this._projection = new GeographicProjection();
|
54
|
+
|
55
|
+
/**
|
56
|
+
* The default amount to move the camera when an argument is not
|
57
|
+
* provided to the move methods.
|
58
|
+
* @type {Number}
|
59
|
+
*/
|
60
|
+
this.defaultMoveAmount = 100000.0;
|
61
|
+
/**
|
62
|
+
* The default amount to rotate the camera when an argument is not
|
63
|
+
* provided to the look methods.
|
64
|
+
* @type {Number}
|
65
|
+
*/
|
66
|
+
this.defaultLookAmount = Math.PI / 60.0;
|
67
|
+
/**
|
68
|
+
* The default amount to rotate the camera when an argument is not
|
69
|
+
* provided to the rotate methods.
|
70
|
+
* @type {Number}
|
71
|
+
*/
|
72
|
+
this.defaultRotateAmount = Math.PI / 3600.0;
|
73
|
+
/**
|
74
|
+
* The default amount to move the camera when an argument is not
|
75
|
+
* provided to the zoom methods.
|
76
|
+
* @type {Number}
|
77
|
+
*/
|
78
|
+
this.defaultZoomAmount = 100000.0;
|
79
|
+
/**
|
80
|
+
* If set, the camera will not be able to rotate past this axis in either direction.
|
81
|
+
* @type Cartesian3
|
82
|
+
*/
|
83
|
+
this.constrainedAxis = undefined;
|
84
|
+
/**
|
85
|
+
* The factor multiplied by the the map size used to determine where to clamp the camera position
|
86
|
+
* when translating across the surface. The default is 1.5. Only valid for 2D and Columbus view.
|
87
|
+
* @type Number
|
88
|
+
*/
|
89
|
+
this.maximumTranslateFactor = 1.5;
|
90
|
+
/**
|
91
|
+
* The factor multiplied by the the map size used to determine where to clamp the camera position
|
92
|
+
* when zooming out from the surface. The default is 2.5. Only valid for 2D.
|
93
|
+
* @type Number
|
94
|
+
*/
|
95
|
+
this.maximumZoomFactor = 2.5;
|
96
|
+
|
97
|
+
this._maxCoord = undefined;
|
98
|
+
this._frustum = undefined;
|
99
|
+
};
|
100
|
+
|
101
|
+
/**
|
102
|
+
* @private
|
103
|
+
*/
|
104
|
+
CameraController.prototype.update = function(mode, scene2D) {
|
105
|
+
var updateFrustum = false;
|
106
|
+
if (mode !== this._mode) {
|
107
|
+
this._mode = mode;
|
108
|
+
updateFrustum = this._mode === SceneMode.SCENE2D;
|
109
|
+
}
|
110
|
+
|
111
|
+
var projection = scene2D.projection;
|
112
|
+
if (typeof projection !== 'undefined' && projection !== this._projection) {
|
113
|
+
this._projection = projection;
|
114
|
+
this._maxCoord = projection.project(new Cartographic(Math.PI, CesiumMath.PI_OVER_TWO));
|
115
|
+
}
|
116
|
+
|
117
|
+
if (updateFrustum) {
|
118
|
+
var frustum = this._frustum = this._camera.frustum.clone();
|
119
|
+
if (typeof frustum.left === 'undefined' || typeof frustum.right === 'undefined' ||
|
120
|
+
typeof frustum.top === 'undefined' || typeof frustum.bottom === 'undefined') {
|
121
|
+
throw new DeveloperError('The camera frustum is expected to be orthographic for 2D camera control.');
|
122
|
+
}
|
123
|
+
|
124
|
+
var maxZoomOut = 2.0;
|
125
|
+
var ratio = frustum.top / frustum.right;
|
126
|
+
frustum.right = this._maxCoord.x * maxZoomOut;
|
127
|
+
frustum.left = -frustum.right;
|
128
|
+
frustum.top = ratio * frustum.right;
|
129
|
+
frustum.bottom = -frustum.top;
|
130
|
+
}
|
131
|
+
};
|
132
|
+
|
133
|
+
function clampMove2D(controller, position) {
|
134
|
+
var maxX = controller._maxCoord.x * controller.maximumTranslateFactor;
|
135
|
+
if (position.x > maxX) {
|
136
|
+
position.x = maxX;
|
137
|
+
}
|
138
|
+
if (position.x < -maxX) {
|
139
|
+
position.x = -maxX;
|
140
|
+
}
|
141
|
+
|
142
|
+
var maxY = controller._maxCoord.y * controller.maximumTranslateFactor;
|
143
|
+
if (position.y > maxY) {
|
144
|
+
position.y = maxY;
|
145
|
+
}
|
146
|
+
if (position.y < -maxY) {
|
147
|
+
position.y = -maxY;
|
148
|
+
}
|
149
|
+
}
|
150
|
+
|
151
|
+
var moveScratch = new Cartesian3();
|
152
|
+
/**
|
153
|
+
* Translates the camera's position by <code>amount</code> along <code>direction</code>.
|
154
|
+
*
|
155
|
+
* @memberof CameraController
|
156
|
+
*
|
157
|
+
* @param {Cartesian3} direction The direction to move.
|
158
|
+
* @param {Number} [amount] The amount, in meters, to move. Defaults to <code>defaultMoveAmount</code>.
|
159
|
+
*
|
160
|
+
* @exception {DeveloperError} direction is required.
|
161
|
+
*
|
162
|
+
* @see CameraController#moveBackward
|
163
|
+
* @see CameraController#moveForward
|
164
|
+
* @see CameraController#moveLeft
|
165
|
+
* @see CameraController#moveRight
|
166
|
+
* @see CameraController#moveUp
|
167
|
+
* @see CameraController#moveDown
|
168
|
+
*/
|
169
|
+
CameraController.prototype.move = function(direction, amount) {
|
170
|
+
if (typeof direction === 'undefined') {
|
171
|
+
throw new DeveloperError('direction is required.');
|
172
|
+
}
|
173
|
+
|
174
|
+
var cameraPosition = this._camera.position;
|
175
|
+
Cartesian3.multiplyByScalar(direction, amount, moveScratch);
|
176
|
+
Cartesian3.add(cameraPosition, moveScratch, cameraPosition);
|
177
|
+
|
178
|
+
if (this._mode === SceneMode.SCENE2D) {
|
179
|
+
clampMove2D(this, cameraPosition);
|
180
|
+
}
|
181
|
+
};
|
182
|
+
|
183
|
+
/**
|
184
|
+
* Translates the camera's position by <code>amount</code> along the camera's view vector.
|
185
|
+
*
|
186
|
+
* @memberof CameraController
|
187
|
+
*
|
188
|
+
* @param {Number} [amount] The amount, in meters, to move. Defaults to <code>defaultMoveAmount</code>.
|
189
|
+
*
|
190
|
+
* @see CameraController#moveBackward
|
191
|
+
*/
|
192
|
+
CameraController.prototype.moveForward = function(amount) {
|
193
|
+
amount = defaultValue(amount, this.defaultMoveAmount);
|
194
|
+
this.move(this._camera.direction, amount);
|
195
|
+
};
|
196
|
+
|
197
|
+
/**
|
198
|
+
* Translates the camera's position by <code>amount</code> along the opposite direction
|
199
|
+
* of the camera's view vector.
|
200
|
+
*
|
201
|
+
* @memberof CameraController
|
202
|
+
*
|
203
|
+
* @param {Number} [amount] The amount, in meters, to move. Defaults to <code>defaultMoveAmount</code>.
|
204
|
+
*
|
205
|
+
* @see CameraController#moveForward
|
206
|
+
*/
|
207
|
+
CameraController.prototype.moveBackward = function(amount) {
|
208
|
+
amount = defaultValue(amount, this.defaultMoveAmount);
|
209
|
+
this.move(this._camera.direction, -amount);
|
210
|
+
};
|
211
|
+
|
212
|
+
/**
|
213
|
+
* Translates the camera's position by <code>amount</code> along the camera's up vector.
|
214
|
+
*
|
215
|
+
* @memberof CameraController
|
216
|
+
*
|
217
|
+
* @param {Number} [amount] The amount, in meters, to move. Defaults to <code>defaultMoveAmount</code>.
|
218
|
+
*
|
219
|
+
* @see CameraController#moveDown
|
220
|
+
*/
|
221
|
+
CameraController.prototype.moveUp = function(amount) {
|
222
|
+
amount = defaultValue(amount, this.defaultMoveAmount);
|
223
|
+
this.move(this._camera.up, amount);
|
224
|
+
};
|
225
|
+
|
226
|
+
/**
|
227
|
+
* Translates the camera's position by <code>amount</code> along the opposite direction
|
228
|
+
* of the camera's up vector.
|
229
|
+
*
|
230
|
+
* @memberof CameraController
|
231
|
+
*
|
232
|
+
* @param {Number} [amount] The amount, in meters, to move. Defaults to <code>defaultMoveAmount</code>.
|
233
|
+
*
|
234
|
+
* @see CameraController#moveUp
|
235
|
+
*/
|
236
|
+
CameraController.prototype.moveDown = function(amount) {
|
237
|
+
amount = defaultValue(amount, this.defaultMoveAmount);
|
238
|
+
this.move(this._camera.up, -amount);
|
239
|
+
};
|
240
|
+
|
241
|
+
/**
|
242
|
+
* Translates the camera's position by <code>amount</code> along the camera's right vector.
|
243
|
+
*
|
244
|
+
* @memberof CameraController
|
245
|
+
*
|
246
|
+
* @param {Number} [amount] The amount, in meters, to move. Defaults to <code>defaultMoveAmount</code>.
|
247
|
+
*
|
248
|
+
* @see CameraController#moveLeft
|
249
|
+
*/
|
250
|
+
CameraController.prototype.moveRight = function(amount) {
|
251
|
+
amount = defaultValue(amount, this.defaultMoveAmount);
|
252
|
+
this.move(this._camera.right, amount);
|
253
|
+
};
|
254
|
+
|
255
|
+
/**
|
256
|
+
* Translates the camera's position by <code>amount</code> along the opposite direction
|
257
|
+
* of the camera's right vector.
|
258
|
+
*
|
259
|
+
* @memberof CameraController
|
260
|
+
*
|
261
|
+
* @param {Number} [amount] The amount, in meters, to move. Defaults to <code>defaultMoveAmount</code>.
|
262
|
+
*
|
263
|
+
* @see CameraController#moveRight
|
264
|
+
*/
|
265
|
+
CameraController.prototype.moveLeft = function(amount) {
|
266
|
+
amount = defaultValue(amount, this.defaultMoveAmount);
|
267
|
+
this.move(this._camera.right, -amount);
|
268
|
+
};
|
269
|
+
|
270
|
+
/**
|
271
|
+
* Rotates the camera around its up vector by amount, in radians, in the opposite direction
|
272
|
+
* of its right vector.
|
273
|
+
*
|
274
|
+
* @memberof CameraController
|
275
|
+
*
|
276
|
+
* @param {Number} [amount] The amount, in radians, to rotate by. Defaults to <code>defaultLookAmount</code>.
|
277
|
+
*
|
278
|
+
* @see CameraController#lookRight
|
279
|
+
*/
|
280
|
+
CameraController.prototype.lookLeft = function(amount) {
|
281
|
+
amount = defaultValue(amount, this.defaultLookAmount);
|
282
|
+
this.look(this._camera.up, -amount);
|
283
|
+
};
|
284
|
+
|
285
|
+
/**
|
286
|
+
* Rotates the camera around its up vector by amount, in radians, in the direction
|
287
|
+
* of its right vector.
|
288
|
+
*
|
289
|
+
* @memberof CameraController
|
290
|
+
*
|
291
|
+
* @param {Number} [amount] The amount, in radians, to rotate by. Defaults to <code>defaultLookAmount</code>.
|
292
|
+
*
|
293
|
+
* @see CameraController#lookLeft
|
294
|
+
*/
|
295
|
+
CameraController.prototype.lookRight = function(amount) {
|
296
|
+
amount = defaultValue(amount, this.defaultLookAmount);
|
297
|
+
this.look(this._camera.up, amount);
|
298
|
+
};
|
299
|
+
|
300
|
+
/**
|
301
|
+
* Rotates the camera around its right vector by amount, in radians, in the direction
|
302
|
+
* of its up vector.
|
303
|
+
*
|
304
|
+
* @memberof CameraController
|
305
|
+
*
|
306
|
+
* @param {Number} [amount] The amount, in radians, to rotate by. Defaults to <code>defaultLookAmount</code>.
|
307
|
+
*
|
308
|
+
* @see CameraController#lookDown
|
309
|
+
*/
|
310
|
+
CameraController.prototype.lookUp = function(amount) {
|
311
|
+
amount = defaultValue(amount, this.defaultLookAmount);
|
312
|
+
this.look(this._camera.right, -amount);
|
313
|
+
};
|
314
|
+
|
315
|
+
/**
|
316
|
+
* Rotates the camera around its right vector by amount, in radians, in the opposite direction
|
317
|
+
* of its up vector.
|
318
|
+
*
|
319
|
+
* @memberof CameraController
|
320
|
+
*
|
321
|
+
* @param {Number} [amount] The amount, in radians, to rotate by. Defaults to <code>defaultLookAmount</code>.
|
322
|
+
*
|
323
|
+
* @see CameraController#lookUp
|
324
|
+
*/
|
325
|
+
CameraController.prototype.lookDown = function(amount) {
|
326
|
+
amount = defaultValue(amount, this.defaultLookAmount);
|
327
|
+
this.look(this._camera.right, amount);
|
328
|
+
};
|
329
|
+
|
330
|
+
var lookScratchQuaternion = new Quaternion();
|
331
|
+
var lookScratchMatrix = new Matrix3();
|
332
|
+
/**
|
333
|
+
* Rotate each of the camera's orientation vectors around <code>axis</code> by <code>angle</code>
|
334
|
+
*
|
335
|
+
* @memberof CameraController
|
336
|
+
*
|
337
|
+
* @param {Cartesian3} axis The axis to rotate around.
|
338
|
+
* @param {Number} [angle] The angle, in radians, to rotate by. Defaults to <code>defaultLookAmount</code>.
|
339
|
+
*
|
340
|
+
* @exception {DeveloperError} axis is required.
|
341
|
+
*
|
342
|
+
* @see CameraController#lookUp
|
343
|
+
* @see CameraController#lookDown
|
344
|
+
* @see CameraController#lookLeft
|
345
|
+
* @see CameraController#lookRight
|
346
|
+
*/
|
347
|
+
CameraController.prototype.look = function(axis, angle) {
|
348
|
+
if (typeof axis === 'undefined') {
|
349
|
+
throw new DeveloperError('axis is required.');
|
350
|
+
}
|
351
|
+
|
352
|
+
var turnAngle = defaultValue(angle, this.defaultLookAmount);
|
353
|
+
var rotation = Matrix3.fromQuaternion(Quaternion.fromAxisAngle(axis, turnAngle, lookScratchQuaternion), lookScratchMatrix);
|
354
|
+
|
355
|
+
var direction = this._camera.direction;
|
356
|
+
var up = this._camera.up;
|
357
|
+
var right = this._camera.right;
|
358
|
+
|
359
|
+
Matrix3.multiplyByVector(rotation, direction, direction);
|
360
|
+
Matrix3.multiplyByVector(rotation, up, up);
|
361
|
+
Matrix3.multiplyByVector(rotation, right, right);
|
362
|
+
};
|
363
|
+
|
364
|
+
/**
|
365
|
+
* Rotate the camera counter-clockwise around its direction vector by amount, in radians.
|
366
|
+
*
|
367
|
+
* @memberof CameraController
|
368
|
+
*
|
369
|
+
* @param {Number} [amount] The amount, in radians, to rotate by. Defaults to <code>defaultLookAmount</code>.
|
370
|
+
*
|
371
|
+
* @see CameraController#twistRight
|
372
|
+
*/
|
373
|
+
CameraController.prototype.twistLeft = function(amount) {
|
374
|
+
amount = defaultValue(amount, this.defaultLookAmount);
|
375
|
+
this.look(this._camera.direction, amount);
|
376
|
+
};
|
377
|
+
|
378
|
+
/**
|
379
|
+
* Rotate the camera clockwise around its direction vector by amount, in radians.
|
380
|
+
*
|
381
|
+
* @memberof CameraController
|
382
|
+
*
|
383
|
+
* @param {Number} [amount] The amount, in radians, to rotate by. Defaults to <code>defaultLookAmount</code>.
|
384
|
+
*
|
385
|
+
* @see CameraController#twistLeft
|
386
|
+
*/
|
387
|
+
CameraController.prototype.twistRight = function(amount) {
|
388
|
+
amount = defaultValue(amount, this.defaultLookAmount);
|
389
|
+
this.look(this._camera.direction, -amount);
|
390
|
+
};
|
391
|
+
|
392
|
+
var appendTransformPosition = Cartesian4.UNIT_W.clone();
|
393
|
+
var appendTransformUp = Cartesian4.ZERO.clone();
|
394
|
+
var appendTransformRight = Cartesian4.ZERO.clone();
|
395
|
+
var appendTransformDirection = Cartesian4.ZERO.clone();
|
396
|
+
function appendTransform(controller, transform) {
|
397
|
+
var camera = controller._camera;
|
398
|
+
var oldTransform;
|
399
|
+
if (typeof transform !== 'undefined') {
|
400
|
+
var position = Cartesian3.clone(camera.getPositionWC(), appendTransformPosition);
|
401
|
+
var up = Cartesian3.clone(camera.getUpWC(), appendTransformUp);
|
402
|
+
var right = Cartesian3.clone(camera.getRightWC(), appendTransformRight);
|
403
|
+
var direction = Cartesian3.clone(camera.getDirectionWC(), appendTransformDirection);
|
404
|
+
|
405
|
+
oldTransform = camera.transform;
|
406
|
+
camera.transform = transform.multiply(oldTransform);
|
407
|
+
|
408
|
+
var invTransform = camera.getInverseTransform();
|
409
|
+
Cartesian3.clone(Matrix4.multiplyByVector(invTransform, position, position), camera.position);
|
410
|
+
Cartesian3.clone(Matrix4.multiplyByVector(invTransform, up, up), camera.up);
|
411
|
+
Cartesian3.clone(Matrix4.multiplyByVector(invTransform, right, right), camera.right);
|
412
|
+
Cartesian3.clone(Matrix4.multiplyByVector(invTransform, direction, direction), camera.direction);
|
413
|
+
}
|
414
|
+
return oldTransform;
|
415
|
+
}
|
416
|
+
|
417
|
+
var revertTransformPosition = Cartesian4.UNIT_W.clone();
|
418
|
+
var revertTransformUp = Cartesian4.ZERO.clone();
|
419
|
+
var revertTransformRight = Cartesian4.ZERO.clone();
|
420
|
+
var revertTransformDirection = Cartesian4.ZERO.clone();
|
421
|
+
function revertTransform(controller, transform) {
|
422
|
+
if (typeof transform !== 'undefined') {
|
423
|
+
var camera = controller._camera;
|
424
|
+
var position = Cartesian3.clone(camera.getPositionWC(), revertTransformPosition);
|
425
|
+
var up = Cartesian3.clone(camera.getUpWC(), revertTransformUp);
|
426
|
+
var right = Cartesian3.clone(camera.getRightWC(), revertTransformRight);
|
427
|
+
var direction = Cartesian3.clone(camera.getDirectionWC(), revertTransformDirection);
|
428
|
+
|
429
|
+
camera.transform = transform;
|
430
|
+
transform = camera.getInverseTransform();
|
431
|
+
|
432
|
+
position = Cartesian3.clone(Matrix4.multiplyByVector(transform, position, position), camera.position);
|
433
|
+
up = Cartesian3.clone(Matrix4.multiplyByVector(transform, up, up), camera.up);
|
434
|
+
right = Cartesian3.clone(Matrix4.multiplyByVector(transform, right, right), camera.right);
|
435
|
+
direction = Cartesian3.clone(Matrix4.multiplyByVector(transform, direction, direction), camera.direction);
|
436
|
+
}
|
437
|
+
}
|
438
|
+
|
439
|
+
var rotateScratchQuaternion = new Quaternion();
|
440
|
+
var rotateScratchMatrix = new Matrix3();
|
441
|
+
/**
|
442
|
+
* Rotates the camera around <code>axis</code> by <code>angle</code>. The distance
|
443
|
+
* of the camera's position to the center of the camera's reference frame remains the same.
|
444
|
+
*
|
445
|
+
* @memberof CameraController
|
446
|
+
*
|
447
|
+
* @param {Cartesian3} axis The axis to rotate around given in world coordinates.
|
448
|
+
* @param {Number} [angle] The angle, in radians, to rotate by. Defaults to <code>defaultRotateAmount</code>.
|
449
|
+
* @param {Matrix4} [transform] A transform to append to the camera transform before the rotation. Does not alter the camera's transform.
|
450
|
+
*
|
451
|
+
* @exception {DeveloperError} axis is required.
|
452
|
+
*
|
453
|
+
* @see CameraController#rotateUp
|
454
|
+
* @see CameraController#rotateDown
|
455
|
+
* @see CameraController#rotateLeft
|
456
|
+
* @see CameraController#rotateRight
|
457
|
+
*
|
458
|
+
* @example
|
459
|
+
* // Rotate about a point on the earth.
|
460
|
+
* var center = ellipsoid.cartographicToCartesian(cartographic);
|
461
|
+
* var transform = Matrix4.fromTranslation(center);
|
462
|
+
* controller.rotate(axis, angle, transform);
|
463
|
+
*/
|
464
|
+
CameraController.prototype.rotate = function(axis, angle, transform) {
|
465
|
+
if (typeof axis === 'undefined') {
|
466
|
+
throw new DeveloperError('axis is required.');
|
467
|
+
}
|
468
|
+
|
469
|
+
var camera = this._camera;
|
470
|
+
|
471
|
+
var turnAngle = defaultValue(angle, this.defaultRotateAmount);
|
472
|
+
var rotation = Matrix3.fromQuaternion(Quaternion.fromAxisAngle(axis, turnAngle, rotateScratchQuaternion), rotateScratchMatrix);
|
473
|
+
|
474
|
+
var oldTransform = appendTransform(this, transform);
|
475
|
+
Matrix3.multiplyByVector(rotation, camera.position, camera.position);
|
476
|
+
Matrix3.multiplyByVector(rotation, camera.direction, camera.direction);
|
477
|
+
Matrix3.multiplyByVector(rotation, camera.up, camera.up);
|
478
|
+
Cartesian3.cross(camera.direction, camera.up, camera.right);
|
479
|
+
Cartesian3.cross(camera.right, camera.direction, camera.up);
|
480
|
+
revertTransform(this, oldTransform);
|
481
|
+
};
|
482
|
+
|
483
|
+
/**
|
484
|
+
* Rotates the camera around the center of the camera's reference frame by angle downwards.
|
485
|
+
*
|
486
|
+
* @memberof CameraController
|
487
|
+
*
|
488
|
+
* @param {Number} [angle] The angle, in radians, to rotate by. Defaults to <code>defaultRotateAmount</code>.
|
489
|
+
* @param {Matrix4} [transform] A transform to append to the camera transform before the rotation. Does not alter the camera's transform.
|
490
|
+
*
|
491
|
+
* @see CameraController#rotateUp
|
492
|
+
* @see CameraController#rotate
|
493
|
+
*/
|
494
|
+
CameraController.prototype.rotateDown = function(angle, transform) {
|
495
|
+
angle = defaultValue(angle, this.defaultRotateAmount);
|
496
|
+
rotateVertical(this, angle, transform);
|
497
|
+
};
|
498
|
+
|
499
|
+
/**
|
500
|
+
* Rotates the camera around the center of the camera's reference frame by angle upwards.
|
501
|
+
*
|
502
|
+
* @memberof CameraController
|
503
|
+
*
|
504
|
+
* @param {Number} [angle] The angle, in radians, to rotate by. Defaults to <code>defaultRotateAmount</code>.
|
505
|
+
* @param {Matrix4} [transform] A transform to append to the camera transform before the rotation. Does not alter the camera's transform.
|
506
|
+
*
|
507
|
+
* @see CameraController#rotateDown
|
508
|
+
* @see CameraController#rotate
|
509
|
+
*/
|
510
|
+
CameraController.prototype.rotateUp = function(angle, transform) {
|
511
|
+
angle = defaultValue(angle, this.defaultRotateAmount);
|
512
|
+
rotateVertical(this, -angle, transform);
|
513
|
+
};
|
514
|
+
|
515
|
+
var rotateVertScratchP = new Cartesian3();
|
516
|
+
var rotateVertScratchA = new Cartesian3();
|
517
|
+
var rotateVertScratchTan = new Cartesian3();
|
518
|
+
function rotateVertical(controller, angle, transform) {
|
519
|
+
var camera = controller._camera;
|
520
|
+
var oldTransform = appendTransform(controller, transform);
|
521
|
+
|
522
|
+
var position = camera.position;
|
523
|
+
var p = Cartesian3.normalize(position, rotateVertScratchP);
|
524
|
+
if (typeof controller.constrainedAxis !== 'undefined') {
|
525
|
+
var northParallel = p.equalsEpsilon(controller.constrainedAxis, CesiumMath.EPSILON2);
|
526
|
+
var southParallel = p.equalsEpsilon(controller.constrainedAxis.negate(), CesiumMath.EPSILON2);
|
527
|
+
if ((!northParallel && !southParallel)) {
|
528
|
+
var constrainedAxis = Cartesian3.normalize(controller.constrainedAxis, rotateVertScratchA);
|
529
|
+
|
530
|
+
var dot = p.dot(constrainedAxis);
|
531
|
+
var angleToAxis = Math.acos(dot);
|
532
|
+
if (angle > 0 && angle > angleToAxis) {
|
533
|
+
angle = angleToAxis;
|
534
|
+
}
|
535
|
+
|
536
|
+
dot = p.dot(constrainedAxis.negate());
|
537
|
+
angleToAxis = Math.acos(dot);
|
538
|
+
if (angle < 0 && -angle > angleToAxis) {
|
539
|
+
angle = -angleToAxis;
|
540
|
+
}
|
541
|
+
|
542
|
+
var tangent = Cartesian3.cross(constrainedAxis, p, rotateVertScratchTan);
|
543
|
+
controller.rotate(tangent, angle);
|
544
|
+
} else if ((northParallel && angle < 0) || (southParallel && angle > 0)) {
|
545
|
+
controller.rotate(camera.right, angle);
|
546
|
+
}
|
547
|
+
} else {
|
548
|
+
controller.rotate(camera.right, angle);
|
549
|
+
}
|
550
|
+
|
551
|
+
revertTransform(controller, oldTransform);
|
552
|
+
}
|
553
|
+
|
554
|
+
/**
|
555
|
+
* Rotates the camera around the center of the camera's reference frame by angle to the right.
|
556
|
+
*
|
557
|
+
* @memberof CameraController
|
558
|
+
*
|
559
|
+
* @param {Number} [angle] The angle, in radians, to rotate by. Defaults to <code>defaultRotateAmount</code>.
|
560
|
+
* @param {Matrix4} [transform] A transform to append to the camera transform before the rotation. Does not alter the camera's transform.
|
561
|
+
*
|
562
|
+
* @see CameraController#rotateLeft
|
563
|
+
* @see CameraController#rotate
|
564
|
+
*/
|
565
|
+
CameraController.prototype.rotateRight = function(angle, transform) {
|
566
|
+
angle = defaultValue(angle, this.defaultRotateAmount);
|
567
|
+
rotateHorizontal(this, -angle, transform);
|
568
|
+
};
|
569
|
+
|
570
|
+
/**
|
571
|
+
* Rotates the camera around the center of the camera's reference frame by angle to the left.
|
572
|
+
*
|
573
|
+
* @memberof CameraController
|
574
|
+
*
|
575
|
+
* @param {Number} [angle] The angle, in radians, to rotate by. Defaults to <code>defaultRotateAmount</code>.
|
576
|
+
* @param {Matrix4} [transform] A transform to append to the camera transform before the rotation. Does not alter the camera's transform.
|
577
|
+
*
|
578
|
+
* @see CameraController#rotateRight
|
579
|
+
* @see CameraController#rotate
|
580
|
+
*/
|
581
|
+
CameraController.prototype.rotateLeft = function(angle, transform) {
|
582
|
+
angle = defaultValue(angle, this.defaultRotateAmount);
|
583
|
+
rotateHorizontal(this, angle, transform);
|
584
|
+
};
|
585
|
+
|
586
|
+
function rotateHorizontal(controller, angle, transform) {
|
587
|
+
if (typeof controller.constrainedAxis !== 'undefined') {
|
588
|
+
controller.rotate(controller.constrainedAxis, angle, transform);
|
589
|
+
} else {
|
590
|
+
controller.rotate(controller._camera.up, angle, transform);
|
591
|
+
}
|
592
|
+
}
|
593
|
+
|
594
|
+
function zoom2D(controller, amount) {
|
595
|
+
var frustum = controller._camera.frustum;
|
596
|
+
|
597
|
+
if (typeof frustum.left === 'undefined' || typeof frustum.right === 'undefined' ||
|
598
|
+
typeof frustum.top === 'undefined' || typeof frustum.bottom === 'undefined') {
|
599
|
+
throw new DeveloperError('The camera frustum is expected to be orthographic for 2D camera control.');
|
600
|
+
}
|
601
|
+
|
602
|
+
amount = amount * 0.5;
|
603
|
+
var newRight = frustum.right - amount;
|
604
|
+
var newLeft = frustum.left + amount;
|
605
|
+
|
606
|
+
var maxRight = controller._maxCoord.x * controller.maximumZoomFactor;
|
607
|
+
if (newRight > maxRight) {
|
608
|
+
newRight = maxRight;
|
609
|
+
newLeft = -maxRight;
|
610
|
+
}
|
611
|
+
|
612
|
+
var ratio = frustum.top / frustum.right;
|
613
|
+
frustum.right = newRight;
|
614
|
+
frustum.left = newLeft;
|
615
|
+
frustum.top = frustum.right * ratio;
|
616
|
+
frustum.bottom = -frustum.top;
|
617
|
+
}
|
618
|
+
|
619
|
+
function zoom3D(controller, amount) {
|
620
|
+
var camera = controller._camera;
|
621
|
+
controller.move(camera.direction, amount);
|
622
|
+
}
|
623
|
+
|
624
|
+
/**
|
625
|
+
* Zooms <code>amount</code> along the camera's view vector.
|
626
|
+
*
|
627
|
+
* @memberof CameraController
|
628
|
+
*
|
629
|
+
* @param {Number} [amount] The amount to move. Defaults to <code>defaultZoomAmount</code>.
|
630
|
+
*
|
631
|
+
* @see CameraController#zoomOut
|
632
|
+
*/
|
633
|
+
CameraController.prototype.zoomIn = function(amount) {
|
634
|
+
amount = defaultValue(amount, this.defaultZoomAmount);
|
635
|
+
if (this._mode === SceneMode.SCENE2D) {
|
636
|
+
zoom2D(this, amount);
|
637
|
+
} else {
|
638
|
+
zoom3D(this, amount);
|
639
|
+
}
|
640
|
+
};
|
641
|
+
|
642
|
+
/**
|
643
|
+
* Zooms <code>amount</code> along the opposite direction of
|
644
|
+
* the camera's view vector.
|
645
|
+
*
|
646
|
+
* @memberof CameraController
|
647
|
+
*
|
648
|
+
* @param {Number} [amount] The amount to move. Defaults to <code>defaultZoomAmount</code>.
|
649
|
+
*
|
650
|
+
* @see CameraController#zoomIn
|
651
|
+
*/
|
652
|
+
CameraController.prototype.zoomOut = function(amount) {
|
653
|
+
amount = defaultValue(amount, this.defaultZoomAmount);
|
654
|
+
if (this._mode === SceneMode.SCENE2D) {
|
655
|
+
zoom2D(this, -amount);
|
656
|
+
} else {
|
657
|
+
zoom3D(this, -amount);
|
658
|
+
}
|
659
|
+
};
|
660
|
+
|
661
|
+
/**
|
662
|
+
* Gets the magnitude of the camera position. In 3D, this is the vector magnitude. In 2D and
|
663
|
+
* Columbus view, this is the distance to the map.
|
664
|
+
* @memberof CameraController
|
665
|
+
* @returns {Number} The magnitude of the position.
|
666
|
+
*/
|
667
|
+
CameraController.prototype.getMagnitude = function() {
|
668
|
+
var camera = this._camera;
|
669
|
+
if (this._mode === SceneMode.SCENE3D) {
|
670
|
+
return camera.position.magnitude();
|
671
|
+
} else if (this._mode === SceneMode.COLUMBUS_VIEW) {
|
672
|
+
return Math.abs(camera.position.z);
|
673
|
+
} else if (this._mode === SceneMode.SCENE2D) {
|
674
|
+
return Math.max(camera.frustum.right - camera.frustum.left, camera.frustum.top - camera.frustum.bottom);
|
675
|
+
}
|
676
|
+
};
|
677
|
+
|
678
|
+
function setPositionCartographic2D(controller, cartographic) {
|
679
|
+
var camera = controller._camera;
|
680
|
+
var newLeft = -cartographic.height * 0.5;
|
681
|
+
var newRight = -newLeft;
|
682
|
+
|
683
|
+
var frustum = camera.frustum;
|
684
|
+
if (newRight > newLeft) {
|
685
|
+
var ratio = frustum.top / frustum.right;
|
686
|
+
frustum.right = newRight;
|
687
|
+
frustum.left = newLeft;
|
688
|
+
frustum.top = frustum.right * ratio;
|
689
|
+
frustum.bottom = -frustum.top;
|
690
|
+
}
|
691
|
+
|
692
|
+
//We use Cartesian2 instead of 3 here because Z must be constant in 2D mode.
|
693
|
+
Cartesian2.clone(controller._projection.project(cartographic), camera.position);
|
694
|
+
Cartesian3.negate(Cartesian3.UNIT_Z, camera.direction);
|
695
|
+
Cartesian3.clone(Cartesian3.UNIT_Y, camera.up);
|
696
|
+
Cartesian3.clone(Cartesian3.UNIT_X, camera.right);
|
697
|
+
}
|
698
|
+
|
699
|
+
function setPositionCartographicCV(controller, cartographic) {
|
700
|
+
var camera = controller._camera;
|
701
|
+
var projection = controller._projection;
|
702
|
+
camera.position = projection.project(cartographic);
|
703
|
+
Cartesian3.negate(Cartesian3.UNIT_Z, camera.direction);
|
704
|
+
Cartesian3.clone(Cartesian3.UNIT_Y, camera.up);
|
705
|
+
Cartesian3.clone(Cartesian3.UNIT_X, camera.right);
|
706
|
+
}
|
707
|
+
|
708
|
+
function setPositionCartographic3D(controller, cartographic) {
|
709
|
+
var camera = controller._camera;
|
710
|
+
var ellipsoid = controller._projection.getEllipsoid();
|
711
|
+
|
712
|
+
ellipsoid.cartographicToCartesian(cartographic, camera.position);
|
713
|
+
Cartesian3.negate(camera.position, camera.direction);
|
714
|
+
Cartesian3.normalize(camera.direction, camera.direction);
|
715
|
+
Cartesian3.cross(camera.direction, Cartesian3.UNIT_Z, camera.right);
|
716
|
+
Cartesian3.cross(camera.right, camera.direction, camera.up);
|
717
|
+
Cartesian3.cross(camera.direction, camera.up, camera.right);
|
718
|
+
}
|
719
|
+
|
720
|
+
/**
|
721
|
+
* Moves the camera to the provided cartographic position.
|
722
|
+
* @memberof CameraController
|
723
|
+
*
|
724
|
+
* @param {Cartographic} cartographic The new camera position.
|
725
|
+
*
|
726
|
+
* @exception {DeveloperError} cartographic is required.
|
727
|
+
*/
|
728
|
+
CameraController.prototype.setPositionCartographic = function(cartographic) {
|
729
|
+
if (typeof cartographic === 'undefined') {
|
730
|
+
throw new DeveloperError('cartographic is required.');
|
731
|
+
}
|
732
|
+
|
733
|
+
if (this._mode === SceneMode.SCENE2D) {
|
734
|
+
setPositionCartographic2D(this, cartographic);
|
735
|
+
} else if (this._mode === SceneMode.COLUMBUS_VIEW) {
|
736
|
+
setPositionCartographicCV(this, cartographic);
|
737
|
+
} else if (this._mode === SceneMode.SCENE3D) {
|
738
|
+
setPositionCartographic3D(this, cartographic);
|
739
|
+
}
|
740
|
+
};
|
741
|
+
|
742
|
+
/**
|
743
|
+
* Sets the camera position and orientation with an eye position, target, and up vector.
|
744
|
+
* This method is not supported in 2D mode because there is only one direction to look.
|
745
|
+
*
|
746
|
+
* @memberof CameraController
|
747
|
+
*
|
748
|
+
* @param {Cartesian3} eye The position of the camera.
|
749
|
+
* @param {Cartesian3} target The position to look at.
|
750
|
+
* @param {Cartesian3} up The up vector.
|
751
|
+
*
|
752
|
+
* @exception {DeveloperError} eye is required.
|
753
|
+
* @exception {DeveloperError} target is required.
|
754
|
+
* @exception {DeveloperError} up is required.
|
755
|
+
* @exception {DeveloperError} lookAt is not supported in 2D mode because there is only one direction to look.
|
756
|
+
* @exception {DeveloperError} lookAt is not supported while morphing.
|
757
|
+
*/
|
758
|
+
CameraController.prototype.lookAt = function(eye, target, up) {
|
759
|
+
if (typeof eye === 'undefined') {
|
760
|
+
throw new DeveloperError('eye is required');
|
761
|
+
}
|
762
|
+
if (typeof target === 'undefined') {
|
763
|
+
throw new DeveloperError('target is required');
|
764
|
+
}
|
765
|
+
if (typeof up === 'undefined') {
|
766
|
+
throw new DeveloperError('up is required');
|
767
|
+
}
|
768
|
+
if (this._mode === SceneMode.SCENE2D) {
|
769
|
+
throw new DeveloperError('lookAt is not supported in 2D mode because there is only one direction to look.');
|
770
|
+
}
|
771
|
+
if (this._mode === SceneMode.MORPHING) {
|
772
|
+
throw new DeveloperError('lookAt is not supported while morphing.');
|
773
|
+
}
|
774
|
+
|
775
|
+
var camera = this._camera;
|
776
|
+
camera.position = Cartesian3.clone(eye, camera.position);
|
777
|
+
camera.direction = Cartesian3.subtract(target, eye, camera.direction).normalize(camera.direction);
|
778
|
+
camera.right = Cartesian3.cross(camera.direction, up, camera.right).normalize(camera.right);
|
779
|
+
camera.up = Cartesian3.cross(camera.right, camera.direction, camera.up);
|
780
|
+
};
|
781
|
+
|
782
|
+
var viewExtent3DCartographic = new Cartographic();
|
783
|
+
var viewExtent3DNorthEast = new Cartesian3();
|
784
|
+
var viewExtent3DSouthWest = new Cartesian3();
|
785
|
+
var viewExtent3DNorthWest = new Cartesian3();
|
786
|
+
var viewExtent3DSouthEast = new Cartesian3();
|
787
|
+
var viewExtent3DCenter = new Cartesian3();
|
788
|
+
function viewExtent3D(camera, extent, ellipsoid) {
|
789
|
+
var north = extent.north;
|
790
|
+
var south = extent.south;
|
791
|
+
var east = extent.east;
|
792
|
+
var west = extent.west;
|
793
|
+
|
794
|
+
// If we go across the International Date Line
|
795
|
+
if (west > east) {
|
796
|
+
east += CesiumMath.TWO_PI;
|
797
|
+
}
|
798
|
+
|
799
|
+
var cart = viewExtent3DCartographic;
|
800
|
+
cart.longitude = east;
|
801
|
+
cart.latitude = north;
|
802
|
+
var northEast = ellipsoid.cartographicToCartesian(cart, viewExtent3DNorthEast);
|
803
|
+
cart.latitude = south;
|
804
|
+
var southEast = ellipsoid.cartographicToCartesian(cart, viewExtent3DSouthEast);
|
805
|
+
cart.longitude = west;
|
806
|
+
var southWest = ellipsoid.cartographicToCartesian(cart, viewExtent3DSouthWest);
|
807
|
+
cart.latitude = north;
|
808
|
+
var northWest = ellipsoid.cartographicToCartesian(cart, viewExtent3DNorthWest);
|
809
|
+
|
810
|
+
var center = Cartesian3.subtract(northEast, southWest, viewExtent3DCenter);
|
811
|
+
Cartesian3.multiplyByScalar(center, 0.5, center);
|
812
|
+
Cartesian3.add(southWest, center, center);
|
813
|
+
|
814
|
+
Cartesian3.subtract(northWest, center, northWest);
|
815
|
+
Cartesian3.subtract(southEast, center, southEast);
|
816
|
+
Cartesian3.subtract(northEast, center, northEast);
|
817
|
+
Cartesian3.subtract(southWest, center, southWest);
|
818
|
+
|
819
|
+
var direction = ellipsoid.geodeticSurfaceNormal(center, camera.direction);
|
820
|
+
Cartesian3.negate(direction, direction);
|
821
|
+
Cartesian3.normalize(direction, direction);
|
822
|
+
var right = Cartesian3.cross(direction, Cartesian3.UNIT_Z, camera.right);
|
823
|
+
Cartesian3.normalize(right, right);
|
824
|
+
var up = Cartesian3.cross(right, direction, camera.up);
|
825
|
+
|
826
|
+
var height = Math.max(Math.abs(up.dot(northWest)), Math.abs(up.dot(southEast)), Math.abs(up.dot(northEast)), Math.abs(up.dot(southWest)));
|
827
|
+
var width = Math.max(Math.abs(right.dot(northWest)), Math.abs(right.dot(southEast)), Math.abs(right.dot(northEast)), Math.abs(right.dot(southWest)));
|
828
|
+
|
829
|
+
var tanPhi = Math.tan(camera.frustum.fovy * 0.5);
|
830
|
+
var tanTheta = camera.frustum.aspectRatio * tanPhi;
|
831
|
+
var d = Math.max(width / tanTheta, height / tanPhi);
|
832
|
+
|
833
|
+
var scalar = center.magnitude() + d;
|
834
|
+
Cartesian3.normalize(center, center);
|
835
|
+
Cartesian3.multiplyByScalar(center, scalar, camera.position);
|
836
|
+
}
|
837
|
+
|
838
|
+
var viewExtentCVCartographic = new Cartographic();
|
839
|
+
var viewExtentCVNorthEast = Cartesian4.UNIT_W.clone();
|
840
|
+
var viewExtentCVSouthWest = Cartesian4.UNIT_W.clone();
|
841
|
+
var viewExtentCVTransform = new Matrix4();
|
842
|
+
function viewExtentColumbusView(camera, extent, projection) {
|
843
|
+
var north = extent.north;
|
844
|
+
var south = extent.south;
|
845
|
+
var east = extent.east;
|
846
|
+
var west = extent.west;
|
847
|
+
|
848
|
+
var transform = Matrix4.clone(camera.transform, viewExtentCVTransform);
|
849
|
+
transform.setColumn(3, Cartesian4.UNIT_W);
|
850
|
+
var invTransform = camera.getInverseTransform();
|
851
|
+
|
852
|
+
var cart = viewExtentCVCartographic;
|
853
|
+
cart.longitude = east;
|
854
|
+
cart.latitude = north;
|
855
|
+
var position = projection.project(cart);
|
856
|
+
var northEast = Cartesian3.clone(position, viewExtentCVNorthEast);
|
857
|
+
Matrix4.multiplyByVector(transform, northEast, northEast);
|
858
|
+
Matrix4.multiplyByVector(invTransform, northEast, northEast);
|
859
|
+
|
860
|
+
cart.longitude = west;
|
861
|
+
cart.latitude = south;
|
862
|
+
position = projection.project(cart);
|
863
|
+
var southWest = Cartesian3.clone(position, viewExtentCVSouthWest);
|
864
|
+
Matrix4.multiplyByVector(transform, southWest, southWest);
|
865
|
+
Matrix4.multiplyByVector(invTransform, southWest, southWest);
|
866
|
+
|
867
|
+
var tanPhi = Math.tan(camera.frustum.fovy * 0.5);
|
868
|
+
var tanTheta = camera.frustum.aspectRatio * tanPhi;
|
869
|
+
|
870
|
+
position = camera.position;
|
871
|
+
position.x = (northEast.x - southWest.x) * 0.5 + southWest.x;
|
872
|
+
position.y = (northEast.y - southWest.y) * 0.5 + southWest.y;
|
873
|
+
position.z = Math.max((northEast.x - southWest.x) / tanTheta, (northEast.y - southWest.y) / tanPhi) * 0.5;
|
874
|
+
|
875
|
+
var direction = Cartesian3.clone(Cartesian3.UNIT_Z, camera.direction);
|
876
|
+
Cartesian3.negate(direction, direction);
|
877
|
+
var right = Cartesian3.clone(Cartesian3.UNIT_X, camera.right);
|
878
|
+
Cartesian3.cross(right, direction, camera.up);
|
879
|
+
}
|
880
|
+
|
881
|
+
var viewExtent2DCartographic = new Cartographic();
|
882
|
+
function viewExtent2D(camera, extent, projection) {
|
883
|
+
var north = extent.north;
|
884
|
+
var south = extent.south;
|
885
|
+
var east = extent.east;
|
886
|
+
var west = extent.west;
|
887
|
+
|
888
|
+
var cart = viewExtent2DCartographic;
|
889
|
+
cart.longitude = east;
|
890
|
+
cart.latitude = north;
|
891
|
+
var northEast = projection.project(cart);
|
892
|
+
cart.longitude = west;
|
893
|
+
cart.latitude = south;
|
894
|
+
var southWest = projection.project(cart);
|
895
|
+
|
896
|
+
var width = Math.abs(northEast.x - southWest.x) * 0.5;
|
897
|
+
var height = Math.abs(northEast.y - southWest.y) * 0.5;
|
898
|
+
|
899
|
+
var right, top;
|
900
|
+
var ratio = camera.frustum.right / camera.frustum.top;
|
901
|
+
var heightRatio = height * ratio;
|
902
|
+
if (width > heightRatio) {
|
903
|
+
right = width;
|
904
|
+
top = right / ratio;
|
905
|
+
} else {
|
906
|
+
top = height;
|
907
|
+
right = heightRatio;
|
908
|
+
}
|
909
|
+
|
910
|
+
camera.frustum.right = right;
|
911
|
+
camera.frustum.left = -right;
|
912
|
+
camera.frustum.top = top;
|
913
|
+
camera.frustum.bottom = -top;
|
914
|
+
|
915
|
+
camera.position.x = (northEast.x - southWest.x) * 0.5 + southWest.x;
|
916
|
+
camera.position.y = (northEast.y - southWest.y) * 0.5 + southWest.y;
|
917
|
+
|
918
|
+
//Orient the camera north.
|
919
|
+
var cameraRight = Cartesian3.clone(Cartesian3.UNIT_X, camera.right);
|
920
|
+
Cartesian3.cross(cameraRight, camera.direction, camera.up);
|
921
|
+
}
|
922
|
+
|
923
|
+
/**
|
924
|
+
* View an extent on an ellipsoid or map.
|
925
|
+
* @memberof CameraController
|
926
|
+
*
|
927
|
+
* @param {Extent} extent The extent to view.
|
928
|
+
* @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid to view.
|
929
|
+
*
|
930
|
+
* @exception {DeveloperError} extent is required.
|
931
|
+
*/
|
932
|
+
CameraController.prototype.viewExtent = function(extent, ellipsoid) {
|
933
|
+
if (typeof extent === 'undefined') {
|
934
|
+
throw new DeveloperError('extent is required.');
|
935
|
+
}
|
936
|
+
ellipsoid = (typeof ellipsoid === 'undefined') ? Ellipsoid.WGS84 : ellipsoid;
|
937
|
+
|
938
|
+
if (this._mode === SceneMode.SCENE3D) {
|
939
|
+
viewExtent3D(this._camera, extent, ellipsoid);
|
940
|
+
} else if (this._mode === SceneMode.COLUMBUS_VIEW) {
|
941
|
+
viewExtentColumbusView(this._camera, extent, this._projection);
|
942
|
+
} else if (this._mode === SceneMode.SCENE2D) {
|
943
|
+
viewExtent2D(this._camera, extent, this._projection);
|
944
|
+
}
|
945
|
+
};
|
946
|
+
|
947
|
+
var pickEllipsoid3DRay = new Ray();
|
948
|
+
function pickEllipsoid3D(controller, windowPosition, ellipsoid, result) {
|
949
|
+
ellipsoid = ellipsoid || Ellipsoid.WGS84;
|
950
|
+
var ray = controller.getPickRay(windowPosition, pickEllipsoid3DRay);
|
951
|
+
var intersection = IntersectionTests.rayEllipsoid(ray, ellipsoid);
|
952
|
+
if (!intersection) {
|
953
|
+
return undefined;
|
954
|
+
}
|
955
|
+
|
956
|
+
return ray.getPoint(intersection.start, result);
|
957
|
+
}
|
958
|
+
|
959
|
+
var pickEllipsoid2DRay = new Ray();
|
960
|
+
function pickMap2D(controller, windowPosition, projection, result) {
|
961
|
+
var ray = controller.getPickRay(windowPosition, pickEllipsoid2DRay);
|
962
|
+
var position = ray.origin;
|
963
|
+
position.z = 0.0;
|
964
|
+
var cart = projection.unproject(position);
|
965
|
+
|
966
|
+
if (cart.latitude < -CesiumMath.PI_OVER_TWO || cart.latitude > CesiumMath.PI_OVER_TWO ||
|
967
|
+
cart.longitude < - Math.PI || cart.longitude > Math.PI) {
|
968
|
+
return undefined;
|
969
|
+
}
|
970
|
+
|
971
|
+
return projection.getEllipsoid().cartographicToCartesian(cart, result);
|
972
|
+
}
|
973
|
+
|
974
|
+
var pickEllipsoidCVRay = new Ray();
|
975
|
+
function pickMapColumbusView(controller, windowPosition, projection, result) {
|
976
|
+
var ray = controller.getPickRay(windowPosition, pickEllipsoidCVRay);
|
977
|
+
var scalar = -ray.origin.x / ray.direction.x;
|
978
|
+
ray.getPoint(scalar, result);
|
979
|
+
|
980
|
+
var cart = projection.unproject(new Cartesian3(result.y, result.z, 0.0));
|
981
|
+
|
982
|
+
if (cart.latitude < -CesiumMath.PI_OVER_TWO || cart.latitude > CesiumMath.PI_OVER_TWO ||
|
983
|
+
cart.longitude < - Math.PI || cart.longitude > Math.PI) {
|
984
|
+
return undefined;
|
985
|
+
}
|
986
|
+
|
987
|
+
return projection.getEllipsoid().cartographicToCartesian(cart, result);
|
988
|
+
}
|
989
|
+
|
990
|
+
/**
|
991
|
+
* Pick an ellipsoid or map.
|
992
|
+
* @memberof CameraController
|
993
|
+
*
|
994
|
+
* @param {Cartesian2} windowPosition The x and y coordinates of a pixel.
|
995
|
+
* @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid to pick.
|
996
|
+
* @param {Cartesian3} [result] The object onto which to store the result.
|
997
|
+
*
|
998
|
+
* @exception {DeveloperError} windowPosition is required.
|
999
|
+
*
|
1000
|
+
* @return {Cartesian3} If the ellipsoid or map was picked, returns the point on the surface of the ellipsoid or map
|
1001
|
+
* in world coordinates. If the ellipsoid or map was not picked, returns undefined.
|
1002
|
+
*/
|
1003
|
+
CameraController.prototype.pickEllipsoid = function(windowPosition, ellipsoid, result) {
|
1004
|
+
if (typeof windowPosition === 'undefined') {
|
1005
|
+
throw new DeveloperError('windowPosition is required.');
|
1006
|
+
}
|
1007
|
+
|
1008
|
+
if (typeof result === 'undefined') {
|
1009
|
+
result = new Cartesian3();
|
1010
|
+
}
|
1011
|
+
|
1012
|
+
ellipsoid = ellipsoid || Ellipsoid.WGS84;
|
1013
|
+
|
1014
|
+
if (this._mode === SceneMode.SCENE3D) {
|
1015
|
+
result = pickEllipsoid3D(this, windowPosition, ellipsoid, result);
|
1016
|
+
} else if (this._mode === SceneMode.SCENE2D) {
|
1017
|
+
result = pickMap2D(this, windowPosition, this._projection, result);
|
1018
|
+
} else if (this._mode === SceneMode.COLUMBUS_VIEW) {
|
1019
|
+
result = pickMapColumbusView(this, windowPosition, this._projection, result);
|
1020
|
+
}
|
1021
|
+
|
1022
|
+
return result;
|
1023
|
+
};
|
1024
|
+
|
1025
|
+
var pickPerspCenter = new Cartesian3();
|
1026
|
+
var pickPerspXDir = new Cartesian3();
|
1027
|
+
var pickPerspYDir = new Cartesian3();
|
1028
|
+
function getPickRayPerspective(camera, windowPosition, result) {
|
1029
|
+
var width = camera._canvas.clientWidth;
|
1030
|
+
var height = camera._canvas.clientHeight;
|
1031
|
+
|
1032
|
+
var tanPhi = Math.tan(camera.frustum.fovy * 0.5);
|
1033
|
+
var tanTheta = camera.frustum.aspectRatio * tanPhi;
|
1034
|
+
var near = camera.frustum.near;
|
1035
|
+
|
1036
|
+
var x = (2.0 / width) * windowPosition.x - 1.0;
|
1037
|
+
var y = (2.0 / height) * (height - windowPosition.y) - 1.0;
|
1038
|
+
|
1039
|
+
var position = camera.getPositionWC();
|
1040
|
+
Cartesian3.clone(position, result.origin);
|
1041
|
+
|
1042
|
+
var nearCenter = Cartesian3.multiplyByScalar(camera.getDirectionWC(), near, pickPerspCenter);
|
1043
|
+
Cartesian3.add(position, nearCenter, nearCenter);
|
1044
|
+
var xDir = Cartesian3.multiplyByScalar(camera.getRightWC(), x * near * tanTheta, pickPerspXDir);
|
1045
|
+
var yDir = Cartesian3.multiplyByScalar(camera.getUpWC(), y * near * tanPhi, pickPerspYDir);
|
1046
|
+
var direction = Cartesian3.add(nearCenter, xDir, result.direction);
|
1047
|
+
Cartesian3.add(direction, yDir, direction);
|
1048
|
+
Cartesian3.subtract(direction, position, direction);
|
1049
|
+
Cartesian3.normalize(direction, direction);
|
1050
|
+
|
1051
|
+
return result;
|
1052
|
+
}
|
1053
|
+
|
1054
|
+
function getPickRayOrthographic(camera, windowPosition, result) {
|
1055
|
+
var width = camera._canvas.clientWidth;
|
1056
|
+
var height = camera._canvas.clientHeight;
|
1057
|
+
|
1058
|
+
var x = (2.0 / width) * windowPosition.x - 1.0;
|
1059
|
+
x *= (camera.frustum.right - camera.frustum.left) * 0.5;
|
1060
|
+
var y = (2.0 / height) * (height - windowPosition.y) - 1.0;
|
1061
|
+
y *= (camera.frustum.top - camera.frustum.bottom) * 0.5;
|
1062
|
+
|
1063
|
+
var origin = result.origin;
|
1064
|
+
Cartesian3.clone(camera.position, origin);
|
1065
|
+
origin.x += x;
|
1066
|
+
origin.y += y;
|
1067
|
+
|
1068
|
+
Cartesian3.clone(camera.getDirectionWC(), result.direction);
|
1069
|
+
|
1070
|
+
return result;
|
1071
|
+
}
|
1072
|
+
|
1073
|
+
/**
|
1074
|
+
* Create a ray from the camera position through the pixel at <code>windowPosition</code>
|
1075
|
+
* in world coordinates.
|
1076
|
+
*
|
1077
|
+
* @memberof CameraController
|
1078
|
+
*
|
1079
|
+
* @param {Cartesian2} windowPosition The x and y coordinates of a pixel.
|
1080
|
+
* @param {Ray} [result] The object onto which to store the result.
|
1081
|
+
*
|
1082
|
+
* @exception {DeveloperError} windowPosition is required.
|
1083
|
+
*
|
1084
|
+
* @return {Object} Returns the {@link Cartesian3} position and direction of the ray.
|
1085
|
+
*/
|
1086
|
+
CameraController.prototype.getPickRay = function(windowPosition, result) {
|
1087
|
+
if (typeof windowPosition === 'undefined') {
|
1088
|
+
throw new DeveloperError('windowPosition is required.');
|
1089
|
+
}
|
1090
|
+
|
1091
|
+
if (typeof result === 'undefined') {
|
1092
|
+
result = new Ray();
|
1093
|
+
}
|
1094
|
+
|
1095
|
+
var camera = this._camera;
|
1096
|
+
var frustum = camera.frustum;
|
1097
|
+
if (typeof frustum.aspectRatio !== 'undefined' && typeof frustum.fovy !== 'undefined' && typeof frustum.near !== 'undefined') {
|
1098
|
+
return getPickRayPerspective(camera, windowPosition, result);
|
1099
|
+
}
|
1100
|
+
|
1101
|
+
return getPickRayOrthographic(camera, windowPosition, result);
|
1102
|
+
};
|
1103
|
+
|
1104
|
+
function createAnimation2D(controller, duration) {
|
1105
|
+
var camera = controller._camera;
|
1106
|
+
|
1107
|
+
var position = camera.position;
|
1108
|
+
var translateX = position.x < -controller._maxCoord.x || position.x > controller._maxCoord.x;
|
1109
|
+
var translateY = position.y < -controller._maxCoord.y || position.y > controller._maxCoord.y;
|
1110
|
+
var animatePosition = translateX || translateY;
|
1111
|
+
|
1112
|
+
var frustum = camera.frustum;
|
1113
|
+
var top = frustum.top;
|
1114
|
+
var bottom = frustum.bottom;
|
1115
|
+
var right = frustum.right;
|
1116
|
+
var left = frustum.left;
|
1117
|
+
var startFrustum = controller._frustum;
|
1118
|
+
var animateFrustum = right > controller._frustum.right;
|
1119
|
+
|
1120
|
+
if (animatePosition || animateFrustum) {
|
1121
|
+
var translatedPosition = position.clone();
|
1122
|
+
|
1123
|
+
if (translatedPosition.x > controller._maxCoord.x) {
|
1124
|
+
translatedPosition.x = controller._maxCoord.x;
|
1125
|
+
} else if (translatedPosition.x < -controller._maxCoord.x) {
|
1126
|
+
translatedPosition.x = -controller._maxCoord.x;
|
1127
|
+
}
|
1128
|
+
|
1129
|
+
if (translatedPosition.y > controller._maxCoord.y) {
|
1130
|
+
translatedPosition.y = controller._maxCoord.y;
|
1131
|
+
} else if (translatedPosition.y < -controller._maxCoord.y) {
|
1132
|
+
translatedPosition.y = -controller._maxCoord.y;
|
1133
|
+
}
|
1134
|
+
|
1135
|
+
var update2D = function(value) {
|
1136
|
+
if (animatePosition) {
|
1137
|
+
camera.position = position.lerp(translatedPosition, value.time);
|
1138
|
+
}
|
1139
|
+
if (animateFrustum) {
|
1140
|
+
camera.frustum.top = CesiumMath.lerp(top, startFrustum.top, value.time);
|
1141
|
+
camera.frustum.bottom = CesiumMath.lerp(bottom, startFrustum.bottom, value.time);
|
1142
|
+
camera.frustum.right = CesiumMath.lerp(right, startFrustum.right, value.time);
|
1143
|
+
camera.frustum.left = CesiumMath.lerp(left, startFrustum.left, value.time);
|
1144
|
+
}
|
1145
|
+
};
|
1146
|
+
|
1147
|
+
return {
|
1148
|
+
easingFunction : Tween.Easing.Exponential.Out,
|
1149
|
+
startValue : {
|
1150
|
+
time : 0.0
|
1151
|
+
},
|
1152
|
+
stopValue : {
|
1153
|
+
time : 1.0
|
1154
|
+
},
|
1155
|
+
duration : duration,
|
1156
|
+
onUpdate : update2D
|
1157
|
+
};
|
1158
|
+
}
|
1159
|
+
|
1160
|
+
return undefined;
|
1161
|
+
}
|
1162
|
+
|
1163
|
+
function createAnimationTemplateCV(controller, position, center, maxX, maxY, duration) {
|
1164
|
+
var newPosition = position.clone();
|
1165
|
+
|
1166
|
+
if (center.y > maxX) {
|
1167
|
+
newPosition.y -= center.y - maxX;
|
1168
|
+
} else if (center.y < -maxX) {
|
1169
|
+
newPosition.y += -maxX - center.y;
|
1170
|
+
}
|
1171
|
+
|
1172
|
+
if (center.z > maxY) {
|
1173
|
+
newPosition.z -= center.z - maxY;
|
1174
|
+
} else if (center.z < -maxY) {
|
1175
|
+
newPosition.z += -maxY - center.z;
|
1176
|
+
}
|
1177
|
+
|
1178
|
+
var camera = controller._camera;
|
1179
|
+
var updateCV = function(value) {
|
1180
|
+
var interp = position.lerp(newPosition, value.time);
|
1181
|
+
var pos = new Cartesian4(interp.x, interp.y, interp.z, 1.0);
|
1182
|
+
camera.position = Cartesian3.fromCartesian4(camera.getInverseTransform().multiplyByVector(pos));
|
1183
|
+
};
|
1184
|
+
|
1185
|
+
return {
|
1186
|
+
easingFunction : Tween.Easing.Exponential.Out,
|
1187
|
+
startValue : {
|
1188
|
+
time : 0.0
|
1189
|
+
},
|
1190
|
+
stopValue : {
|
1191
|
+
time : 1.0
|
1192
|
+
},
|
1193
|
+
duration : duration,
|
1194
|
+
onUpdate : updateCV
|
1195
|
+
};
|
1196
|
+
}
|
1197
|
+
|
1198
|
+
function createAnimationCV(controller, duration) {
|
1199
|
+
var camera = controller._camera;
|
1200
|
+
var ellipsoid = controller._projection.getEllipsoid();
|
1201
|
+
var position = camera.position;
|
1202
|
+
var direction = camera.direction;
|
1203
|
+
|
1204
|
+
var normal = Cartesian3.fromCartesian4(camera.getInverseTransform().multiplyByVector(Cartesian4.UNIT_X));
|
1205
|
+
var scalar = -normal.dot(position) / normal.dot(direction);
|
1206
|
+
var center = position.add(direction.multiplyByScalar(scalar));
|
1207
|
+
center = new Cartesian4(center.x, center.y, center.z, 1.0);
|
1208
|
+
var centerWC = camera.transform.multiplyByVector(center);
|
1209
|
+
|
1210
|
+
var cameraPosition = new Cartesian4(camera.position.x, camera.position.y, camera.position.z, 1.0);
|
1211
|
+
var positionWC = camera.transform.multiplyByVector(cameraPosition);
|
1212
|
+
|
1213
|
+
var tanPhi = Math.tan(controller._camera.frustum.fovy * 0.5);
|
1214
|
+
var tanTheta = controller._camera.frustum.aspectRatio * tanPhi;
|
1215
|
+
var distToC = positionWC.subtract(centerWC).magnitude();
|
1216
|
+
var dWidth = tanTheta * distToC;
|
1217
|
+
var dHeight = tanPhi * distToC;
|
1218
|
+
|
1219
|
+
var mapWidth = ellipsoid.getRadii().x * Math.PI;
|
1220
|
+
var mapHeight = ellipsoid.getRadii().y * CesiumMath.PI_OVER_TWO;
|
1221
|
+
|
1222
|
+
var maxX = Math.max(dWidth - mapWidth, mapWidth);
|
1223
|
+
var maxY = Math.max(dHeight - mapHeight, mapHeight);
|
1224
|
+
|
1225
|
+
if (positionWC.x < -maxX || positionWC.x > maxX || positionWC.y < -maxY || positionWC.y > maxY) {
|
1226
|
+
var translateX = centerWC.y < -maxX || centerWC.y > maxX;
|
1227
|
+
var translateY = centerWC.z < -maxY || centerWC.z > maxY;
|
1228
|
+
if (translateX || translateY) {
|
1229
|
+
return createAnimationTemplateCV(controller, Cartesian3.fromCartesian4(positionWC), Cartesian3.fromCartesian4(centerWC), maxX, maxY, duration);
|
1230
|
+
}
|
1231
|
+
}
|
1232
|
+
|
1233
|
+
return undefined;
|
1234
|
+
}
|
1235
|
+
|
1236
|
+
/**
|
1237
|
+
* Create an animation to move the map into view. This method is only valid for 2D and Columbus modes.
|
1238
|
+
* @memberof CameraController
|
1239
|
+
* @param {Number} duration The duration, in milliseconds, of the animation.
|
1240
|
+
* @exception {DeveloperException} duration is required.
|
1241
|
+
* @returns {Object} The animation or undefined if the scene mode is 3D or the map is already ion view.
|
1242
|
+
*/
|
1243
|
+
CameraController.prototype.createCorrectPositionAnimation = function(duration) {
|
1244
|
+
if (typeof duration === 'undefined') {
|
1245
|
+
throw new DeveloperError('duration is required.');
|
1246
|
+
}
|
1247
|
+
|
1248
|
+
if (this._mode === SceneMode.SCENE2D) {
|
1249
|
+
return createAnimation2D(this, duration);
|
1250
|
+
} else if (this._mode === SceneMode.COLUMBUS_VIEW) {
|
1251
|
+
return createAnimationCV(this, duration);
|
1252
|
+
}
|
1253
|
+
|
1254
|
+
return undefined;
|
1255
|
+
};
|
1256
|
+
|
1257
|
+
return CameraController;
|
1258
|
+
});
|