原文地址: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