import * as mars3d from "mars3d" import { $message } from "@mars/components/mars-ui/index" export let map // mars3d.Map三维地图对象 export let graphicLayer // 矢量图层对象 let selectedView let videoElement // 事件对象,用于抛出事件给面板 export const eventTarget = new mars3d.BaseClass() // 需要覆盖config.json中地图属性参数(当前示例框架中自动处理合并) export const mapOptions = { scene: { center: { lat: 31.843062, lng: 117.205439, alt: 150, heading: 178, pitch: -75 }, globe: { depthTestAgainstTerrain: true // 不加无法投射到地形上 } } } /** * 初始化地图业务,生命周期钩子函数(必须) * 框架在地图初始化完成后自动调用该函数 * @param {mars3d.Map} mapInstance 地图对象 * @returns {void} 无 */ export function onMounted(mapInstance) { map = mapInstance // 记录首次创建的map // 添加参考三维模型 const tiles3dLayer = new mars3d.layer.TilesetLayer({ name: "合肥国家大学科技园", url: "//data.mars3d.cn/3dtiles/qx-hfdxy/tileset.json", position: { alt: -24 }, maximumScreenSpaceError: 1, maximumMemoryUsage: 1024 }) map.addLayer(tiles3dLayer) // 创建Graphic图层 graphicLayer = new mars3d.layer.GraphicLayer() map.addLayer(graphicLayer) createVideoDom() // 加一些演示数据 addDemoGraphic1() } /** * 释放当前地图业务的生命周期函数 * @returns {void} 无 */ export function onUnmounted() { map = null } // 加载已配置好的视频(此参数为界面上“打印参数”按钮获取的) function addDemoGraphic1() { const video3D = new mars3d.graphic.Video3D({ position: [117.205457, 31.842984, 63.9], style: { container: videoElement, maskImage: "img/textures/video-mask.png", // 羽化视频四周,融合更美观 angle: 46.3, angle2: 15.5, heading: 178.5, pitch: -49.5, showFrustum: true }, attr: { remark: "示例1" } }) graphicLayer.addGraphic(video3D) selectedView = video3D // 记录下 eventTarget.fire("loadVideo", { value: { cameraAngle: selectedView.angle, cameraAngle2: selectedView.angle2, heading: selectedView.heading, pitchValue: selectedView.pitch, distanceValue: selectedView.distance, opcity: selectedView.opacity, ckdFrustum: selectedView.showFrustum } }) } const flvUrl = "https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv" function createVideoDom() { videoElement = mars3d.DomUtil.create("video", "", document.body) videoElement.setAttribute("muted", "muted") videoElement.setAttribute("autoplay", "autoplay") videoElement.setAttribute("loop", "loop") videoElement.setAttribute("crossorigin", "") videoElement.setAttribute("controls", "") videoElement.style.display = "none" // 加FLV演示数据 if (window.flvjs.isSupported()) { const flvPlayer = window.flvjs.createPlayer({ type: "flv", url: flvUrl }) flvPlayer.attachMediaElement(videoElement) flvPlayer.load() flvPlayer.play() } else { $message("不支持flv格式视频") } setTimeout(() => { try { if (videoElement.paused) { globalMsg("当前浏览器已限制自动播放,请单击播放按钮") videoElement.play() } } catch (e) { // 规避浏览器权限异常 globalMsg("当前浏览器已限制自动播放,请单击播放按钮") } }, 3000) } export function onChangeAngle(value) { if (selectedView) { selectedView.angle = value } } export function onChangeAngle2(value) { if (selectedView) { selectedView.angle2 = value } } export function onChangeDistance(value) { if (selectedView) { selectedView.distance = value } } export function onChangeHeading(value) { if (selectedView) { selectedView.heading = value } } export function onClickSelView() { if (!selectedView) { return } map.graphicLayer.startDraw({ type: "point", success: (graphic) => { const point = graphic.point graphic.remove() // 删除绘制的点 selectedView.targetPosition = point } }) } export function onChangePitch(value) { if (selectedView) { selectedView.pitch = value } } // 透明度 export function onChangeOpacity(value) { if (selectedView) { selectedView.opacity = value } } // 添加投射视频 export function addVideo(data) { // 开始绘制 graphicLayer.startDraw({ type: "video3D", style: { container: videoElement, angle: data.cameraAngle, angle2: data.cameraAngle2, heading: data.heading, pitch: data.pitchValue, distance: data.distanceValue, showFrustum: data.ckdFrustum }, success: function (graphic) { console.log("绘制完成", graphic) selectedView = graphic // 记录下 } }) } // 按当前视角投射视频 export function addThisCamera(data) { // 取屏幕中心点 const targetPosition = map.getCenter({ format: false }) if (!targetPosition) { return } const cameraPosition = Cesium.clone(map.camera.position) // 构造投射体 const video3D = new mars3d.graphic.Video3D({ position: cameraPosition, targetPosition: targetPosition, style: { container: videoElement, angle: data.cameraAngle, angle2: data.cameraAngle2, heading: data.heading, pitch: data.pitchValue, distance: data.distanceValue, opacity: data.opcity, showFrustum: data.showFrustum } }) graphicLayer.addGraphic(video3D) selectedView = video3D // 记录下 } // 清除 export function clear() { graphicLayer.clear() selectedView = null } // 播放暂停 export function playOrpause() { if (!selectedView) { return } selectedView.play = !selectedView.play } // 定位至视频位置 export function locate() { if (selectedView) { selectedView.setView() } } // 打印参数 export function printParameters() { if (!selectedView) { return } const params = JSON.stringify(selectedView.toJSON()) console.log("Video3D构造参数为", params) } // 线框是否显示 export function showFrustum(ckd) { if (!selectedView) { return } selectedView.showFrustum = ckd } // 视频位置 export function selCamera() { if (!selectedView) { return } map.graphicLayer.startDraw({ type: "point", success: (graphic) => { const point = graphic.point graphic.remove() // 删除绘制的点 selectedView.position = point } }) }