コード例 #1
0
        private void PlayAnimation(double duration, int numCycles)
        {
            IGlobe           globe     = axGlobeControl1.Globe;
            IAnimationTracks tracks    = (IAnimationTracks)globe;
            IViewers3D       viewers3D = globe.GlobeDisplay;

            //exit if document doesn't contain animation..
            string sError;

            if (tracks.TrackCount == 0)
            {
                sError = m_AnimFilePath;
                if (sError == "")
                {
                    sError = "To get a Sample animation file, Developer Kit Samples need to be installed!";
                    System.Windows.Forms.MessageBox.Show("The current document doesn't contain animation file." + 0x000A + sError);
                }
                else
                {
                    System.Windows.Forms.MessageBox.Show("The current document doesn't contain animation file." + 0x000A + "Load " + m_AnimFilePath + @"\AnimationSample.aga for sample.");
                }
                return;
            }

            DateTime startTime;
            TimeSpan timeSpan;
            int      j;
            double   elapsedTime;

            for (int i = 1; i <= numCycles; i++)
            {
                startTime = DateTime.Now;
                j         = 0;
                do
                {
                    timeSpan    = (DateTime.Now).Subtract(startTime);
                    elapsedTime = timeSpan.TotalSeconds;
                    if (elapsedTime > duration)
                    {
                        elapsedTime = duration;
                    }
                    tracks.ApplyTracks(null, elapsedTime, duration);
                    viewers3D.RefreshViewers();
                    j = j + 1;
                }while (elapsedTime < duration);
            }
        }
コード例 #2
0
        private void PlayAnimationFast(int cycles, int iteration)
        {
            IGlobe           globe        = axGlobeControl1.Globe;
            IGlobeDisplay    globeDisplay = globe.GlobeDisplay;
            Scene            scene        = (Scene)globeDisplay.Scene;
            IAnimationTracks sceneTracks  = (IAnimationTracks)scene;

            IArray trackCamArray = new ArrayClass();
            IArray trackGlbArray = new ArrayClass();
            IArray trackLyrArray = new ArrayClass();

            string sError;

            if (sceneTracks.TrackCount == 0)
            {
                sError = m_AnimFilePath;
                if (sError == "")
                {
                    sError = "To get a Sample animation file, Developer Kit Samples need to be installed!";
                    System.Windows.Forms.MessageBox.Show("The current document doesn't contain animation file." + 0x000A + sError);
                }
                else
                {
                    System.Windows.Forms.MessageBox.Show("The current document doesn't contain animation file." + 0x000A + "Load " + m_AnimFilePath + @"\AnimationSample.aga for sample.");
                }
                return;
            }

            IAnimationTrack track;
            IAnimationTrack trackLayer;
            IAnimationTrack trackGlobe = null;
            IAnimationType  animType;
            IAnimationType  animLayer;
            IAnimationType  animGlobeCam = null;
            IKeyframe       kFGlbCam;
            IKeyframe       kFGlbLayer;
            int             k;

            int[] count = new int[1000];

            //get each track from the scene and store tracks of the same kind in an Array
            for (int i = 0; i <= sceneTracks.TrackCount - 1; i++)
            {
                track    = (IAnimationTrack)sceneTracks.Tracks.get_Element(i);
                k        = i;
                animType = track.AnimationType;

                if (animType.CLSID.Value.ToString() == "{7CCBA704-3933-4D7A-8E89-4DFEE88AA937}")
                {
                    //GlobeLayer
                    trackLayer = new AnimationTrackClass();
                    trackLayer = track;
                    trackLayer.AnimationType = animType;
                    kFGlbLayer = new GlobeLayerKeyframeClass();
                    animLayer  = animType;
                    //Store the keyframe count of each track in an array
                    count[i] = trackLayer.KeyframeCount;
                    trackLyrArray.Add(trackLayer);
                }
                else if (animType.CLSID.Value.ToString() == "{D4565495-E2F9-4D89-A8A7-D0B69FD7A424}")
                {
                    //Globe Camera type
                    trackGlobe = new AnimationTrackClass();
                    trackGlobe = track;
                    trackGlobe.AnimationType = animType;
                    kFGlbCam     = new GlobeCameraKeyframeClass();
                    animGlobeCam = animType;
                    //Store the keyframe count of each track in an array
                    count[i] = trackGlobe.KeyframeCount;
                    trackGlbArray.Add(trackGlobe);
                }
                else
                {
                    System.Windows.Forms.MessageBox.Show("Animation Type " + animType.Name + " Not Supported. Check if the animation File is Valid!");
                    return;
                }
            }

            int larger = Greatest(ref count);

            //if nothing gets passed by the argument it takes the max no of keyframes
            if (iteration == 0)
            {
                iteration = larger;
            }

            IAnimationTrack trackCamera;
            IAnimationType  animCam = null;
            IKeyframe       kFBkmark;
            double          time = 0;
            int             keyFrameLayerCount; int keyFrameCameraCount; int keyFrameCount;

            for (int i = 1; i <= cycles; i++)                    //no of cycles...
            {
                for (int start = 0; start <= iteration; start++) //no of iterations...
                {
                    for (int j = 0; j <= trackCamArray.Count - 1; j++)
                    {
                        trackCamera = (IAnimationTrack)trackCamArray.get_Element(j);
                        if (trackCamera != null)
                        {
                            if (time >= trackCamera.BeginTime)
                            {
                                keyFrameCameraCount = trackGlobe.KeyframeCount;
                                kFBkmark            = trackCamera.get_Keyframe(keyFrameCameraCount - keyFrameCameraCount);
                                //reset object
                                animCam.ResetObject(scene, kFBkmark);
                                //interpolate by using track
                                trackCamera.InterpolateObjectProperties(scene, time);
                                keyFrameCameraCount = keyFrameCameraCount - 1;
                            }
                        }
                    }

                    for (k = 0; k <= trackGlbArray.Count - 1; k++)
                    {
                        trackGlobe = (IAnimationTrack)trackGlbArray.get_Element(k);
                        if (trackGlobe != null)
                        {
                            if (time >= trackGlobe.BeginTime)
                            {
                                keyFrameCount = trackGlobe.KeyframeCount;
                                kFGlbCam      = trackGlobe.get_Keyframe(trackGlobe.KeyframeCount - keyFrameCount);
                                //reset object
                                animGlobeCam.ResetObject(scene, kFGlbCam);
                                //interpolate by using track
                                trackGlobe.InterpolateObjectProperties(scene, time);
                                keyFrameCount = keyFrameCount - 1;
                            }
                        }
                    }

                    for (int t = 0; t <= trackLyrArray.Count - 1; t++)
                    {
                        trackLayer = (IAnimationTrack)trackLyrArray.get_Element(t);
                        if (trackLayer != null)
                        {
                            if (time >= trackLayer.BeginTime)
                            {
                                keyFrameLayerCount = trackLayer.KeyframeCount;
                                kFGlbLayer         = trackLayer.get_Keyframe(trackLayer.KeyframeCount - keyFrameLayerCount);
                                //interpolate by using track
                                trackLayer.InterpolateObjectProperties(scene, time);
                                keyFrameLayerCount = keyFrameLayerCount - 1;
                            }
                        }
                    }

                    //reset interpolation Point
                    time = start / iteration;
                    //refresh the globeviewer(s)
                    globeDisplay.RefreshViewers();
                }
            }
        }
コード例 #3
0
        private static void PlayAnimationTrack(double duration, int numCycles, string FlyFilePath, IGlobe globe, GISFunction.SceneBookmark pSceneBookmark)
        {
            try
            {
                IAnimationTracks tracks    = (IAnimationTracks)globe;
                IViewers3D       viewers3D = globe.GlobeDisplay;

                //exit if document doesn't contain animation..
                string sError;
                if (tracks.TrackCount == 0)
                {
                    sError = FlyFilePath;
                    if (sError == "")
                    {
                        sError = "飞行路径文件可能丢失,请确保程序的完整性";
                        System.Windows.Forms.MessageBox.Show(sError, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        System.Windows.Forms.MessageBox.Show("加载飞行文件失败,请尝试重新安装程序。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    return;
                }

                DateTime startTime;
                TimeSpan timeSpan;
                int      j;
                double   elapsedTime;

                for (int i = 1; i <= numCycles; i++)
                {
                    startTime = DateTime.Now;
                    j         = 0;
                    do
                    {
                        timeSpan    = (DateTime.Now).Subtract(startTime);
                        elapsedTime = timeSpan.TotalSeconds;
                        if (elapsedTime > duration)
                        {
                            elapsedTime = duration;
                        }
                        tracks.ApplyTracks(null, elapsedTime, duration);
                        viewers3D.RefreshViewers();
                        j = j + 1;
                    }while (elapsedTime < duration);
                }
                //if(FlyFilePath.Length>4)
                //{

                //    int index = FlyFilePath.IndexOf("飞行");
                //    int indexFlyPath = FlyFilePath.IndexOf("FlyPath");
                //    if (index > 0&&indexFlyPath>0)
                //    {
                //        string cityName = FlyFilePath.Substring(indexFlyPath + 8, index - indexFlyPath-8);
                //        pSceneBookmark.ZoomToScene(cityName);
                //    }
                //}
            }
            catch
            { }
        }
コード例 #4
0
        public static IAnimationTrack CreateZoomOverLocationAnimation(IGlobeDisplay globeDisplay, IBookmark3D pBookmark3D)
        {
            // Set Mouse Cursor
            //IMouseCursor mouseCursor = new MouseCursorClass();
            //mouseCursor.SetCursor(2);

            // QI to GlobeDisplayRendering Interface
            IGlobeDisplayRendering globeDisplayRendering = (IGlobeDisplayRendering)globeDisplay;

            // Get Elevation Multiplication Factor
            IUnitConverter unitConverter = new UnitConverterClass();

            // Get GlobeDisplay and Camera
            IGlobe           globe           = globeDisplay.Globe;
            IAnimationTracks animationTracks = (IAnimationTracks)globe;
            IGlobeCamera     globeCamera     = (IGlobeCamera)globeDisplay.ActiveViewer.Camera;

            // Create New Animation Track
            IAnimationTrack animationTrack = new AnimationTrackClass();

            try
            {
                IAnimationType animationType = new AnimationTypeGlobeCameraClass();
                animationTrack.AnimationType = animationType;

                // Create First KeyFrame At Current Location
                IKeyframe keyframe1 = new GlobeCameraKeyframeClass();
                keyframe1.CaptureProperties((IScene)globe, globeCamera);
                animationTrack.InsertKeyframe(keyframe1, animationTrack.KeyframeCount);


                //// Create Last KeyFrame Over Desired Location
                //pBookmark3D.Apply(globeDisplay.ActiveViewer as ISceneViewer, false, 0);


                //IKeyframe keyframe3 = new GlobeCameraKeyframeClass();
                //keyframe3.CaptureProperties((IScene)globe, globeCamera);

                IKeyframe keyframe3 = CreateKeyframefromBook(globeDisplay.Globe, pBookmark3D) as IKeyframe;

                #region 获取第一帧和第三帧的参数
                double dX1_Tar, dY1_Tar, dZ1_Tar, dX1_Obs, dY1_Obs, dZ1_Obs;
                GetParametersFromKeyFrame(keyframe1, out dX1_Tar, out dY1_Tar, out dZ1_Tar, out dX1_Obs, out dY1_Obs, out dZ1_Obs);
                double dX3_Tar, dY3_Tar, dZ3_Tar, dX3_Obs, dY3_Obs, dZ3_Obs;
                GetParametersFromKeyFrame(keyframe3, out dX3_Tar, out dY3_Tar, out dZ3_Tar, out dX3_Obs, out dY3_Obs, out dZ3_Obs);
                #endregion

                //=========================================== 创建中间帧 ===========================================
                //IKeyframe keyframe2 = CreateMiddleKeyframe(globeDisplay.Globe, dX1_Tar, dY1_Tar, dZ1_Tar, dX1_Obs, dY1_Obs, dZ1_Obs,
                //    dX3_Tar, dY3_Tar, dZ3_Tar, dX3_Obs, dY3_Obs, dZ3_Obs);          //头晕、高血压、糖尿病患者调用该函数请慎重!
                //=========================================== 创建中间帧 ===========================================
                //animationTrack.InsertKeyframe(keyframe2, animationTrack.KeyframeCount);

                animationTrack.InsertKeyframe(keyframe3, animationTrack.KeyframeCount);

                // Set The Animation Track Name
                animationTrack.Name = "Zoom Over Location From Bookmark";

                // Set Track Attachments
                animationTrack.AttachObject(globeCamera);
                animationTrack.ApplyToAllViewers = true;

                // Add The New Track To The Scene
                animationTracks.AddTrack(animationTrack);

                // Return The Newly Create Aninmation Track
            }
            catch { }
            return(animationTrack);
        }
コード例 #5
0
        public static IAnimationTrack CreateZoomOverLocationAnimation(IGlobeDisplay globeDisplay, double doubleX, double doubleY, double doubleAltitide)
        {
            // Set Mouse Cursor
            //IMouseCursor mouseCursor = new MouseCursorClass();
            //mouseCursor.SetCursor(2);
            // QI to GlobeDisplayRendering Interface
            IGlobeDisplayRendering globeDisplayRendering = (IGlobeDisplayRendering)
                                                           globeDisplay;
            // Get Elevation Multiplication Factor
            IUnitConverter unitConverter = new UnitConverterClass();
            // Get GlobeDisplay and Camera
            IGlobe           globe           = globeDisplay.Globe;
            IAnimationTracks animationTracks = (IAnimationTracks)globe;

            IGlobeCamera globeCamera = (IGlobeCamera)globeDisplay.ActiveViewer.Camera;
            // Create New Animation Track
            IAnimationTrack animationTrack = new AnimationTrackClass();

            try
            {
                IAnimationType animationType = new AnimationTypeGlobeCameraClass();
                animationTrack.AnimationType = animationType;
                // Create First KeyFrame At Current Location
                IKeyframe keyframe1 = new GlobeCameraKeyframeClass();
                keyframe1.CaptureProperties((IScene)globe, globeCamera);
                animationTrack.InsertKeyframe(keyframe1, animationTrack.KeyframeCount);
                // Create Last KeyFrame Over Desired Location
                IKeyframe keyframe3 = new GlobeCameraKeyframeClass();
                keyframe3.set_PropertyValueInt(0, 0);
                keyframe3.set_PropertyValueDouble(1, doubleY);
                keyframe3.set_PropertyValueDouble(2, doubleX);
                keyframe3.set_PropertyValueDouble(3, -1d *
                                                  unitConverter.ConvertUnits(globeDisplayRendering.GlobeRadius, esriUnits.esriMeters,
                                                                             globe.GlobeUnits)); // (globeDisplayRendering.GlobeRadius / -1000));
                keyframe3.set_PropertyValueDouble(4, doubleY);
                keyframe3.set_PropertyValueDouble(5, doubleX);
                keyframe3.set_PropertyValueDouble(6, doubleAltitide);
                keyframe3.set_PropertyValueDouble(7, 30);
                keyframe3.set_PropertyValueDouble(8, 0);

                #region 获取第一帧和第三帧的参数
                double dX1_Tar, dY1_Tar, dZ1_Tar, dX1_Obs, dY1_Obs, dZ1_Obs;
                GetParametersFromKeyFrame(keyframe1, out dX1_Tar, out dY1_Tar, out dZ1_Tar, out dX1_Obs, out dY1_Obs, out dZ1_Obs);
                double dX3_Tar, dY3_Tar, dZ3_Tar, dX3_Obs, dY3_Obs, dZ3_Obs;
                GetParametersFromKeyFrame(keyframe3, out dX3_Tar, out dY3_Tar, out dZ3_Tar, out dX3_Obs, out dY3_Obs, out dZ3_Obs);
                #endregion

                ////=========================================== 创建中间帧    == == == == == == == == == == == == == == == == == == == == == =
                IKeyframe keyframe2 = CreateMiddleKeyframe(globeDisplay.Globe, dX1_Tar,
                                                           dY1_Tar, dZ1_Tar, dX1_Obs, dY1_Obs, dZ1_Obs,
                                                           dX3_Tar, dY3_Tar, dZ3_Tar, dX3_Obs, dY3_Obs, dZ3_Obs); //头晕、高血压、糖尿病患者调用该函数请慎重!
                //=========================================== 创建中间帧    == == == == == == == == == == == == == == == == == == == == == =
                //animationTrack.InsertKeyframe(keyframe2, animationTrack.KeyframeCount);
                animationTrack.InsertKeyframe(keyframe3, animationTrack.KeyframeCount);
                // Set The Animation Track Name
                animationTrack.Name = "Zoom Over Location";
                // Set Track Attachments
                animationTrack.AttachObject(globeCamera);
                animationTrack.ApplyToAllViewers = true;
                // Add The New Track To The Scene
                animationTracks.AddTrack(animationTrack);
                // Return The Newly Create Aninmation Track
            }
            catch { }
            return(animationTrack);
        }
コード例 #6
0
        public static void ZoomToPointAnimation(AxGlobeControl axGlobeControl, double MapX, double MapY)
        {
            try
            {
                IPoint point = new PointClass();
                point.PutCoords(MapX, MapY);    //设置点击的点坐标

                //动画缩放到
                IAnimationTrack animaTrack = CreateZoomOverLocationAnimation(axGlobeControl.GlobeDisplay, MapX, MapY, 1000);
                animaTrack.IsEnabled = true;

                IAnimationTracks pTracks = axGlobeControl.Globe as IAnimationTracks;
                //for (int i = 0; i < pTracks.TrackCount; i++)
                //{
                //    IAnimationTrack pTrack = pTracks.Tracks.get_Element(i) as
                //    IAnimationTrack;
                //    pTrack.IsEnabled = true;//设置为true 才可以播放这条轨迹
                //}
                DateTime startTime = DateTime.Now;
                TimeSpan timeSpan;
                double   elapsedTime;
                double   duration = 7;
                bool     play     = true;
                do
                {
                    timeSpan    = (DateTime.Now).Subtract(startTime);
                    elapsedTime = timeSpan.TotalSeconds;
                    if (elapsedTime > duration)
                    {
                        play        = false;
                        elapsedTime = duration;
                    }
                    pTracks.ApplyTracks(axGlobeControl.Globe.GlobeDisplay.ActiveViewer, elapsedTime, duration);
                    axGlobeControl.Globe.GlobeDisplay.RefreshViewers();
                } while (play);


                #region //无动画方式
                //point = CommonBaseTool.BaseGISTools.getGeoPoint(MapX, MapY);        //转换坐标

                //IPoint ptObserver = new PointClass();
                //IPoint ptTarget = new PointClass();

                ////Observer点
                //IClone pClone1 = point as IClone;
                //ptObserver = pClone1.Clone() as IPoint;
                //ptObserver.Y = ptObserver.Y - 0.08;
                //ptObserver.Z = 15.45;
                ////Target点
                //IClone pClone2 = point as IClone;
                //ptTarget = pClone2.Clone() as IPoint;
                //ptTarget.Z = -0.01;

                //axGlobeControl.GlobeCamera.SetObserverLatLonAlt(ptObserver.Y, ptObserver.X, ptObserver.Z);
                //axGlobeControl.GlobeCamera.SetTargetLatLonAlt(ptTarget.Y, ptTarget.X, ptTarget.Z);
                #endregion

                //刷新
                axGlobeControl.GlobeDisplay.RefreshViewers();
            }
            catch { }
        }