|
|
|

浅谈三维场景之飞行

在实际应用中总会遇到需要将视角转换到某个位置的情况。Scene里面也提供了相应的方法来实现。Scene. Fly方法提供了几种不同的回调方法,以满足不同的需求。但是由于其他原因的考虑,有些方法在产品的发展过程中废弃了。下面从SuperMap 9D来先整理一下那些...

作者:小诗来源:SuperMap技术问答社区 http://ask.supermap.com|2018年01月10日

在实际应用中总会遇到需要将视角转换到某个位置的情况。Scene里面也提供了相应的方法来实现。Scene. Fly方法提供了几种不同的回调方法,以满足不同的需求。但是由于其他原因的考虑,有些方法在产品的发展过程中废弃了。下面从SuperMap 9D来先整理一下那些方法是可用的,那些是过时的: 
(1)可用: 
Fly (Camera camera);根据指定的目标相机对象进行飞行。 
Fly (LookAt lookat);根据指定的目标相机对象进行飞行。 
Fly(Camera camera, int milliseconds); 根据指定的目标对象和飞行时间进行飞行。 
Fly(LookAt lookAt, uint millisceonds); 根据指定的目标对象和飞行时间进行飞行。 
FlyCircle(Geometry geometry, double speedRatio); 围绕指定地点旋转飞行模式,飞行过程中可以控制飞行的速度。

(2)不可用: 
Fly(Camera camera, bool isDirect); 直接飞行过去还是先拉起再飞行过去 
Fly(Geometry targetObject, int milliseconds); 根据指定的目标对象和飞行时间进行飞行。 
Fly(Geometry targetObject, FlyingMode flyingMode); 根据指定的飞行模式和目标对象进行飞行。 
Fly(Camera camera, int milliseconds, bool isDirect); 直接飞行过去还是先拉起再飞行过去 
FlyPlay(Geometry line, double speedRatio, double distance); 沿线飞行模式,可以控制飞行速度和高度

      其中有一个方法被废弃了,就是Fly(Camera camera, bool isDirect);根据指定的目标相机对象和飞行时间以先拉起再飞行过去的方式进行飞行。但是实际使用中是经常遇到需要先拉高再飞到某位置的情况,今天主要就讲一下如何实现它。

实现步骤: 
(1)由起点和终点位置,根据需求确定一个中间高点,这里采用最简单的方案,直接将两点直接的直线距离作为高点的高程值,高点在两点之间的中间。这样就可以根据三个点确定一条三维线。

Point3D startpoint3d = new Point3D(current_camera.Longitude, current_camera.Latitude, current_camera.Altitude);
Point3D endpoint3d = new Point3D(camera.Longitude, camera.Latitude, camera.Altitude);
Point3D point3d = new Point3D((startpoint3d.X + endpoint3d.X) / 2, (startpoint3d.Y + endpoint3d.Y) / 2, 0);
if (current_camera.Altitude > camera.Altitude)
{
point3d.Z = current_camera.Altitude + distance;
}
else
{
point3d.Z = camera.Altitude + distance;
}
Point3Ds pt3ds = new Point3Ds();
pt3ds.Add(startpoint3d);
pt3ds.Add(point3d);
pt3ds.Add(endpoint3d);
GeoLine3D GeodesicLine3d = new GeoLine3D(pt3ds);
 
(2)构建三维线后用飞行管理器来实现,即先将三维线转为路线,用FlyManager进行飞行。
 
Route route = new Route();
route.FromGeoLine3D(GeodesicLine3d);
for (int i = 0; i < route.Stops.Count; i++)
{
RouteStop routestop = route.Stops[i];
Camera cc = routestop.Camera;
cc.Tilt = 0;
routestop.Camera = cc;
}
RouteStop routestopend = new RouteStop();
routestopend.Camera = camera;
route.Stops.Add(routestopend);
route.IsLinesVisible = false;
route.IsStopsVisible = false;
FlyManager flyManager = new FlyManager();
flyManager.Scene = sceneControl.Scene;
flyManager.Routes.Clear();
flyManager.Routes.Add(route);
flyManager.Duration = millisceonds;
flyManager.Play();
 
具体代码可以参考静态类:SceneFly. Fly(Scene scene, Camera camera, int millisceonds) 
<”param name=”scene”>场景 
<”param name=”camera”>目标相机对象 
<”param name=”millisceonds”>相机飞行到指定目的地所耗费的时间。单位为秒。 
链接: https://pan.baidu.com/s/1jIvinX0  密码:8jrh
 
推荐文章: 新一代三维GIS技术>>

上一篇:SuperMap iClient 9D for OpenLayers 快…

下一篇:SuperMap GIS 9D SP1新特性速览