Cesium的飞行定位,主要通过Viewer、Camera这两个类实现的。其中viewer.flyTo()、camera.flyTo()、camera.flyToBoundingSphere()这三个方法会有一个飞行动画的效果,所以会有飞行持续时间参数duration,默认是3秒。
一、viewer
flyTo | target:Entity | Array.< Entity > | EntityCollection | DataSource | ImageryLayer | Cesium3DTileset | TimeDynamicPointCloud | Promise.<( Entity |Array.< Entity >| EntityCollection | DataSource | ImageryLayer | Cesium3DTileset | TimeDynamicPointCloud )> options:duration(3s),offset(HeadingPitchRange) |
zoomTo | target:Entity | Array.< Entity > | EntityCollection | DataSource | ImageryLayer | Cesium3DTileset | TimeDynamicPointCloud | Promise.<( Entity |Array.< Entity >| EntityCollection | DataSource | ImageryLayer | Cesium3DTileset | TimeDynamicPointCloud )> offset(HeadingPitchRange) |
1.1 flyTo (target, options ) → Promise.<Boolean>
将相机移到提供的一个或多个实体或数据源。如果数据源仍在加载过程中,或者可视化仍在加载中,此方法在执行飞行之前等待数据准备就绪。
偏移量是在以边界球中心为中心的局部东北向上参考框中的航向/俯仰/范围。航向角和俯仰角在局部的北北向上参考系中定义。航向是从y轴到x轴的角度。间距是从xy平面开始的旋转。正螺距角度在平面上方。负俯仰角在平面下方。范围是距中心的距离。如果范围是零,则将计算范围以使整个边界球都可见。
在2D模式下,必须有一个俯视图。摄像机将被放置在目标上方并向下看。上方的高度目标将是范围。航向将根据偏移量确定。如果标题不能根据偏移量确定,航向将为北。
参数
Name | Type |
target | Entity | Array.< Entity > | EntityCollection | DataSource | ImageryLayer | Cesium3DTileset | TimeDynamicPointCloud | Promise.<( Entity |Array.< Entity >| EntityCollection | DataSource | ImageryLayer | Cesium3DTileset | TimeDynamicPointCloud )> 实体,实体阵列,实体集合,数据源,要查看的Cesium3DTileset,点云或图像层。您还可以传递一个可以解决上述类型之一的承诺。 |
options | Object 可选 |
options具有以下属性的对象:
名称 | 类型 | 默认 | 说明 |
duration | 数字 | 3.0 | 可选飞行持续时间(以秒为单位)。 |
maximumHeight | 数字 | 可选飞行高峰时的最大高度。 | |
offset | 可选在局部东北朝上的参考框中,距目标的偏移量。 |
Returns:
如果飞行成功则解析为true的承诺,如果当前未在场景中可视化目标或取消飞行,则为false的承诺。 //TODO:清理实体提及
1.2 zoomTo (target, offset ) → Promise.<Boolean>
异步设置摄像机以查看提供的一个或多个实体或数据源。如果数据源仍在加载过程中,或者可视化仍在加载中,此方法在执行缩放之前等待数据准备就绪。
偏移量是在以边界球中心为中心的局部东北向上参考框中的航向/俯仰/范围。航向角和俯仰角在局部的北北向上参考系中定义。航向是从y轴到x轴的角度。间距是从xy平面开始的旋转。正螺距角度在平面上方。负俯仰角在平面下方。范围是距中心的距离。如果范围是零,则将计算范围以使整个边界球都可见。
在2D模式下,必须有一个俯视图。摄像机将被放置在目标上方并向下看。上方的高度目标将是范围。航向将根据偏移量确定。如果标题不能根据偏移量确定,航向将为北。
参数
Name | Type | Description |
target | Entity | Array.< Entity > | EntityCollection | DataSource | ImageryLayer | Cesium3DTileset | TimeDynamicPointCloud | Promise.<( Entity |Array.< Entity >| EntityCollection | DataSource | ImageryLayer | Cesium3DTileset | TimeDynamicPointCloud )> | 实体,实体阵列,实体集合,数据源,要查看的Cesium3DTileset,点云或图像层。您还可以传递一个可以解决上述类型之一的承诺。 |
offset | 可选在局部东北向上参考系中,距实体中心的偏移量。 |
Returns:
一个Promise,如果缩放成功,则解析为true;如果当前未在场景中可视化目标,或者取消了缩放,则为false。
二、camera
方法 | 参数 | 区别 |
flyTo |
| |
flyToBoundingSphere |
| |
lookAt |
| |
lookAtTransform |
| |
setView |
|
2.1 flyTo (options)
将相机从当前位置移动到新位置。
参数
Name | Type | Description |
destination | 摄像机在WGS84(世界)坐标中的最终位置或从上向下视图中可见的矩形。 | |
orientation | Object | 可选包含方向和向上属性或航向,俯仰和横滚属性的对象。默认情况下,方向将指向在3D中朝向帧中心,在哥伦布视图中沿负z方向。向上方向将指向3D局部正北哥伦布视图中的y方向。在无限滚动模式下,二维不使用方向。 |
duration | Number | 可选飞行持续时间(以秒为单位)。如果省略,Cesium会尝试根据航班飞行的距离来计算理想持续时间。 |
complete | 可选飞行结束后执行的功能。 | |
cancel | 可选取消航班后执行的功能。 | |
endTransform | 可选表示飞行完成后相机将位于的参考帧的变换矩阵。 | |
maximumHeight | Number | 可选飞行高峰时的最大高度。 |
pitchAdjustHeight | Number | 可选如果相机的飞行角度高于该值,请在飞行过程中调整俯仰角度以向下看,并将地球保持在视口中。 |
flyOverLongitude | Number | 可选地球上2点之间总是有两种方法。此选项会迫使相机选择战斗方向以在该经度上飞行。 |
flyOverLongitudeWeight | Number | 可选仅在通过flyOverLongitude指定的lon上飞过,只要该方式的时间不超过flyOverLongitudeWeight的短途时间。 |
convert | Boolean | 可选是否将目的地从世界坐标转换为场景坐标(仅在不使用3D时相关)。默认为 true 。 |
easingFunction | 可选控制在飞行过程中如何插值时间。 |
Throws:
DeveloperError :如果给出方向或向上,则都需要。
Example:
// 1. Fly to a position with a top-down view
viewer.camera.flyTo({
destination : Cesium.Cartesian3.fromDegrees(-117.16,32.71,15000.0)
});
// 2. Fly to a Rectangle with a top-down view
viewer.camera.flyTo({
destination : Cesium.Rectangle.fromDegrees(west, south, east, north)
});
// 3. Fly to a position with an orientation using unit vectors.
viewer.camera.flyTo({
destination : Cesium.Cartesian3.fromDegrees(-122.19,46.25,5000.0),
orientation :{
direction :newCesium.Cartesian3(-0.04231243104240401,-0.20123236049443421,-0.97862924300734),
up :newCesium.Cartesian3(-0.47934589305293746,-0.8553216253114552,0.1966022179118339)
}
});
// 4. Fly to a position with an orientation using heading, pitch and roll.
viewer.camera.flyTo({
destination : Cesium.Cartesian3.fromDegrees(-122.19,46.25,5000.0),
orientation :{
heading : Cesium.Math.toRadians(175.0),
pitch : Cesium.Math.toRadians(-35.0),
roll :0.0
}
});
2.2 flyToBoundingSphere (boundingSphere, options )
将相机移到当前视图包含所提供的包围球的位置。
偏移是在以边界球的中心为中心的局部东-北-上参考系中的航向/俯仰/范围。航向角和俯仰角在局部的北北向上参考系中定义。航向是从y轴到x轴的角度。间距是从xy平面开始的旋转。正螺距角度在平面下方。负俯仰角在平面上方。范围是距中心的距离。如果范围是零,则将计算范围以使整个边界球都可见。
在2D和Columbus视图中,必须有一个俯视图。摄像机将被放置在目标上方并向下看。上方的高度目标将是范围。标题将与当地北部对齐。
参数
Name | Type | Description |
boundingSphere | 要查看的边界球,以世界坐标表示。 | |
options | Object | 可选具有以下属性的对象: |
名称 | 类型 | 说明 |
duration | 数字 | 可选飞行持续时间(以秒为单位)。如果省略,Cesium会尝试根据航班飞行的距离来计算理想持续时间。 |
offset | 可选在局部东北朝上的参考框中,距目标的偏移量。 | |
complete | 可选飞行结束后执行的功能。 | |
cancel | 可选取消航班后执行的功能。 | |
endTransform | 可选表示飞行完成后相机将位于的参考帧的变换矩阵。 | |
maximumHeight | 数字 | 可选飞行高峰时的最大高度。 |
pitchAdjustHeight | 数字 | 可选如果相机的飞行角度高于该值,请在飞行过程中调整俯仰角度以向下看,并将地球保持在视口中。 |
flyOverLongitude | 数字 | 可选地球上2点之间总是有两种方法。此选项会迫使相机选择战斗方向以在该经度上飞行。 |
flyOverLongitudeWeight | 数字 | 可选仅在通过flyOverLongitude指定的lon上飞过,只要该方式的时间不超过flyOverLongitudeWeight的短途时间。 |
easingFunction | 可选控制在飞行过程中如何插值时间。 |
2.3 lookAt (target, offset)
使用目标和偏移量设置摄像机的位置和方向。目标必须在世界坐标。偏移可以是笛卡尔坐标系,也可以是以目标为中心的局部北北向上参考系中的航向/俯仰/范围。如果偏移量是笛卡尔坐标,则它是相对于转换矩阵定义的参考帧中心的偏移量。如果偏移如果是航向/俯仰/范围,则航向和俯仰角在变换矩阵定义的参考系中定义。航向是从y轴到x轴的角度。间距是从xy平面开始的旋转。正螺距角度在平面下方。负俯仰角在平面上方。范围是距中心的距离。在2D中,必须有一个俯视图。摄像机将被放置在目标上方并向下看。上方的高度目标将是偏移量的大小。航向将根据偏移量确定。如果标题不能根据偏移量确定,航向将为北。
参数
Name | Type | Description |
target | 世界坐标中的目标位置。 | |
offset | 在局部东北朝上的参考框中,距目标的偏移量。 |
Throws:
DeveloperError :变形时不支持lookAt。
Example:
// 1. Using a cartesian offset
var center = Cesium.Cartesian3.fromDegrees(-98.0,40.0);
viewer.camera.lookAt(center,newCesium.Cartesian3(0.0,-4790000.0,3930000.0));
// 2. Using a HeadingPitchRange offset
var center = Cesium.Cartesian3.fromDegrees(-72.0,40.0);var heading = Cesium.Math.toRadians(50.0);var pitch = Cesium.Math.toRadians(-20.0);var range =5000.0;
viewer.camera.lookAt(center,newCesium.HeadingPitchRange(heading, pitch, range));
2.4 lookAtTransform (transform, offset )
使用目标和变换矩阵设置相机的位置和方向。偏移可以是笛卡尔坐标或航向/俯仰/范围。如果偏移量是笛卡尔坐标,则它是相对于转换矩阵定义的参考帧中心的偏移量。如果偏移如果是航向/俯仰/范围,则航向和俯仰角在变换矩阵定义的参考系中定义。航向是从y轴到x轴的角度。间距是从xy平面开始的旋转。正螺距角度在平面下方。负俯仰角在平面上方。范围是距中心的距离。在2D中,必须有一个俯视图。相机将放置在参考框中心上方。上方的高度目标将是偏移量的大小。航向将根据偏移量确定。如果标题不能根据偏移量确定,航向将为北。
参数
Name | Type | Description |
transform | 定义参考框架的变换矩阵。 | |
offset | 可选在以目标为中心的参考帧中与目标的偏移。 |
Throws:
DeveloperError :变形时不支持lookAtTransform。
Example:
// 1. Using a cartesian offset
var transform = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(-98.0,40.0));
viewer.camera.lookAtTransform(
transform,
new Cesium.Cartesian3(0.0,-4790000.0,3930000.0)
);
// 2. Using a HeadingPitchRange offset
var transform = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(-72.0,40.0));
var heading = Cesium.Math.toRadians(50.0);
var pitch = Cesium.Math.toRadians(-20.0);
var range =5000.0;
viewer.camera.lookAtTransform(
transform,
new Cesium.HeadingPitchRange(heading, pitch, range)
);
2.5 setView (options)
设置相机的位置,方向和变换。
参数
options(Object)
名称 | 类型 | 说明 |
destination | Cartesian3 | 矩形 | 可选摄像机在WGS84(世界)坐标中的最终位置或从上向下视图中可见的矩形。 |
direction | 对象 | 可选包含方向和向上属性或航向,俯仰和横滚属性的对象。默认情况下,方向将指向在3D中朝向帧中心,在哥伦布视图中沿负z方向。向上方向将指向3D局部正北哥伦布视图中的y方向。在无限滚动模式下,二维不使用方向。 |
endTransform | 可选转换代表摄像机参考帧的矩阵。 | |
转换 | 布尔值 | 可选是否将目的地从世界坐标转换为场景坐标(仅在不使用3D时相关)。默认为 true 。 |
Example:
// 1. Set position with a top-down view
viewer.camera.setView({
destination : Cesium.Cartesian3.fromDegrees(-117.16, 32.71, 15000.0)
});
// 2 Set view with heading, pitch and roll
viewer.camera.setView({
destination : cartesianPosition,
orientation: {
heading : Cesium.Math.toRadians(90.0), // east, default value is 0.0 (north)
pitch : Cesium.Math.toRadians(-90), // default value (looking down)
roll : 0.0 // default value
}
});
// 3. Change heading, pitch and roll with the camera position remaining the same.
viewer.camera.setView({
orientation: {
heading : Cesium.Math.toRadians(90.0), // east, default value is 0.0 (north)
pitch : Cesium.Math.toRadians(-90), // default value (looking down)
roll : 0.0 // default value
}
});
// 4. View rectangle with a top-down view
viewer.camera.setView({
destination : Cesium.Rectangle.fromDegrees(west, south, east, north)
});
// 5. Set position with an orientation using unit vectors.
viewer.camera.setView({
destination : Cesium.Cartesian3.fromDegrees(-122.19, 46.25, 5000.0),
orientation : {
direction : new Cesium.Cartesian3(-0.04231243104240401, -0.20123236049443421, -0.97862924300734),
up : new Cesium.Cartesian3(-0.47934589305293746, -0.8553216253114552, 0.1966022179118339)
}
});
相机参数
我们不管使用哪种方式,基本上都是先确定相机要飞到的某一个位置,如点、矩形、包围球等,然后再结合相机的三个参数heading、pitch、roll或range实现某一位置视角的计算。下面主要介绍这三个参数。
我们知道Cesium使用的是笛卡尔空间直角坐标系,X、Y、Z三个轴的正方向如下图所示:
相机的三个参数heading、pitch、roll的值是针对于坐标轴旋转的弧度数,示意图如下所示:
heading:偏航角(弧度)——左右摇头
绕负Z轴旋转,顺时针为正,默认为正北方向0,其中正角向东增加。控制机体头的朝向位置,即左右方向的改变。
pitch:俯仰角(弧度)——上下点头
绕负Y轴旋转,顺时针为正,默认为俯视-90。正俯仰角在飞机上方,负俯仰角在飞机下方。可简单理解成前空翻、后空翻。
roll:翻滚角(弧度)——左右偏头(歪头),注意左右摇头区别
绕正x轴旋转,顺时针为正,默认为0。可简单理解成侧空翻。
range:范围(米)
代表相机距离目标的距离。