From ca62ae43d7614216e5d43dd905fde1fd4a260158 Mon Sep 17 00:00:00 2001 From: jihongshun <1151753686@qq.com> Date: 星期一, 28 七月 2025 17:25:33 +0800 Subject: [PATCH] 视锥体支持变倍 --- src/utils/components/init-map.vue | 461 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 352 insertions(+), 109 deletions(-) diff --git a/src/utils/components/init-map.vue b/src/utils/components/init-map.vue index 3442bf7..6cb1d61 100644 --- a/src/utils/components/init-map.vue +++ b/src/utils/components/init-map.vue @@ -4,18 +4,44 @@ <div ref="cesiumContainer" id="cesiumContainer"></div> <!-- 鐩告満瑙嗚瀹瑰櫒 --> <div ref="cesiumCamera" id="cesiumCamera"></div> + <div class="zoom-ui-container" @wheel="handleWheel"> + <!-- 涓棿榛勮壊鍑嗘槦妗� --> + <div + class="reticle" + :style="{ width: boxWidth + 'px', height: boxHeight + 'px' }" + ></div> + + <!-- 浣跨敤 ElementUI 鐨� Slider 鏇夸唬鍙樺�嶈酱 --> + <div class="zoom-bar-slider"> + <el-slider + v-model="zoomRatio" + vertical + height="200px" + :min="minZoom" + :max="maxZoom" + :step="0.1" + :format-tooltip="formatTooltip" + :marks="marks" + @input="onSliderInput" + /> + </div> + + <!-- 宸︿笅瑙掑�嶇巼淇℃伅 --> + <div class="zoom-info"> + <el-tag type="success">鍊嶇巼: {{ zoomRatio.toFixed(1) }}X</el-tag> + </div> + </div> + + + <!-- botton --> <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-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="key-container"> <div class="arrow-row"> <div class="arrow" @@ -65,7 +91,7 @@ @mousedown="handleClick('ArrowRight')" >鈫�</div> </div> - </div> + </div> --> </div> <!-- 鍔ㄦ�佸潗鏍囥�佸姩鎬佺浉鏈哄弬鏁版樉绀� --> @@ -91,7 +117,11 @@ let globalon = 0 let globalat = 0 let pois = [globalon, globalat,0] - +let cameraVideo +let ScopeElement; //鍏夎酱銆佽棰� +let preVideoScopePrimitiveArrTie = []; +let scratchSetViewMatrix3 = new Cesium.Matrix3(); +let chooseId // let pois = [0, 0,0] let holdingPosition; let rightKeyMove = false @@ -129,13 +159,29 @@ mergeNumber:null, activeKey: null, timer: null, - handler: null, - frustumPrimitive: null, - selected: false, + zoomRatio: 1, + minZoom: 1, + maxZoom: 56, + baseBoxSize: 400, + marks: { + 1: '1X', + 7: '7X', + 14: '14X', + 28: '28X', + 56: '56X' + } } }, mounted(){ this.initCesium(); + }, + computed: { + boxWidth() { + return this.baseBoxSize / this.zoomRatio; + }, + boxHeight() { + return (this.baseBoxSize * 0.75) / this.zoomRatio; // 楂樺害淇濇寔 4:3 姣斾緥 + } }, beforeDestroy() { counter = 0 @@ -156,13 +202,13 @@ this.loadModel() this.addSyncListener() this.registerKeyboardEvents(); - let control = viewerC.scene.screenSpaceCameraController; control.enableRotate = false; control.enableTranslate = false; control.enableZoom = false; control.enableTilt = false; control.enableLook = false; + viewerC.scene.camera.percentageChanged = 0.05聽 this.cammove_measure_point(); },1000) }, @@ -336,7 +382,42 @@ const tagert = Cesium.Cartesian3.add(holdingPosition,scalerNormalize,new聽Cesium.Cartesian3()); console.log(Cesium.Cartographic.fromCartesian(tagert)) _this.creatPin("aerialPoiId"+counter,tagert,`绌�${counter}`,Cesium.Color.RED,viewerM); + // preVideoScopePrimitiveArrTie = [] + console.log(preVideoScopePrimitiveArrTie) + + console.log(Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).height)) _this.updateCameraMovement(); + // if(cameraVideo){ + // viewerM.scene.primitives.remove(cameraVideo) + // } + chooseId = crypto.randomUUID() + //鍒涘缓瑙嗛敟浣� + let data = { + "FHorFieldAngle": 32.13, + "FVerFieldAngle": 18.39, + "altitude": Cesium.Cartographic.fromCartesian(tagert).height, + "id": chooseId, + "chanNo": 1, + "latitude": Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).latitude), + "longitude": Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).longitude), + "p": 26.8, + "t": 351.3, + "z": 1, + } + const point1 = Cesium.Cartesian3.fromDegrees(0, 0, 50); + const point2 = Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).longitude), Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).latitude), Cesium.Cartographic.fromCartesian(tagert).height); + + // 璁$畻璺濈锛堝崟浣嶏細绫筹級 + const distance1 = Cesium.Cartesian3.distance(point1, point2) + console.log(distance1) + data.distance = distance1 + _this.zoomRatio = 1 + _this.createVideoScope(data) + setTimeout(() => { + viewerC.camera.changed.addEventListener(_this.onCameraChange) + }, 100); + + //缁撴潫鍙抽敭鐩戝惉 createPinHandler.destroy(); //缁撴潫涓诲浘鑱斿姩楣扮溂鐩戝惉 @@ -530,7 +611,6 @@ } }, updateCameraMovement() { - console.log('111111111111111111111111111111111111111111') const camera = viewerC.camera; // Adjust speed by modifiers let currentSpeed = this.moveSpeed; @@ -639,13 +719,10 @@ viewerC.camera.flyHome(1.0); }, move_measure_point(){ - CesiumSurvey.measureMovePoint(viewerM,'moveResultCon'); + CesiumSurvey.measureMovePoint(viewerC,'moveResultCon'); }, cammove_measure_point(){ - CesiumSurvey.cammeasureMovePoint(viewerM,'cammoveResultCon'); - }, - renderData(){ - this.$emit('renderData',viewerM) + CesiumSurvey.cammeasureMovePoint(viewerC,'cammoveResultCon'); }, mergePoint(){ let allEntities = viewerM.entities.values; // 鎵�鏈夊疄浣撳璞$粍鎴愮殑鏁扮粍 @@ -683,6 +760,7 @@ ] }; }); + console.log(result) this.$emit('mergePoint',result,this.mergeNumber,viewerM) }, genId() { @@ -720,90 +798,203 @@ } 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() + // 鍒涘缓鍒濆鍖栫殑鍏夎酱 + createVideoScope(data) { + console.log(data) + console.log(data.distance) + if (data == undefined) { + this.$message({ + showClose: true, + message: '鏆傛棤鏁版嵁', + type: "warning", + }); + } else { + ScopeElement = this.createVideoElementOld( + "http://192.168.5.122:9998/live?port=1234&app=live&stream=mystream", + data.id, + 1.7778 + ); + // let poi = data.camPosition.split(","); + // let hight = data.pe_offset.split(","); + let positionCt3 = Cesium.Cartesian3.fromDegrees( + Number(data.longitude), + Number(data.latitude), + // Number(data.altitude) + Number(hight[1]) + 1.7 + Number(data.altitude) + ); + console.log(data) + let inverseViewMatrix = this.hpr2m({ + position: positionCt3, // 鐩告満鍧愭爣 + // heading: Cesium.Math.toRadians(Number(120)), + // pitch: Cesium.Math.toRadians(Number(-5)), + // roll: Cesium.Math.toRadians(Number(0)), + heading: Cesium.Math.toRadians(180), + pitch: Cesium.Math.toRadians(0), + roll: Cesium.Math.toRadians(0), + }); + let frustum = new Cesium.PerspectiveFrustum({ + fov: Cesium.Math.toRadians(1), + aspectRatio: Number(1.77778), // 瀹介珮姣� + near: Number(0.05), // 璁惧鐒﹁窛 + far: Number(data.distance), // 鎷嶆憚璺濈 + }); + cameraVideo = new Cesium.XbsjCameraVideo({ + inverseViewMatrix: inverseViewMatrix, + frustum: frustum, + videoElement: ScopeElement, + showHelperPrimitive: true, + }); + cameraVideo._primitive.classificationType = 2; //聽鍚屾椂鎶曞奖鍦板舰鍜�3dtiles鏁版嵁 + cameraVideo.id = data.id; + let isHole = false; + cameraVideo._primitive.appearance.material = new Cesium.Material({ + fabric: { + type: "Color", + uniforms: { + color: new Cesium.Color(0, 1, 0, 0.2), + }, + }, + }); + cameraVideo._helperPrimitive.geometryInstances.attributes.color = + Cesium.ColorGeometryInstanceAttribute.fromColor( + new Cesium.Color(0, 1.0, 0, 1.0) ); - const newMatrix = Cesium.Matrix4.multiplyByTranslation( - this.frustumPrimitive.modelMatrix, - delta, - new Cesium.Matrix4() - ); - this.frustumPrimitive.modelMatrix = newMatrix; - lastPosition = movement.endPosition; + // viewer.scene.primitives.add(cameraVideo); + let pmObj = {}; + console.log(data) + pmObj.id = data.id; + console.log(pmObj) + pmObj.primitive = cameraVideo; + // pmCollection.push(pmObj);//骞曞竷锛岃棰戣浆鎹娇鐢� + viewerM.scene.primitives.add(cameraVideo); + preVideoScopePrimitiveArrTie.push(pmObj); + preVideoScopePrimitiveArrTie.map((item)=>{ + console.log(item) + console.log(chooseId) + if(item.id != chooseId){ + item.primitive.show = false } - } - }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); - - this.handler.setInputAction(() => { - isDragging = false; - lastPosition = null; - }, Cesium.ScreenSpaceEventType.LEFT_UP); + }) + } + // } }, + // 鍒涘缓鍏夎酱涓嬬殑骞曞竷 + createVideoElementOld(videoSrc, id) { + var videoElement = document.createElement("div"); + videoElement.id = "video" + id; + videoElement.style.position = "absolute"; + videoElement.style.zIndex = "-100"; + videoElement.style.background = "green"; + document.getElementById("videoSource").appendChild(videoElement); + return videoElement; + }, + //h,p,r杞琺atrix4 + hpr2m(obj, result) { + // const inverseViewMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(position, headingPitchRoll, undefined, undefined, result); + const inverseViewMatrix = Cesium.Transforms.eastNorthUpToFixedFrame( + obj.position, + undefined, + result + ); + let rotMat = Cesium.Matrix3.fromRotationX( + Cesium.Math.PI_OVER_TWO, + scratchSetViewMatrix3 + ); + Cesium.Matrix4.multiplyByMatrix3( + inverseViewMatrix, + rotMat, + inverseViewMatrix + ); + rotMat = Cesium.Matrix3.fromRotationY( + -obj.heading, + scratchSetViewMatrix3 + ); + Cesium.Matrix4.multiplyByMatrix3( + inverseViewMatrix, + rotMat, + inverseViewMatrix + ); + + rotMat = Cesium.Matrix3.fromRotationX(obj.pitch, scratchSetViewMatrix3); + Cesium.Matrix4.multiplyByMatrix3( + inverseViewMatrix, + rotMat, + inverseViewMatrix + ); + + rotMat = Cesium.Matrix3.fromRotationZ(-obj.roll, scratchSetViewMatrix3); + Cesium.Matrix4.multiplyByMatrix3( + inverseViewMatrix, + rotMat, + inverseViewMatrix + ); + + return inverseViewMatrix; + }, + onCameraChange() { + const camera = viewerC.camera; + const position = camera.positionCartographic; + const heading = Cesium.Math.toDegrees(camera.heading); + const pitch = Cesium.Math.toDegrees(camera.pitch); + const roll = Cesium.Math.toDegrees(camera.roll); + const point1 = Cesium.Cartesian3.fromDegrees(0, 0, 50); + const point2 = Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(position.longitude),Cesium.Math.toDegrees(position.latitude),position.height) + // 璁$畻璺濈锛堝崟浣嶏細绫筹級 + const distanceBetween = Cesium.Cartesian3.distance(point1, point2) + console.log(distanceBetween) + console.log(preVideoScopePrimitiveArrTie) + console.log(chooseId) + preVideoScopePrimitiveArrTie.map((item)=>{ + if(item.id == chooseId){ + let obj = this.updateSZScope(Cesium.Math.toDegrees(position.longitude),Cesium.Math.toDegrees(position.latitude),position.height,heading,pitch,roll,this.zoomRatio,distanceBetween) + item.primitive.inverseViewMatrix = obj.M + item.primitive.frustum = obj.F + } + }) + }, + //鏇存柊瑙嗘浣撲綅缃� + updateSZScope(lon, lat, alt, camHeading, camPitch, camRoll, LightView,distanceBetween) { + let positionCt3 = Cesium.Cartesian3.fromDegrees( + Number(lon), + Number(lat), + Number(alt) + ); + console.log(positionCt3) + console.log(distanceBetween) + let frustum = new Cesium.PerspectiveFrustum({ + fov: Cesium.Math.toRadians(LightView), + aspectRatio: Number(1.77778), + near: Number(0.05), + far: Number(distanceBetween), + }); + console.log(frustum) + let inverseViewMatrixNew = this.hpr2m({ + position: positionCt3, + heading: Cesium.Math.toRadians(Number(camHeading)), + pitch: Cesium.Math.toRadians(Number(camPitch)), + roll: Cesium.Math.toRadians(Number(camRoll)), + }); + console.log(inverseViewMatrixNew) + return {M: inverseViewMatrixNew, F: frustum}; + }, + handleWheel(event) { + const delta = event.deltaY; + const step = 0.5; + if (delta > 0) { + this.zoomRatio = Math.min(this.zoomRatio + step, this.maxZoom); + } else { + this.zoomRatio = Math.max(this.zoomRatio - step, this.minZoom); + } + this.onCameraChange() + }, + formatTooltip(val) { + if(val){ + return `${val.toFixed(1)}X`; + } + }, + onSliderInput(val) { + this.zoomRatio = val; + } } } </script> @@ -816,20 +1007,23 @@ #cesiumContainer { margin: 0; padding: 0; - width: 60%; + width: 73%; height: calc(100vh - 205px); } #cesiumCamera { position: absolute; z-index: 2; background-color: rgba(47, 53, 60, 1); - padding: 0 5px; - right: 0px; - top: 0px; + /* padding: 0 5px; */ + right: 10px; + /* top: 0px; */ + bottom: 80px; margin: 0; - width: 33%; - height: calc(100vh - 400px); - border: 1px solid #000; + width: 400px; + height: 300px; + z-index: 6; + /* height: calc(100vh - 400px); */ + /* border: 1px solid #000; */ } .cesiumBotton { position: absolute; @@ -838,14 +1032,16 @@ /* padding: 0 5px; */ margin-top: 10px; right: 0px; + width: 420px; + height: calc(100vh - 210px); bottom: 30px; margin: 0; - width: 33%; - height: calc(30% - 30px); } .cesiumButtonGroup{ - margin-top: 10px; - margin-left: 10px; + position: absolute; + bottom: 0; + /* margin-top: 10px; + margin-left: 10px; */ } .moveResult{position:absolute;z-index:2;background-color:rgba(47,53,60,1);padding:0 5px;right:50%;bottom:30px; border:1px solid rgba(255,255,255,.1);box-sizing:content-box;width:220px;height:30px;font-size:14px;text-align:center} @@ -900,4 +1096,51 @@ .key.active { background-color: #00aaff; } +</style> +<style scoped> +.zoom-ui-container { + /* width: 100%; + height: 100%; + position: relative; + background: #1e1e1e; /* 浣犲彲浠ユ浛鎹㈡垚鍥惧儚鎴栬棰戣儗鏅� */ + /* overflow: hidden; */ + width: 400px; + height: 300px; + position: absolute; + right: 10px; + bottom:80px; + /* background-color: red; */ + z-index: 9; + +} +/* 榛勮壊鍑嗘槦妗� */ +.reticle { + position: absolute; + left: 50%; + top: 50%; + border: 2px dashed orange; + transform: translate(-50%, -50%); + pointer-events: none; +} + +/* ElementUI 婊戝潡鏍峰紡鍖哄煙 */ +.zoom-bar-slider { + position: absolute; + right: 20px; + top: 50px; + height: 200px; +} + +/* 宸︿笅瑙掑�嶇巼鏍囩 */ +.zoom-info { + position: absolute; + bottom: 20px; + left: 20px; +} + +</style> +<style> +.el-slider.is-vertical .el-slider__marks-text{ + width: 30px!important; +} </style> \ No newline at end of file -- Gitblit v1.9.3