现在的位置: 首页 > 综合 > 正文

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

2018年09月24日 ⁄ 综合 ⁄ 共 3704字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.