您的位置:首页 > 其它

开发实现ArcScene和ArcGlobe由书签创建关键帧

2012-11-17 15:22 281 查看
原文地址:http://www.gisall.com/html/63/151663-6302.html

由于工作需要,最近开始着手ArcGIS Globe的开发,在ArcGIS Globe开发的时候,创建书签,并将将一系列书签进行播放,其实在这里我们只要对动画中的相关概念弄清楚就行,帧是动画中很关键的一个概念,我们播放动画,不如说我们在播放帧,简单的说帧就是一幅静止的画面,可以说是我们播放中的关键画面,连续的帧就可以形成动画。

我们知到在ArcGIS中有两个三维的东东,ArcGlobe和ArcScene,在ArcScene中我们用下面的代码将Bookmark3D 创建为关键帧,然后播放,代码如下:

public void CreateKeyframeformBook(IScene _pScene)

{

IAGAnimationContainer pAGAnimationContainer = _pScene as IAGAnimationContainer;

ISceneBookmarks2 pSceneBooks = _pScene as ISceneBookmarks2;

if (pSceneBooks.BookmarkCount == 0)

return;

IBasicScene2 pBasicScene = _pScene as IBasicScene2;

IAnimationExtension pAnimationExt = pBasicScene.AnimationExtension;

IAGAnimationTracks pAGAnimationTracks = pAnimationExt.AnimationTracks;

IAGAnimationTrack pAGAnimationTrack = new AnimationTrackClass();

IAGAnimationUtils pAGAutils = new AGAnimationUtilsClass();

IBookmark3D pTempBook = null;

IKeyframe. pTempkeyframe. = null;

IAGAnimationTrackKeyframes pAGf = null;

ESRI.ArcGIS.Animation.IAGAnimationType pAGType = new AnimationTypeCameraClass();

pAGAnimationTrack.AnimationType = pAGType;

IBookmarkToKeyframe. pBook2Keyframe. = null;

for (int i = 0; i < pSceneBooks.BookmarkCount; i++)

{

pTempBook = pSceneBooks.Bookmarks.get_Element(i) as IBookmark3D;

pBook2Keyframe. = pTempBook as IBookmarkToKeyframe;

//if (pTempBook is IKeyframe)

//{

// pAGf.InsertKeyframe(pTempBook as IAGKeyframe, -1);

//}

pTempkeyframe. = pBook2Keyframe.ConvertToKeyframe();

//pAGAutils.KeyframeFromBookmark(pAGAnimationContainer, pAGAnimationContainer.SpatialBookmarks.get_Element(i) as ESRI.ArcGIS.Carto.ISpatialBookmark, out pTempkeyframe);

pAGf = pAGAnimationTrack as IAGAnimationTrackKeyframes;

pAGf.InsertKeyframe(pTempkeyframe. as IAGKeyframe, -1);

}

pAGAnimationTracks.AddTrack(pAGAnimationTrack);

}

public void Play(IScene _pScene)

{

IViewers3D pViewer3D = _pScene.SceneGraph as IViewers3D;

IAnimationTracks pTracks = _pScene as IAnimationTracks;

for (int i = 0; i < pTracks.TrackCount; i++)

{

IAnimationTrack pTrack = pTracks.Tracks.get_Element(i) as IAnimationTrack;

pTrack.IsEnabled = true;

}

DateTime startTime = DateTime.Now;

TimeSpan timeSpan;

double elapsedTime;

double duration = 10;

bool play = true;

do

{

timeSpan = (DateTime.Now).Subtract(startTime);

elapsedTime = timeSpan.TotalSeconds;

if (elapsedTime > duration)

{

play = false;

elapsedTime = duration;

}

pTracks.ApplyTracks(_pScene.SceneGraph.ActiveViewer, elapsedTime, duration);

pViewer3D.RefreshViewers();

} while (play);

}

但是如果用创建关键帧的代码在ArcGlobe中,可以创建成功,但是播放的时候会出错,这是因为ArcGlobe和ArcScene还是有区别的,在网上找了半天ArcGlobe的相关代码,没有找到,vs2010的帮助太不好用了,一气之下将ArcGlobe的那个OMD打印出来,一个个查看,皇天不负有心人,终于搞定了,代码如下:

public void CreateKeyframeformBook(IGlobe _pGlobe)

{

IScene _pScene = _pGlobe.GlobeDisplay.Scene;

IAGAnimationContainer pAGAnimationContainer = _pScene as IAGAnimationContainer;

ISceneBookmarks2 pSceneBooks = _pScene as ISceneBookmarks2;

if (pSceneBooks.BookmarkCount == 0)

return;

IBasicScene2 pBasicScene = _pScene as IBasicScene2;

IAnimationExtension pAnimationExt = pBasicScene.AnimationExtension;

IAGAnimationTracks pAGAnimationTracks = _pGlobe as IAGAnimationTracks;

IAGAnimationTrack pAGAnimationTrack = new AnimationTrackClass();

pAGAnimationTrack.Name = "Test";

IAGAnimationUtils pAGAutils = new AGAnimationUtilsClass();

IAGAnimationTrackKeyframes pAGf = null;

ESRI.ArcGIS.Animation.IAGAnimationType pAGType = new AnimationTypeGlobeCameraClass();

pAGAnimationTrack.AnimationType = pAGType;

pAGf = pAGAnimationTrack as IAGAnimationTrackKeyframes;

IAGKeyframe. pGlobeKey = new GlobeCameraKeyframeClass();

for (int i = 0; i < pAGAnimationContainer.SpatialBookmarks.Count;i++)

{

ISpatialBookmark pTempBook1 = pSceneBooks.Bookmarks.get_Element(i) as ISpatialBookmark;

pAGAutils.KeyframeFromBookmark(pAGAnimationContainer, pTempBook1, out pGlobeKey);

pAGf.InsertKeyframe(pGlobeKey, -1);

}

pAGAnimationTracks.AddTrack(pAGAnimationTrack);

}

这里有两个要注意的地方,就是关键帧的类型,第二个就是创建关键帧的接口不一样。

总算将这个搞定了,花费了1天的时间,今天终于搞定,在情人节的今天将这个搞定,很是开心,记录下来跟大家分享!

原文地址:http://www.gisall.com/html/63/151663-6302.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐