开发实现ArcScene和ArcGlobe由书签创建关键帧
来源:互联网 发布:linux vim 查看头文件 编辑:程序博客网 时间:2024/06/09 17:03
原文地址: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
- 开发实现ArcScene和ArcGlobe由书签创建关键帧
- ArcGlobe 和 ArcScene的区别
- ArcGlobe & ArcScene
- ArcScene和ArcGlobe的功能比较
- ArcGlobe三维开发之九————由指定路径创建动画(实现)
- 了解 ArcScene 与 ArcGlobe
- ArcGlobe三维开发之八————由指定路径创建动画(接口)
- ArcGlobe三维开发之十七——书签
- ArcCatalog、ArcGlobe、ArcMap、ArcReader、ArcScene介绍
- ArcGlobe与ArcScene功能比较与简单说明
- ArcGlobe与ArcScene功能比较与简单说明
- ArcGIS 9.3 破解后 ArcGlobe、ArcScene不能用(Generating ArcID Module)的解决办法
- ArcGIS Desktop 9.3破解后ArcGlobe、ArcScene不能用的解决办法
- RSS和社会性书签Chicklet创建器
- RSS和社会性书签Chicklet创建器
- ArcGlobe开发中常用代码
- ArcGlobe三维开发之七————动画的两种实现方式
- ArcGlobe三维开发之十六——加载和保存3dd文件
- sql server 2008 R2 Error 9003:The log scan number passed to log scan in database is not valid
- ASP.NET 网站路径
- Android系统的Socket多线程编程实例
- Linux ssh 下的简单 IM 通信
- sscanf,sscanf_s及其相关用法
- 开发实现ArcScene和ArcGlobe由书签创建关键帧
- date time server&client
- Linux下avr单片机开发环境
- Image is Everuthing LA2995
- [转]数据库操作-程序-java--oracle
- 如何学习编程?
- windows核心编程---StringCbCopy和StringCchCopy 函数
- Ari Zilka谈Ehcache的进程内堆外缓存BigMemory
- ArcGlobe移动图层顺序