public void EndFlight() { inUse = false; bCancel = true; speed = 0; globeDisplay.IsNavigating = false; // reposition target PointZ currentObs = new PointZ(); IPoint newTarget = new PointClass(); currentObs.x = camera.Observer.X; currentObs.y = camera.Observer.Y; currentObs.z = camera.Observer.Z; int orX = 0; int orY = 0; int width = 0; int height = 0; camera.GetViewport(ref orX, ref orY, ref width, ref height); object obj1; object obj2; try { globeDisplay.Locate(globeDisplay.ActiveViewer, width / 2, height / 2, true, true, out newTarget, out obj1, out obj2); } catch (System.Exception e) { MessageBox.Show(e.Message); MessageBox.Show(e.StackTrace.ToString()); } if (newTarget == null) // no intersection with globe, but don't let the target to be too far { newTarget = camera.Target; PointZ tar = new PointZ(currentObs.x, currentObs.y, currentObs.z); double elevObs = tar.Norm() - 1.0; if (elevObs <= 0.0001) { elevObs = 0.0001; } PointZ oldTarget = new PointZ(newTarget.X, newTarget.Y, newTarget.Z); PointZ dir = (oldTarget - tar); double val = dir.Norm(); if (val > 0.0) { dir.x = dir.x * elevObs * 10 / val; dir.y = dir.y * elevObs * 10 / val; dir.z = dir.z * elevObs * 10 / val; } tar = tar + dir; newTarget.X = tar.x; newTarget.Y = tar.y; newTarget.Z = tar.z; } ESRI.ArcGIS.GlobeCore.IGlobeViewUtil globeViewUtil = globeCamera as ESRI.ArcGIS.GlobeCore.IGlobeViewUtil; double obsLat; double obsLon; double obsAlt; double tarLat; double tarLon; double tarAlt; globeViewUtil.GeocentricToGeographic(currentObs.x, currentObs.y, currentObs.z, out obsLon, out obsLat, out obsAlt); globeViewUtil.GeocentricToGeographic(newTarget.X, newTarget.Y, newTarget.Z, out tarLon, out tarLat, out tarAlt); globeCamera.SetObserverLatLonAlt(obsLat, obsLon, obsAlt / 1000); globeCamera.SetTargetLatLonAlt(tarLat, tarLon, tarAlt / 1000); camera.RollAngle = 0; camera.PropertiesChanged(); globeDisplay.RefreshViewers(); //Windows API call to set cursor SetCursor(moveFlyCur.Handle.ToInt32()); }
public void EndFlight() { inUse = false; bCancel = true; speed = 0; globeDisplay.IsNavigating = false; // reposition target PointZ currentObs = new PointZ(); IPoint newTarget = new PointClass(); currentObs.x = camera.Observer.X; currentObs.y = camera.Observer.Y; currentObs.z = camera.Observer.Z; int orX = 0; int orY = 0; int width = 0; int height = 0; camera.GetViewport(ref orX, ref orY, ref width, ref height); object obj1; object obj2; try { globeDisplay.Locate(globeDisplay.ActiveViewer, width / 2, height / 2, true, true, out newTarget, out obj1, out obj2); } catch (System.Exception e) { MessageBox.Show(e.Message); MessageBox.Show(e.StackTrace.ToString()); } if (newTarget == null) // no intersection with globe, but don't let the target to be too far { newTarget = camera.Target; PointZ tar = new PointZ(currentObs.x, currentObs.y, currentObs.z); double elevObs = tar.Norm() - 1.0; if (elevObs <= 0.0001) elevObs = 0.0001; PointZ oldTarget = new PointZ(newTarget.X, newTarget.Y, newTarget.Z); PointZ dir = (oldTarget - tar); double val = dir.Norm(); if (val > 0.0) { dir.x = dir.x * elevObs * 10 / val; dir.y = dir.y * elevObs * 10 / val; dir.z = dir.z * elevObs * 10 / val; } tar = tar + dir; newTarget.X = tar.x; newTarget.Y = tar.y; newTarget.Z = tar.z; } ESRI.ArcGIS.GlobeCore.IGlobeViewUtil globeViewUtil = globeCamera as ESRI.ArcGIS.GlobeCore.IGlobeViewUtil; double obsLat; double obsLon; double obsAlt; double tarLat; double tarLon; double tarAlt; globeViewUtil.GeocentricToGeographic(currentObs.x, currentObs.y, currentObs.z, out obsLon, out obsLat, out obsAlt); globeViewUtil.GeocentricToGeographic(newTarget.X, newTarget.Y, newTarget.Z, out tarLon, out tarLat, out tarAlt); globeCamera.SetObserverLatLonAlt(obsLat, obsLon, obsAlt / 1000); globeCamera.SetTargetLatLonAlt(tarLat, tarLon, tarAlt / 1000); camera.RollAngle = 0; camera.PropertiesChanged(); globeDisplay.RefreshViewers(); //Windows API call to set cursor SetCursor(moveFlyCur.Handle.ToInt32()); }