涉及到与 viewer.scene 进行交互,该类控制了viewer中的所有图形元素。
在初始化视图之前,先学下基本的cesium 类型:
new Cesium.Cartesian3(x, y, z)
地固坐标系也称地球坐标系,是固定在地球上与地球一起旋转的坐标系。根据坐标系原点位置的不同,地固坐标系分为地心坐标系(原点与地球质心重合)和参心坐标系(原点与参考椭球中心重合),以地心为原点的地固坐标系也称为地心地固坐标系(ECEF)。无论是参心坐标系还是地心坐标系均可分为空间直角坐标系和大地坐标系两种形式。
new Cesium.Cartographic(longitude, latitude, height)
new Cesium.HeadingPitchRoll(heading, pitch, roll)
new Cesium.Quaternion(x, y, z, w)
Camera 是 viewer.scene 的一个属性,用来控制当前可见范围。我们可以通过直接设置它的位置和方向来控制相机,或者通过使用Cesium提供的API来控制相机。
一些最常用的方法:
官方提供的Demo,可以帮助我们更好了解
把相机位置放置到纽约。分别使用一个 Cartesian3
表示位置,一个HeadingPitchRoll
表示朝向。
// 创建相机初始位置和朝向
var initialPosition = new Cesium.Cartesian3.fromDegrees(-73.998114468289017509, 40.674512895646692812, 2631.082799425431);
var initialOrientation = new Cesium.HeadingPitchRoll.fromDegrees(7.1077496389876024807, -31.987223091598949054, 0.025883251314954971306);
var homeCameraView = {
destination : initialPosition,
orientation : {
heading : initialOrientation.heading,
pitch : initialOrientation.pitch,
roll : initialOrientation.roll
}
};
// 设置视图
viewer.scene.camera.setView(homeCameraView);
实际上,我们可以使用这个相同的视角来更新按下home按钮的效果。我们不必让它从远处返回地球的默认视角,我们可以重写按钮,使我们看到曼哈顿的初始视角。我们可以通过添加几个选项来调整动画,然后添加一个取消默认航班的事件侦听器,并调用FlyTo()我们的Home视角:
// viewer.scene.camera.setView(homeCameraView);
// 增加相机飞行动画参数
homeCameraView.duration = 2.0;
homeCameraView.maximumHeight = 2000;
homeCameraView.pitchAdjustHeight = 2000;
homeCameraView.endTransform = Cesium.Matrix4.IDENTITY;
// Override the default home button
viewer.homeButton.viewModel.command.beforeExecute.addEventListener(function (e) {
e.cancel = true;
viewer.scene.camera.flyTo(homeCameraView);
});
在两种相机模式下可以简单的切换:
自由模式不需要代码,因为它使用默认控件。至于无人机跟随模式,我们可以使用摄像机的内置实体跟踪功能来定位摄像机,并用偏移量定位无人机。这就使得相机即使在移动时也能从指定的实体中得到固定的偏移量。为了跟踪一个实体,我们简单地设置viewer.trackedEntity。要切换到自由相机模式,我们可以将viewer.trackedEntity实体设置为未定义,然后使用camera.flyTo()返回到我们的Home视角。
function setViewMode() {
if (droneModeElement.checked) {
viewer.trackedEntity = drone;
} else {
viewer.trackedEntity = undefined;
viewer.scene.camera.flyTo(homeCameraView);
}
}
Cesium使用 JulianDate 描述某个时刻,这个时间存储了自从公元前4712年1月1日中午的天数。为了提高精度,这个类里分开存储了时刻的日期部分和时刻的秒部分。为了数学运算的安全和闰秒的问题,这个时刻是按照国际原子时标准存储的。
一些关于scene中时间的配置选项,设置场景动画的速率、开始和停止时间,并告诉时钟在到达停止时间时循环回到开始。它还将时间线控件设置为适当的时间范围:(运行效果和上图类似,就不贴图了。
// 设置时钟和时间线
viewer.clock.shouldAnimate = true; // 当viewer开启后,启动动画
viewer.clock.startTime = Cesium.JulianDate.fromIso8601("2017-07-11T16:00:00Z");
viewer.clock.stopTime = Cesium.JulianDate.fromIso8601("2017-07-11T16:20:00Z");
viewer.clock.currentTime = Cesium.JulianDate.fromIso8601("2017-07-11T16:00:00Z");
viewer.clock.multiplier = 2; // 设置加速倍率
viewer.clock.clockStep = Cesium.ClockStep.SYSTEM_CLOCK_MULTIPLIER;
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP; // 循环播放
viewer.timeline.zoomTo(viewer.clock.startTime, viewer.clock.stopTime); // 设置时间的可见范围
Cesium中的几种坐标和相互转换
Cesium坐标转换
Cesium入门8 - Configuring the Scene - 配置视窗
Ceisum官方教程2 -- 项目实例
Cesium:入门教程(一)之 Hello World
Cesium:入门教程(二)之数据源加载
Cesium:入门教程(三)之视窗配置
Cesium:入门教程(四)之 Entities
Cesium:入门教程(五)之 3D Tiles
Cesium:入门教程(六)之 交互性(Interactivity)