开发实现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
由于工作需要,最近开始着手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
相关文章推荐
- ArcGlobe三维开发之九————由指定路径创建动画(实现)
- Xcode4.2下iPhone多视图开发(自已创建MainWindow.xib和不用MainWindow.xib两种实现)
- Java微信公众平台开发(十)——微信自定义菜单的创建实现
- QT学习笔记(2)创建项目并实现信号槽和界面开发
- ArcGlobe三维开发之八————由指定路径创建动画(接口)
- 【Java Servlet 开发系列之二】创建WebApp详细步骤,通过Servlet实现http简单交互
- web 开发之创建本地文件夹的实现方法
- 2416开发记录九:在驱动模块初始化函数中实现设备节点的自动创建(转)
- 实例4:osganimationsolid例子实现关键帧插值动画(OSG程序开发实例集)
- 【Android SDK开发】各种Android Dialog创建及其监听事件实现
- ArcGlobe组件开发之动画3——由指定路径创建动画(续)
- OpenJWeb快速开发平台自动创建基于事务的业务逻辑接口和实现类
- Django开发(一)——创建项目,实现数据模型
- Xcode4.2下iPhone多视图开发(自已创建MainWindow.xib和不用MainWindow.xib两种实现)
- ArcGlobe组件开发之书签
- 基于WF4.0流程平台开发过程中的知识积累(三)书签实现子流程
- OpenJWeb快速开发平台自动创建基于事务的业务逻辑接口和实现类
- 企业管理软件开发之九 以数据绑定为基础的控件只读,创建时可写,必须大写,必须小写的原理与实现
- ArcGlobe三维开发之十七——书签
- [cocos2d-x][游戏开发]通过cocos2d-x实现简易飞机大战02 主界面创建