下面代码中实现的是左边三维,右边二维联动效果。如果需要两边三维的可以看着修改下就行了,也很简单
<body>
<div class="viewer">
<div id="left-viewer"></div>
<div id="right-viewer"></div>
</div>
<script>
const leftViewer = new Cesium.Viewer('left-viewer', {
terrainProvider: Cesium.createWorldTerrain(),
sceneModePicker: false,
infoBox: false,
shouldAnimate: true,
timeline: false,
animation: false,
})
const rightViewer = new Cesium.Viewer('right-viewer', {
sceneMode: Cesium.SceneMode.SCENE2D,
terrainProvider: Cesium.createWorldTerrain(),
sceneModePicker: false,
infoBox: false,
shouldAnimate: true,
timeline: false,
animation: false,
})
const MOUSE_TYPE = {
LEFT: 0,
RIGHT: 1
}
window.mouseType = MOUSE_TYPE.LEFT
const leftHandler = new Cesium.ScreenSpaceEventHandler(leftViewer.canvas)
leftHandler.setInputAction(() => {
window.mouseType = MOUSE_TYPE.LEFT
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
leftViewer.scene.postRender.addEventListener(() => {
if (window.mouseType === MOUSE_TYPE.RIGHT) return
const destination = Cesium.Cartographic.toCartesian(leftViewer.camera.positionCartographic)
rightViewer.camera.setView({
destination: new Cesium.Cartesian3(destination.x, destination.y, destination.z),
})
})
const rightHandler = new Cesium.ScreenSpaceEventHandler(rightViewer.canvas)
rightHandler.setInputAction(() => {
window.mouseType = MOUSE_TYPE.RIGHT
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
rightViewer.scene.postRender.addEventListener(() => {
if (window.mouseType === MOUSE_TYPE.LEFT) return
const destination = Cesium.Cartographic.toCartesian(rightViewer.camera.positionCartographic)
leftViewer.camera.setView({
destination: new Cesium.Cartesian3(destination.x, destination.y, destination.z),
orientation: {
heading: leftViewer.camera.heading,
pitch: leftViewer.camera.pitch,
roll: leftViewer.camera.roll
}
})
})
</script>
</body>