From cee560775962d3141360e5297126abbcca8e58fb Mon Sep 17 00:00:00 2001 From: jihongshun <1151753686@qq.com> Date: 星期三, 23 七月 2025 10:27:55 +0800 Subject: [PATCH] 创建模板优化键盘功能 --- src/utils/components/init-map.vue | 331 +++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 247 insertions(+), 84 deletions(-) diff --git a/src/utils/components/init-map.vue b/src/utils/components/init-map.vue index f26094c..3442bf7 100644 --- a/src/utils/components/init-map.vue +++ b/src/utils/components/init-map.vue @@ -8,11 +8,63 @@ <div class="cesiumBotton"> <div class="cesiumButtonGroup"> <el-button id="groundPoi" @click="addGroundPoi()" type="primary">鍦伴潰鐐�</el-button> - <el-button id="groundPoi" @click="addGroundPoi()" type="primary">绌轰腑鐐�</el-button> - <el-button id="groundPoi" @click="addGroundPoi()" type="primary">鍋滅暀鏃堕棿</el-button> + <!-- <el-button id="groundPoi" @click="addGroundPoi()" type="primary">鍋滅暀鏃堕棿</el-button> --> <el-input v-model="mergeNumber" placeholder="璇疯緭鍏ュ悎骞惰寖鍥�" type="number" style="width: 150px;"></el-input> <el-button @click="mergePoint()" type="success">鍚堝苟</el-button> + <el-button @click="renderData()" type="success">鏁版嵁娓叉煋</el-button> + <!-- <el-button @click="VisualCone()" type="success">鐢熸垚瑙嗛敟浣�</el-button> --> + </div> + <div class="key-container"> + <div class="arrow-row"> + <div + class="arrow" + :class="{ active: activeKey === 'w' }" + >W</div> + </div> + <div class="key-row"> + <div + class="key" + :class="{ active: activeKey === 'a' }" + @mousedown="handleClick('a')" + >A</div> + <div + class="key" + :class="{ active: activeKey === 's' }" + @mousedown="handleClick('s')" + >S</div> + <div + class="key" + :class="{ active: activeKey === 'd' }" + @mousedown="handleClick('d')" + >D</div> + </div> + </div> + <div class="key-container"> + <div class="arrow-row"> + <div + class="arrow" + :class="{ active: activeKey === 'ArrowUp' }" + @mousedown="handleClick('ArrowUp')" + >鈫�</div> + </div> + <div class="key-row"> + <div + class="key" + :class="{ active: activeKey === 'ArrowLeft' }" + @mousedown="handleClick('ArrowLeft')" + >鈫�</div> + <div + class="key" + :class="{ active: activeKey === 'ArrowDown' }" + @mousedown="handleClick('ArrowDown')" + >鈫�</div> + <div + class="key" + :class="{ active: activeKey === 'ArrowRight' }" + @mousedown="handleClick('ArrowRight')" + >鈫�</div> + </div> </div> </div> @@ -36,12 +88,23 @@ let viewerM; let viewerC; let counter = 0; -let pois = [125.1541, 46.5542,0] +let globalon = 0 +let globalat = 0 +let pois = [globalon, globalat,0] + +// let pois = [0, 0,0] let holdingPosition; let rightKeyMove = false -// let pois = [125.1541, 46.5542,0] let distance = 100; export default { + props: { + towerUrl: { + type: String, + default() { + return '' + } + }, + }, data(){ return{ moveSpeed: 1, @@ -63,22 +126,30 @@ space: false, }, animationFrameId: null, - mergeNumber:null + mergeNumber:null, + activeKey: null, + timer: null, + handler: null, + frustumPrimitive: null, + selected: false, } }, mounted(){ - console.log('111111111111111111') this.initCesium(); }, beforeDestroy() { + counter = 0 this.removeKeyboardEvents(); if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId); + window.removeEventListener("keydown", this.handleKeydown); if (viewerC) viewerC.destroy(); }, methods:{ initCesium() { viewerM = this.initViewer(this.$refs.cesiumContainer.id); viewerC = this.initViewer(this.$refs.cesiumCamera.id); + window.viewerM = viewerM; + window.viewerC = viewerC; // 馃挕 鍦ㄨ繖閲岀户缁皟鐢� measure.js / camera.js / botton.js 绛夐�昏緫 // 渚嬪锛歸indow.registerMeasureTools(viewerM) setTimeout(()=>{ @@ -108,8 +179,6 @@ initViewer(cesiumId){ //cesium鍏ㄧ悆30绫冲垎杈ㄧ巼鍦板舰璧勬簮token let imageryProvider1 = new Cesium.TileMapServiceImageryProvider({ - // url: process.env.VUE_APP_BASE_GIS + "/daqing/dom-sea", - // url: process.env.VUE_APP_BASE_GIS + "/daqing/dom-sea", url: `https://192.168.1.2:9999/daqing/dom-sea/`, }); let viewer = new Cesium.Viewer(cesiumId, { @@ -124,6 +193,7 @@ navigationHelpButton: false, navigationInstructionsInitiallyVisible: false, imageryProvider: imageryProvider1, + // imageryProvider: false, shadows: false, animation: false, infoBox: false, @@ -132,14 +202,19 @@ fullscreenButton: false, vrButton: false, }); - window.viewer = viewer; + // 鍏抽棴澶╃┖鐩掓晥鏋� + // viewer.scene.skyAtmosphere = undefined; // 鎴栬�呰缃负 null + + // // 鍏抽棴鍏夌収鏁堟灉 + // viewer.scene.globe.enableLighting = false; // 鍏抽棴鍏夌収鏁堟灉 + // viewer.imageryLayers.add(bdtvectoranoimagery); viewer._cesiumWidget._creditContainer.style.display="none"; return viewer; }, loadModel(){ - const modelUrl = 'http://192.168.1.2:9001/model/tower.glb'; // GLB妯″瀷璺緞 + const modelUrl = this.towerUrl; // GLB妯″瀷璺緞 // 娌垮師鐐瑰潗鏍囧拰鍦伴潰鐐瑰潗鏍囨柟鍚戜笂閫夊彇绌轰腑鐐圭殑璺濈 //鍒濆鍖栫浉鏈虹獥鍙h瑙掑弬鏁� cameraPostion = viewerM.camera.position @@ -149,17 +224,18 @@ // 璁剧疆瑙嗚锛屼娇鍏堕粯璁ゆ煡鐪嬫煇涓湴鐞嗕綅缃� viewerM.scene.camera.setView({ - destination: Cesium.Cartesian3.fromDegrees(125.1511, 46.5542, 349.0), // 浠ョ粡绾害璁剧疆浣嶇疆锛堜緥濡傦細澶у簡榫欏叴璺級 + destination: Cesium.Cartesian3.fromDegrees(globalon, globalat, 349.0), // 浠ョ粡绾害璁剧疆浣嶇疆锛堜緥濡傦細澶у簡榫欏叴璺級 + // destination: Cesium.Cartesian3.fromDegrees(0.0005, 0.0017, 207.8), // 浠ョ粡绾害璁剧疆浣嶇疆锛堜緥濡傦細澶у簡榫欏叴璺級 orientation: { - heading: Cesium.Math.toRadians(86.94), // 鏂瑰悜 - pitch: Cesium.Math.toRadians(-30.22), // 淇 + heading: Cesium.Math.toRadians(194.65), // 鏂瑰悜 + pitch: Cesium.Math.toRadians(-31.43), // 淇 roll: 0 } }); //鍒涘缓妯″瀷 const glbModelPoi = Cesium.Cartesian3.fromDegrees(pois[0], pois[1],pois[2]); - const heading = Cesium.Math.toRadians(10); + const heading = Cesium.Math.toRadians(0); const pitch = Cesium.Math.toRadians(0); const roll = Cesium.Math.toRadians(0); const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll); @@ -174,7 +250,6 @@ orientation: orientations, model: { uri: url, - scale: 20, shadows: Cesium.ShadowMode.DISABLED, imageBasedLightingFactor: new Cesium.Cartesian2(1, 0.5) } @@ -184,6 +259,7 @@ // 瀛樹笅鍥炶皟浠ヤ究閿�姣� // this._preRenderCallback = () => this.syncViewer(); viewerM.scene.preRender.addEventListener( this.syncViewer()); + window.addEventListener("keydown", this.handleKeydown); }, syncViewer(){ console.log(viewerM.camera) @@ -214,9 +290,6 @@ } }, addGroundPoi() { - console.log('1111111111111111') - console.log(new Cesium.ScreenSpaceEventHandler(viewerM.canvas)) - console.log(this) let createPinHandler = new Cesium.ScreenSpaceEventHandler(viewerM.canvas); let _this = this createPinHandler.setInputAction(function (click) { @@ -232,7 +305,6 @@ let lng = Cesium.Math.toDegrees(cartographic.longitude); let lat = Cesium.Math.toDegrees(cartographic.latitude); height = cartographic.height; - // camPosition = lng+','+lat+','+height; console.log(lng+','+lat+','+height) } @@ -263,45 +335,12 @@ 聽聽聽聽const scalerNormalize聽=聽Cesium.Cartesian3.multiplyByScalar(normalize,distance,new聽Cesium.Cartesian3()); const tagert = Cesium.Cartesian3.add(holdingPosition,scalerNormalize,new聽Cesium.Cartesian3()); console.log(Cesium.Cartographic.fromCartesian(tagert)) - var airCartographic= Cesium.Cartographic.fromCartesian(tagert) - var airPointLongitude= Cesium.Math.toDegrees(airCartographic.longitude); - var airPointLatitude = Cesium.Math.toDegrees(airCartographic.latitude); - var airPointHeight = airCartographic.height; _this.creatPin("aerialPoiId"+counter,tagert,`绌�${counter}`,Cesium.Color.RED,viewerM); _this.updateCameraMovement(); - // console.log(direction) - // console.log(normalize聽) - // console.log(longitude) - // console.log(latitude) - // console.log(pois) - // console.log(azimuthtwopoi(longitude,latitude,pois[0],pois[1])) - // let data = { - // id:(Date.now().toString(16) + Math.random().toString(16).slice(2, 10)).slice(0, 16), - // label:`鍦伴潰鐐�${counter}`, - // longitude:longitude, - // latitude:latitude, - // height:height, - // children:[ - // { - // id:(Date.now().toString(16) + Math.random().toString(16).slice(2, 10)).slice(0, 16), - // label:`绌轰腑鐐�${counter}`, - // longitude:airPointLongitude, - // latitude:airPointLatitude, - // height:airPointHeight, - // } - // ] - // } - // _this.$emit('rightClickEnd',data) //缁撴潫鍙抽敭鐩戝惉 createPinHandler.destroy(); //缁撴潫涓诲浘鑱斿姩楣扮溂鐩戝惉 viewerM.scene.preRender.removeEventListener(_this.syncViewer()); - // viewerM.scene.preRender.removeEventListener(this._preRenderCallback); - // if (this._preRenderCallback) { - // this.viewerM.scene.preRender.removeEventListener(this._preRenderCallback); - // this._preRenderCallback = null; - // } - //鏇存柊鐩告満瑙嗚涓虹┖涓偣 _this.changeCamera(tagert,_this.azimuthtwopoi(longitude,latitude,pois[0],pois[1])); rightKeyMove = true counter += 1; @@ -341,7 +380,6 @@ }); }, registerKeyboardEvents() { - console.log('11111111111111111111111') window.addEventListener("keydown", this.onKeyDown); window.addEventListener("keyup", this.onKeyUp); }, @@ -401,9 +439,6 @@ case "1": viewerC.scene.mode = Cesium.SceneMode.SCENE3D; break; - // case "2": - // viewerC.scene.mode = Cesium.SceneMode.SCENE2D; - // break; case "3": viewerC.scene.mode = Cesium.SceneMode.COLUMBUS_VIEW; break; @@ -411,22 +446,16 @@ }, onKeyUp(event) { //閿洏鎶捣杩涜鏇存柊宸︿晶绌轰腑鐐筽in - console.log(viewerM) - console.log(counter) //鑾峰彇鍙充晶鐩告満 if(rightKeyMove){ const camera = viewerC.camera; - console.log(camera) const carto = Cesium.Cartographic.fromCartesian(camera.position); - console.log(carto) //鍙充晶鐩告満瑙嗚杞寲涓虹粡绾害 const lon = Cesium.Math.toDegrees(carto.longitude); const lat = Cesium.Math.toDegrees(carto.latitude); const height = carto.height; const position = Cesium.Cartesian3.fromDegrees(lon, lat, height) - console.log(position) let pinBuilder = new Cesium.PinBuilder(); - // const dest = this.calculateDestinationPoint(lon, lat, camera.heading, speed); const groupEntity = viewerM.entities.getById("aerialPoiId"+(counter-1)); //宸︿晶鍦板浘鍚屾鏇存柊pin绌轰腑鐐逛綅缃� if (groupEntity == undefined) { @@ -501,6 +530,7 @@ } }, updateCameraMovement() { + console.log('111111111111111111111111111111111111111111') const camera = viewerC.camera; // Adjust speed by modifiers let currentSpeed = this.moveSpeed; @@ -521,17 +551,8 @@ let rotSpeed = 1; if (this.keyState.shift) rotSpeed *= this.speedMultiplier; if (this.keyState.ctrl) rotSpeed *= this.slowMultiplier; - const multiplyByScalarrotateAmount = Cesium.Math.toRadians(0.5 * rotSpeed); - - // if (this.keyState.up) camera.lookUp(rotateAmount); - // if (this.keyState.down) camera.lookDown(rotateAmount); - // if (this.keyState.left) camera.lookLeft(rotateAmount); - // if (this.keyState.right) camera.lookRight(rotateAmount); if (holdingPosition) { - // const groupPosition = groupEntity.position.getValue(Cesium.JulianDate.now()); - // console.log(groupPosition) const distance = Cesium.Cartesian3.distance(holdingPosition, camera.position); - const surroundSpeed = 0.005; //鐜粫閫熷害,瑙掑害 let cameraHeading = camera.heading; let cameraPitch = camera.pitch; @@ -548,9 +569,8 @@ if (this.keyState.right) camera.lookRight(rotateAmount); } this.resetRoll(); - // Schedule next frame - this.animationFrameId = requestAnimationFrame(this.updateCameraMovement); + // this.animationFrameId = requestAnimationFrame(this.updateCameraMovement); }, calculateDestinationPoint(lon1, lat1, bearing, distance, radius = 6371000) { const toRad = (d) => d * Math.PI / 180; @@ -573,9 +593,7 @@ return { lon: toDeg(lon2Norm), lat: toDeg(lat2Rad) }; }, - uavMoveForward(speed) { - console.log('11111' +speed) const camera = viewerC.camera; const carto = Cesium.Cartographic.fromCartesian(camera.position); const lon = Cesium.Math.toDegrees(carto.longitude); @@ -626,15 +644,11 @@ cammove_measure_point(){ CesiumSurvey.cammeasureMovePoint(viewerM,'cammoveResultCon'); }, + renderData(){ + this.$emit('renderData',viewerM) + }, mergePoint(){ let allEntities = viewerM.entities.values; // 鎵�鏈夊疄浣撳璞$粍鎴愮殑鏁扮粍 - console.log(allEntities) - allEntities.forEach(entity => { - console.log('ID:', entity.id); - console.log('Position:', entity.position ? entity.position.getValue(Cesium.JulianDate.now()) : null); - console.log('Name:', entity.name); - console.log('Properties:', entity.properties); // 鑷畾涔夊睘鎬� - }); const grouped = {}; //鎵�鏈夊疄浣撳璞$粍鎴愮殑鏁扮粍杞崲鎴愬乏渚ф爲闇�瑕佺殑鏍煎紡 allEntities.forEach(item => { @@ -669,7 +683,6 @@ ] }; }); - console.log(result) this.$emit('mergePoint',result,this.mergeNumber,viewerM) }, genId() { @@ -683,7 +696,114 @@ latitude: Cesium.Math.toDegrees(cartographic.latitude), height: cartographic.height }; - } + }, + handleClick(key) { + this.triggerKey(key); + }, + triggerKey(key) { + this.activeKey = key; + clearTimeout(this.timer); + this.timer = setTimeout(() => { + this.activeKey = null; + }, 200); + + // 鑷畾涔夊姩浣滆Е鍙� + console.log("Key triggered:", key); + // 杩欓噷鍙互鍙戝嚭浜嬩欢鎴栬皟鐢ㄥ叾瀹冩柟娉� + }, + handleKeydown(e) { + const key = e.key; + console.log(key) + const validKeys = ["a", "s", "d", "w",'q','e','ArrowUp','ArrowDown','ArrowLeft','ArrowRight','q','e']; + if (validKeys.includes(key)) { + this.triggerKey(key); + } + this.updateCameraMovement() + }, + VisualCone(){ + this.addFrustum(); + this.initDragHandler(); + }, + addFrustum() { + // 鍒涘缓涓�涓� PerspectiveFrustum + const frustum = new Cesium.PerspectiveFrustum({ + fov: Cesium.Math.PI_OVER_THREE, + aspectRatio: 1.0, + near: 1.0, + far: 500.0, + }); + + // 璁剧疆鐭╅樀浣嶇疆 + const position = Cesium.Cartesian3.fromDegrees(110.0, 30.0, 100.0); + const direction = Cesium.Cartesian3.normalize( + new Cesium.Cartesian3(1.0, 0.0, -1.0), + new Cesium.Cartesian3() + ); + const up = Cesium.Cartesian3.UNIT_Z; + const right = Cesium.Cartesian3.cross(direction, up, new Cesium.Cartesian3()); + const rotation = Cesium.Matrix3.setColumns( + new Cesium.Matrix3(), + right, + up, + Cesium.Cartesian3.negate(direction, new Cesium.Cartesian3()) + ); + + const modelMatrix = Cesium.Matrix4.fromRotationTranslation(rotation, position); + + this.frustumPrimitive = this.viewer.scene.primitives.add( + new Cesium.DebugCameraPrimitive({ + frustum, + modelMatrix, + color: Cesium.Color.LIME.withAlpha(0.5), + }) + ); + }, + + initDragHandler() { + const scene = viewerM.scene; + const canvas = scene.canvas; + this.handler = new Cesium.ScreenSpaceEventHandler(canvas); + + let isDragging = false; + let lastPosition = null; + + this.handler.setInputAction((movement) => { + const pickedObject = scene.pick(movement.position); + if (pickedObject && pickedObject.primitive === this.frustumPrimitive) { + this.selected = true; + isDragging = true; + lastPosition = movement.position; + } else { + this.selected = false; + } + }, Cesium.ScreenSpaceEventType.LEFT_DOWN); + + this.handler.setInputAction((movement) => { + if (isDragging && this.selected) { + const start = scene.pickPosition(lastPosition); + const end = scene.pickPosition(movement.endPosition); + if (start && end) { + const delta = Cesium.Cartesian3.subtract( + end, + start, + new Cesium.Cartesian3() + ); + const newMatrix = Cesium.Matrix4.multiplyByTranslation( + this.frustumPrimitive.modelMatrix, + delta, + new Cesium.Matrix4() + ); + this.frustumPrimitive.modelMatrix = newMatrix; + lastPosition = movement.endPosition; + } + } + }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); + + this.handler.setInputAction(() => { + isDragging = false; + lastPosition = null; + }, Cesium.ScreenSpaceEventType.LEFT_UP); + }, } } </script> @@ -738,3 +858,46 @@ .box_rb{width:10px;height:10px;position:absolute;border-bottom:2px solid #00d3e7;border-right:2px solid #00d3e7;right:0px;bottom:0px;} .box_lb{width:10px;height:10px;position:absolute;border-bottom:2px solid #00d3e7;border-left:2px solid #00d3e7;left:0px;bottom:0px;} </style> + +<style scoped> +.key-container { + display: inline-block; + background-color: rgba(0, 0, 0, 0.7); + padding: 8px 10px; + border-radius: 10px; + color: white; + font-family: sans-serif; + margin-top: 55px; +} + +.arrow-row{ + display: flex; + justify-content: center; + margin-bottom: 4px; +} +.key-row { + display: flex; + justify-content: space-between; + margin-bottom: 4px; +} + +.arrow, +.key { + width: 30px; + height: 30px; + margin: 0 2px; + background-color: #333; + border-radius: 4px; + display: flex; + justify-content: center; + align-items: center; + font-weight: bold; + transition: background-color 0.2s; + cursor: pointer; +} + +.arrow.active, +.key.active { + background-color: #00aaff; +} +</style> \ No newline at end of file -- Gitblit v1.9.3