Toggle between global navigation mode and surface navigation mode.
[C#]
///<summary>Toggle between global navigation mode and surface navigation mode.</summary> /// ///<param name="globe">An IGlobe interface</param> /// ///<remarks></remarks> public void ToggleBetweenSurfaceAndGlobalNavigationMode(ESRI.ArcGIS.GlobeCore.IGlobe globe) { // get Globe Camera in the globe display ESRI.ArcGIS.GlobeCore.IGlobeDisplay globeDisplay = globe.GlobeDisplay; ESRI.ArcGIS.Analyst3D.ISceneViewer sceneViewer = globeDisplay.ActiveViewer; ESRI.ArcGIS.Analyst3D.ICamera camera = sceneViewer.Camera; ESRI.ArcGIS.GlobeCore.IGlobeCamera globeCamera = (ESRI.ArcGIS.GlobeCore.IGlobeCamera)camera; // Explicit Cast ESRI.ArcGIS.GlobeCore.esriGlobeCameraOrientationMode globeCameraNavigateMode = globeCamera.OrientationMode; ESRI.ArcGIS.GlobeCore.esriGlobeNavigationType globeNavigationType = globeCamera.NavigationType; if (globeCameraNavigateMode == ESRI.ArcGIS.GlobeCore.esriGlobeCameraOrientationMode.esriGlobeCameraOrientationLocal) { globeCamera.OrientationMode = ESRI.ArcGIS.GlobeCore.esriGlobeCameraOrientationMode.esriGlobeCameraOrientationGlobal; // do not change position if flying if (globeNavigationType == ESRI.ArcGIS.GlobeCore.esriGlobeNavigationType.esriGlobeNavigationAttached) { System.Double targetLatitude; System.Double targetLongitude; System.Double targetAltitude; globeCamera.GetTargetLatLonAlt(out targetLatitude, out targetLongitude, out targetAltitude); System.Double observerLatitude; System.Double obsLongitude; System.Double obsAltitude; globeCamera.GetObserverLatLonAlt(out observerLatitude, out obsLongitude, out obsAltitude); // In order to change the orientation mode to Global, we have to set the target of the camera of active viewer at the center of the earth. ESRI.ArcGIS.Geometry.IPoint point = new ESRI.ArcGIS.Geometry.PointClass(); point.PutCoords(0, 0); point.Z = 0; camera.Target = point; camera.RollAngle = 0; camera.RecalcUp(); // Set the GlobeCamera to Global Navigation mode. globeCamera.OrientationMode = ESRI.ArcGIS.GlobeCore.esriGlobeCameraOrientationMode.esriGlobeCameraOrientationGlobal; globeCamera.SetObserverLatLonAlt(targetLatitude, targetLongitude, obsAltitude); globeDisplay.RefreshViewers(); } } else { // do not change position if flying if (globeNavigationType == ESRI.ArcGIS.GlobeCore.esriGlobeNavigationType.esriGlobeNavigationAttached) { System.Double azimuth = camera.Azimuth; System.Double inclination = camera.Inclination; System.Double distance = camera.ViewingDistance; ESRI.ArcGIS.Geometry.IPoint point = new ESRI.ArcGIS.Geometry.PointClass(); System.Int32 originX = 0; System.Int32 originY = 0; System.Int32 width = 0; System.Int32 height = 0; // Get the width and height of the main viewer via the viewport camera.GetViewport(ref originX, ref originY, ref width, ref height); System.Object owner; System.Object ipObject; // Get the location at the center point of the main viewer globeDisplay.Locate(sceneViewer, width / 2, height / 2, true, true, out point, out owner, out ipObject); ESRI.ArcGIS.GlobeCore.IGlobeViewUtil globeViewUtil = (ESRI.ArcGIS.GlobeCore.IGlobeViewUtil)globeCamera; // Explicit cast System.Double xTarget; System.Double yTarget; point.QueryCoords(out xTarget, out yTarget); System.Double zTarget = point.Z; // Calculate the current Azimuth and Inclination of the camera azimuth = System.Math.Atan2(xTarget, yTarget) * 180 / System.Math.PI; inclination = (180 / System.Math.PI) * (System.Math.Asin(zTarget / System.Math.Sqrt(xTarget * xTarget + yTarget * yTarget + zTarget * zTarget))) - 10.0; if (inclination > 88) { inclination = 88; } else if (inclination < -88) { inclination = -88; } camera.Target = point; camera.Azimuth = azimuth; camera.Inclination = inclination; camera.ViewingDistance = distance - 1.0; } // Change to surface navigation mode globeCamera.OrientationMode = ESRI.ArcGIS.GlobeCore.esriGlobeCameraOrientationMode.esriGlobeCameraOrientationLocal; globeDisplay.RefreshViewers(); } }
[Visual Basic .NET]
'''<summary>Toggle between global navigation mode and surface navigation mode.</summary> ''' '''<param name="globe">An IGlobe interface</param> ''' '''<remarks></remarks> Public Sub ToggleBetweenSurfaceAndGlobalNavigationMode(ByVal globe As ESRI.ArcGIS.GlobeCore.IGlobe) ' get Globe Camera in the globe display Dim globeDisplay As ESRI.ArcGIS.GlobeCore.IGlobeDisplay = globe.GlobeDisplay Dim sceneViewer As ESRI.ArcGIS.Analyst3D.ISceneViewer = globeDisplay.ActiveViewer Dim camera As ESRI.ArcGIS.Analyst3D.ICamera = sceneViewer.Camera Dim globeCamera As ESRI.ArcGIS.GlobeCore.IGlobeCamera = CType(camera, ESRI.ArcGIS.GlobeCore.IGlobeCamera) ' Explicit Cast Dim globeCameraNavigateMode As ESRI.ArcGIS.GlobeCore.esriGlobeCameraOrientationMode = globeCamera.OrientationMode Dim globeNavigationType As ESRI.ArcGIS.GlobeCore.esriGlobeNavigationType = globeCamera.NavigationType If globeCameraNavigateMode = ESRI.ArcGIS.GlobeCore.esriGlobeCameraOrientationMode.esriGlobeCameraOrientationLocal Then globeCamera.OrientationMode = ESRI.ArcGIS.GlobeCore.esriGlobeCameraOrientationMode.esriGlobeCameraOrientationGlobal ' do not change position if flying If globeNavigationType = ESRI.ArcGIS.GlobeCore.esriGlobeNavigationType.esriGlobeNavigationAttached Then Dim targetLatitude As System.Double Dim targetLongitude As System.Double Dim targetAltitude As System.Double globeCamera.GetTargetLatLonAlt(targetLatitude, targetLongitude, targetAltitude) Dim observerLatitude As System.Double Dim obsLongitude As System.Double Dim obsAltitude As System.Double globeCamera.GetObserverLatLonAlt(observerLatitude, obsLongitude, obsAltitude) ' In order to change the orientation mode to Global, we have to set the target of the camera of active viewer at the center of the earth. Dim point As ESRI.ArcGIS.Geometry.IPoint = New ESRI.ArcGIS.Geometry.PointClass() point.PutCoords(0, 0) Point.Z = 0 camera.Target = Point camera.RollAngle = 0 camera.RecalcUp() ' Set the GlobeCamera to Global Navigation mode. globeCamera.OrientationMode = ESRI.ArcGIS.GlobeCore.esriGlobeCameraOrientationMode.esriGlobeCameraOrientationGlobal globeCamera.SetObserverLatLonAlt(targetLatitude, targetLongitude, obsAltitude) globeDisplay.RefreshViewers() End If Else ' do not change position if flying If globeNavigationType = ESRI.ArcGIS.GlobeCore.esriGlobeNavigationType.esriGlobeNavigationAttached Then Dim azimuth As System.Double = camera.Azimuth Dim inclination As System.Double = camera.Inclination Dim distance As System.Double = camera.ViewingDistance Dim point As ESRI.ArcGIS.Geometry.IPoint = New ESRI.ArcGIS.Geometry.PointClass() Dim originX As System.Int32 = 0 Dim originY As System.Int32 = 0 Dim width As System.Int32 = 0 Dim height As System.Int32 = 0 ' Get the width and height of the main viewer via the viewport camera.GetViewport(originX, originY, width, height) Dim owner As System.Object = Nothing Dim ipObject As System.Object = Nothing ' Get the location at the center point of the main viewer globeDisplay.Locate(sceneViewer, CInt(width / 2), CInt(height / 2), True, True, point, owner, ipObject) Dim globeViewUtil As ESRI.ArcGIS.GlobeCore.IGlobeViewUtil = CType(globeCamera, ESRI.ArcGIS.GlobeCore.IGlobeViewUtil) ' Explicit cast Dim xTarget As System.Double Dim yTarget As System.Double point.QueryCoords(xTarget, yTarget) Dim zTarget As System.Double = point.Z ' Calculate the current Azimuth and Inclination of the camera azimuth = System.Math.Atan2(xTarget, yTarget) * 180 / System.Math.PI inclination = 180 / System.Math.PI * System.Math.Asin((zTarget / System.Math.Sqrt((xTarget * xTarget + yTarget * yTarget + zTarget * zTarget)))) - 10.0 If inclination > 88 Then inclination = 88 Else If inclination < -88 Then inclination = -88 End If End If camera.Target = point camera.Azimuth = azimuth camera.Inclination = inclination camera.ViewingDistance = distance - 1.0 End If ' Change to surface navigation mode globeCamera.OrientationMode = ESRI.ArcGIS.GlobeCore.esriGlobeCameraOrientationMode.esriGlobeCameraOrientationLocal globeDisplay.RefreshViewers() End If End Sub