浅谈三维场景之飞行

<*小诗>

      在实际应用中总会遇到需要将视角转换到某个位置的情况。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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值