const modelUrl = 'http://192.168.1.21:9999/powerTower.glb'; // GLB模型路径 const pois = [125.1541, 46.5542, 236]; //glb模型原点坐标 const distance = 100; // 沿原点坐标和地面点坐标方向上选取空中点的距离 //初始化相机窗口视角参数 let cameraPostion = viewerM.camera.position; let cameraHeading = viewerM.camera.heading; let cameraPitch = viewerM.camera.pitch; let cameraRoll = viewerM.camera.roll; // 设置视角,使其默认查看某个地理位置 viewerM.scene.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(125.1511, 46.5542, 349.0), // 以经纬度设置位置(例如:大庆龙兴路) orientation: { heading: Cesium.Math.toRadians(86.94), // 方向 pitch: Cesium.Math.toRadians(-30.22), // 俯角 roll: 0 } }); //创建模型 const glbModelPoi = Cesium.Cartesian3.fromDegrees(pois[0], pois[1], pois[2]); const heading = Cesium.Math.toRadians(10); const pitch = Cesium.Math.toRadians(0); const roll = Cesium.Math.toRadians(0); const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll); const orientations = Cesium.Transforms.headingPitchRollQuaternion(glbModelPoi, hpr); creatModel(glbModelPoi, orientations, modelUrl, viewerM); creatModel(glbModelPoi, orientations, modelUrl, viewerC); // 同步函数:鹰眼地图同步主地图的视角 const syncViewer = () => { viewerC.camera.flyTo({ destination: viewerM.camera.position, orientation: { heading: viewerM.camera.heading, pitch: viewerM.camera.pitch, roll: cameraRoll }, duration: 0.0 // 设置为 0.0 以立即完成同步 }); }; // 监听主地图的视图更新事件,在主地图更新时同步鹰眼地图 viewerM.scene.preRender.addEventListener(syncViewer); //创建地面点 //初始化变量 let counter = 0; function addGroundPoi() { let createPinHandler = new Cesium.ScreenSpaceEventHandler(viewerM.canvas); createPinHandler.setInputAction(function (click) { let cartesian = viewerM.scene.pickPosition(click.position); if (Cesium.defined(cartesian)) { let cartographic = Cesium.Cartographic.fromCartesian(cartesian); let height = cartographic.height; //模型高度 if (Number(height) < 0) { let ray = viewerM.camera.getPickRay(click.position); cartesian = viewerM.scene.globe.pick(ray, viewerM.scene); } cartographic = Cesium.Cartographic.fromCartesian(cartesian); let lng = Cesium.Math.toDegrees(cartographic.longitude); let lat = Cesium.Math.toDegrees(cartographic.latitude); height = cartographic.height; camPosition = lng + ',' + lat + ',' + height; } //在两个窗口创建标注 creatPin('groundPoiId' + counter, cartesian.clone(), '观', Cesium.Color.BLUE, viewerM); creatPin('groundPoiId' + counter, cartesian.clone(), '观', Cesium.Color.BLUE, viewerC); }, Cesium.ScreenSpaceEventType.LEFT_CLICK); // 右键点击结束监听,并创建空中点 createPinHandler.setInputAction(function (click) { // 获取实体 const groupEntity = viewerM.entities.getById('groundPoiId' + counter); const groupPosition = groupEntity.position.getValue(Cesium.JulianDate.now()); if (groupPosition) { // 如果位置存在,将其转换为经纬度 const cartographic = Cesium.Cartographic.fromCartesian(groupPosition); const longitude = Cesium.Math.toDegrees(cartographic.longitude); const latitude = Cesium.Math.toDegrees(cartographic.latitude); const height = cartographic.height; //根据两点坐标计算方位角 const positionA = Cesium.Cartesian3.fromDegrees(pois[0], pois[1], height); const positionB = Cesium.Cartesian3.fromDegrees(longitude, latitude, height); // 计算方向向量 const direction = Cesium.Cartesian3.subtract(positionB, positionA, new Cesium.Cartesian3()); /**计算沿方向向量移动的点**/ const normalize = Cesium.Cartesian3.normalize(direction, new Cesium.Cartesian3()); //根据偏移量求偏移向量 const scalerNormalize = Cesium.Cartesian3.multiplyByScalar( normalize, distance, new Cesium.Cartesian3() ); const tagert = Cesium.Cartesian3.add(positionB, scalerNormalize, new Cesium.Cartesian3()); creatPin('aerialPoiId' + counter, tagert, '空', Cesium.Color.RED, viewerM); console.log(direction); console.log(normalize); console.log(azimuthtwopoi(longitude, latitude, pois[0], pois[1])); //结束右键监听 createPinHandler.destroy(); //结束主图联动鹰眼监听 viewerM.scene.preRender.removeEventListener(syncViewer); //更新相机视角为空中点 changeCamera(tagert, azimuthtwopoi(longitude, latitude, pois[0], pois[1])); counter += 1; } console.log('右键点击监听已停止'); }, Cesium.ScreenSpaceEventType.RIGHT_CLICK); // 监听右键点击 } function changeCamera(position, heading) { console.log(position); console.log(heading); viewerC.camera.flyTo({ destination: position, orientation: { heading: Cesium.Math.toRadians(heading), pitch: 0, roll: 0 }, duration: 0.0 // 设置为 0.0 以立即完成同步 }); } //动态坐标 // move_measure_point(); //动态相机参数 cammove_measure_point(); //拾取坐标 // measure_point();