Cesium 二三维切换
Cesium 二三维切换
关键是切换后视角的计算
使用mars3d的map.setCameraView:
switch2D3D() {
let map = getMap();
if (!map) return;
let view = map.getCameraView();
if (map.scene.mode == Cesium.SceneMode.SCENE3D) {
let pitch = ((0 - view.pitch) * Math.PI) / 180;
let length = view.alt / Math.tan(pitch);
let newAlt = view.alt / Math.sin(pitch);
let pos = getNextPosition(view.lng, view.lat, 0 - view.heading, length);
let pos2 = toDegrees(map, pos);
map.setCameraView(
{
lng: pos2.lng,
lat: pos2.lat,
alt: newAlt,
},
{
complete: () => {
map.scene.mode = Cesium.SceneMode.SCENE2D;
},
}
);
} else {
map.scene.mode = Cesium.SceneMode.SCENE3D;
let pitch = (25 * Math.PI) / 180;
let length = view.alt * Math.cos(pitch);
let newAlt = view.alt * Math.sin(pitch);
let pos = getNextPosition(
view.lng,
view.lat,
180 - view.heading,
length
);
let pos2 = toDegrees(map, pos);
map.setCameraView({
lng: pos2.lng,
lat: pos2.lat,
alt: newAlt,
heading: view.heading,
pitch: -25,
});
}
}
使用cesium的scene.camera.flyTo:
switch2D3D() {
let map = getMap();
if (!map) return;
let view = map.getCameraView();
if (map.scene.mode == Cesium.SceneMode.SCENE3D) {
let pitch = ((0 - view.pitch) * Math.PI) / 180;
let length = view.alt / Math.tan(pitch);
let newAlt = view.alt / Math.sin(pitch);
let pos = getNextPosition(view.lng, view.lat, 0 - view.heading, length);
let pos2 = toDegrees(map, pos);
map.scene.camera.flyTo({
destination: new Cesium.Cartesian3.fromDegrees(
pos2.lng,
pos2.lat,
newAlt
),
complete: () => {
map.scene.mode = Cesium.SceneMode.SCENE2D;
},
});
} else {
map.scene.mode = Cesium.SceneMode.SCENE3D;
let pitch = (25 * Math.PI) / 180;
let length = view.alt * Math.cos(pitch);
let newAlt = view.alt * Math.sin(pitch);
let pos = getNextPosition(
view.lng,
view.lat,
180 - view.heading,
length
);
let pos2 = toDegrees(map, pos);
map.scene.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(
pos2.lng,
pos2.lat,
newAlt
),
orientation: {
heading: Cesium.Math.toRadians(view.heading),
pitch: Cesium.Math.toRadians(-25.0),
roll: 0.0,
},
});
}
}

浙公网安备 33010602011771号