Vue结合mars3d基于天地图加载3dtiles模型(三维模型)

Vue中如何进行3D场景展示与交互(如Three.js) Three.js是一个用于创建3D图形的JavaScript库。它基于WebGL技术,并提供了一系列的工具和API,使得开发者能够轻松创建3D场景,包括模型、纹理、光照、动画等。Three.js还提供了一个场景图形界面,使得开发者可以直观地构建3D场景。在Vue中使用Three.js,我们可以通过Vue组件的方式来创建3D场景,并将其嵌入到Vue应用中。在本文中,我们介绍了如何在Vue中使用Three.js来创建3D场景,并实现交互功能。通过添加光照和交互,我们可以让3D场景更加真实和生动。 阅读详情

官网:http://mars3d.cn/doc
官方提供vue项目示例:https://github.com/marsgis/mars3d-vue-template

1.引入必要插件:
通过npm安装mars3d主库: npm install mars3d
2.在main.js中导入依赖
在这里插入图片描述
3.vue.config.js(或Webpack)配置

const webpack = require('webpack')
const path = require('path')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const cesiumSource = 'node_modules/mars3d-cesium/Build/Cesium/'

module.exports = {
  publicPath: './', // 打包后的位置
  outputDir: 'dist',//打包后的目录名称
  assetsDir: './static', // 静态资源目录名称
  productionSourceMap:false,  //去掉打包的时候生成的map文件
  lintOnSave: false, // 是否在开发环境下通过 eslint-loader 在每次保存时 lint 代码
  configureWebpack: {
    plugins: [
      new webpack.DefinePlugin({
        CESIUM_BASE_URL: JSON.stringify('static')
      }),
      new CopyWebpackPlugin([{ from: path.join(cesiumSource, 'Workers'), to: 'static/Workers' }]),
      new CopyWebpackPlugin([{ from: path.join(cesiumSource, 'Assets'), to: 'static/Assets' }]),
      new CopyWebpackPlugin([{ from: path.join(cesiumSource, 'ThirdParty'), to: 'static/ThirdParty' }]),
      new CopyWebpackPlugin([{ from: path.join(cesiumSource, 'Widgets'), to: 'static/Widgets' }])
    ],
    // pluginOptions: {
    //   'style-resources-loader': {
    //     preProcessor: 'sass',
    //     patterns: [
    //       path.resolve(__dirname, '@/assets/styles/*.scss')      //你的.scss文件所在目录
    //     ]
    //   }
    // },
    module: {
      unknownContextCritical: false,
      unknownContextRegExp: /\/cesium\/cesium\/Source\/Core\/buildModuleUrl\.js/
    }
  },
}

4.主要代码:

<template>
  <div class="mapcontainer">
    <Map :url="configUrl" @onload="onMapload" />
    <div class="bottomLayer" v-show="showLayerMan">
      <el-button v-for="item in layersList" :key="item.id" type="primary" round :class="[item.options.icon, {activeBtn: item.show}]" @click="updateLayerShow(item)">
        <div style="font-size: 16px;">{{item.name}}</div>
      </el-button>
    </div>
    <el-dialog
            title="3D库室"
            :visible.sync="DialogVisible3D"
            width="1300px"
            :before-close="DialogVisible3DClose">
      <iframe
              style="border:none"
              :src="room3DUrl"
              :width="1200"
              :height="600"
      ></iframe>
    </el-dialog>
  </div>
</template>

<script>
import Map from '@/components/mars3d/Map.vue'  // 此处用的map在官网模板代码里有

export default {
  components: {
    Map
  },
  data () {
    return {
      configUrl: 'config/config.json', // mars3D配置文件
      tilesetUrl: window.Tileset, // 获取三维模型地址
      layersList: [],
      showLayerMan: true,
      DialogVisible3D: false,
      room3DUrl: 'http://.....'  // 显示3d库室地址
    }
  },
  mounted () {
  },
  methods: {
    // 地图构造完成回调
    onMapload(map) {
      this.map = map
      this.removeLayer()
      // 3dTiles格式

      const tileLayer = new this.mars3d.layer.TilesetLayer({
        id: '202158',
        name: '模型',
        url: this.tilesetUrl,
        maximumScreenSpaceError: 16,
        maximumMemoryUsage: 1024,
        dynamicScreenSpaceError: true,
        cullWithChildrenBounds: false,
        skipLevelOfDetail: true,
        preferLeaves: true,
        position: { alt: -50 }, // 城市
        // rotation: { x: 240, y: 0, z: 0 },
        // center: {"lat":34.843297,"lng":114.79871,"alt":430,"heading":30,"pitch":-35},
        // flyTo: true
        icon: 'el-icon-s-home'
      })
      this.layer = tileLayer

      this.map.addLayer(this.layer)
      // 创建摄像头图层
      this.graphicLayerCamera = new this.mars3d.layer.GraphicLayer({id: '20210512',name: '摄像头', icon: 'el-icon-video-camera-solid'})
      this.map.addLayer(this.graphicLayerCamera)
      // 创建3d库室图层
      this.graphicLayer3D = new this.mars3d.layer.GraphicLayer({id: '20210525',name: '3d库室', icon: 'el-icon-receiving'})
      this.map.addLayer(this.graphicLayer3D)

      // 创建弹窗图层
      this.graphicLayerPopup = new this.mars3d.layer.GraphicLayer({id: '20210513',name: '弹窗', icon: 'el-icon-s-comment'})
      this.map.addLayer(this.graphicLayerPopup)

      // 加 摄像头
      this.addGraphicCamera()
      // 加 3d库室
      this.addGraphic3DRoom()

      this.addBtn()
      this.showModel()
    },
    removeLayer() {
      if (this.layer) {
        this.map.removeLayer(this.layer, true)
        this.layer = null
      }
    },
    // 添加自定义按钮
    addBtn () {
      let toolButton = new this.mars3d.control.ToolButton({
        title: '图层管理',
        icon: 'el-icon-coin',
        insertIndex: 3, //插入的位置顺序, 1是home按钮后面
        click: (event) => {
          this.showLayerMan = !this.showLayerMan
        },
      })
      this.map.addControl(toolButton)
       let popupButton = new this.mars3d.control.ToolButton({
         title: '弹窗事件',
         icon: 'el-icon-s-comment',
         insertIndex: 3, //插入的位置顺序, 1是home按钮后面
         click: () => {
           this.addDiv()
         },
       })
      this.map.addControl(popupButton)
    },
    //当前页面业务相关
    showModel() {
      this.layer.on(this.mars3d.EventType.load, () => {
        // 获取图层
        this.layersList = this.map.getLayers().filter((layer) => {return layer.name !== '模型'})
      })
      this.layer.on(this.mars3d.EventType.click, (event) => {
        console.log('单击了图层', event)
      })
      // 在layer上绑定监听事件
      this.graphicLayer3D.on(this.mars3d.EventType.click, (event) => {
        console.log('graphicLayer3D', event.graphic.id)
        this.DialogVisible3D = true
      })
      // 在layer上绑定监听事件
      this.graphicLayerCamera.on(this.mars3d.EventType.click, (event) => {
        console.log('监听layer,单击了矢量对象', event)
      })
      // 可在图层绑定右键菜单,对所有加到这个图层的矢量数据都生效
      this.graphicLayerCamera.bindContextMenu([
        {
          text: '删除对象',
          iconCls: 'fa fa-trash-o',
          callback: (e) => {
            const graphic = e.graphic
            if (graphic) {
              this.graphicLayerCamera.removeGraphic(graphic)
            }
          }
        }
      ])
    },
    //更新图层:显示隐藏状态
    updateLayerShow(layer) {
      layer.show = !layer.show
    },
    // 点击图标添加标签
    addDiv () {
      this.graphicLayerPopup.startDraw({
        type: 'divBillboard',
        style: {
          html: `<div style="background-color:red; width: 100px; height: 100px">
                        <div class="title">测试DIV点</div>
                        <div class="content">此处可以绑定任意Html代码和css效果</div>
                    </div >`,
          horizontalOrigin: this.Cesium.HorizontalOrigin.LEFT,
          verticalOrigin: this.Cesium.VerticalOrigin.BOTTOM,
        },
      })
    },
    // 添加图标
    addGraphicCamera() {
      let positions = [{name: '摄像头1', position: [114.803043, 34.846551, 30]},
        {name: '摄像头2', position: [114.803282, 34.846208, 30]},
        {name: '摄像头3', position: [114.802505, 34.846165, 30]}]
      positions.forEach((position) => {
        let graphic = new this.mars3d.graphic.BillboardEntity({
          name: position.name,
          position: position.position,
          style: {
            image: 'img/marker/camera.png',
            scale: 1,
          },
          popup: '<video autoplay controlspreload="none" controls width="440" height="320" src="mp4/11.mp4"></video>'
        })
        this.graphicLayerCamera.addGraphic(graphic)
      })
      this.graphicLayerCamera.show = false
    },
    addGraphic3DRoom() {
      let positions = [{id: 1, name: '库室1', position: [114.803443, 34.846651, 30]},
        {id: 2, name: '库室2', position: [114.803282, 34.846308, 30]},
        {id: 3, name: '库室3', position: [114.802805, 34.846665, 30]}]
      positions.forEach((position) => {
        let graphic = new this.mars3d.graphic.BillboardEntity({
          id: position.id,
          name: position.name,
          position: position.position,
          style: {
            image: 'img/marker/moxing.png',
            scale: 1,
            width: 50,
            height: 50,
          }
        })
        this.graphicLayer3D.addGraphic(graphic)
      })
      this.graphicLayer3D.show = false
    },
    DialogVisible3DClose() {
      this.DialogVisible3D = false
    }
  }
}
</script>

<style lang="scss" scoped>
  .mapcontainer {
    overflow: hidden;
    height: 100vh;
    .bottomLayer {
      position: relative;
      bottom: 150px;
      text-align: center;
      button {
        font-size: 24px;
        width: 90px;
        background: rgba(63, 72, 84, 0.88);
        /*border-color: #00ffff;*/
        border: 0;
      }
      .activeBtn {
        color: #00ffff;
      }
    }
    /deep/.el-dialog__wrapper {
      .el-dialog {
        background: rgba(36, 45, 52, 0.9);
        border: 1px solid #66b1ff;
        .el-dialog__title {
          color: #eee;
        }
        .el-dialog__body {
          text-align: center;
        }
      }
    }
  }
</style>

4.config.js文件
在这里插入图片描述

VUE项目中使用THREE.js加载obj模型 想要在vue项目中使用threejs加载如obj、vtk等格式的模型,与threejs官网略相似,却有部分不同。以下概括几个不同点: js文件引入方式不同。vue中使用npm下载js文件,例如npm install three three-orbitcontrols three-obj-mtl-loader stats-js ,注意:obj加载器使用three-obj-mtl-loader而不是... 阅读详情

相关推荐

mars3d显示地图,并且完成切换地图图层的功能,使用隐藏显示去控制图层

mars3d显示地图,并且完成切换地图图层的功能,使用隐藏显示去控制图层

weixin_46212682的博客 4113

vue项目使用mars3d加载天地图,实现地图点位,动态线标注

vue项目使用mars3d加载天地图,实现地图点位,动态线标注

m0_73110566的博客 3234

Vue集成three.js,并加载glb、gltf、FBX、json模型

最近刚开始做的一个项目,后面有个模块要通过three.js实现3D的场景,因为之前也没接触过3D这块,就提前学了一下,做个记录。当然这是一个开始 先上几个网址 ThreeJS官方:http://www.thingjs.com/guide/city2/ ThreeJS在线开发:https://www.thingjs.com/guide/?m=sample&source=baidu&plan=ThingJSjishuci&unit=threejs&keyword=thre.

专注于技术,分享实战经验,探索技术边界,用代码构建更美的数字世界。 1万+

Cesium 添加天地图三维地形

Cesium 添加天地图三维地形

jingjing_n的博客 8792

别再只飞不记了!用CsvView分析你的大疆飞行日志,优化航拍与排查炸机原因

本文详细介绍了如何利用CsvView工具分析大疆无人机的飞行日志,帮助用户优化航拍效率和飞行安全。通过解读飞行日志中的关键数据,如电池性能、飞行轨迹等,用户可以及时发现潜在问题并改进飞行习惯。文章还提供了事故排查方法和进阶分析技巧,适合无人机爱好者和专业飞手。

weixin_42535461的博客 548

基于SHIS凝视型短波红外高光谱相机(900-1700nm)区分不同宝石的差异性和可分性(宝石分选)

SHIS系列凝视型高光谱相机基于液晶可调谐滤波器(LCTF),通过电控LCTF进行连续细分窄波段分光,对每个波段进行高分辨率的二维面阵成像,进行图像处理后,获得完整的高光谱高清图像序列。具有低功耗、小型化、使用方便和易于扩展的优势。其工作波段覆盖400nm至1000nm,能够捕捉宝石在不同波长下的光谱特征,为宝石鉴定提供了新的工具。

wayho的博客 707

vue+mars3d叠加影像服务

业务数据(通过API接口获取)图层(使用Graphic渲染),对应类为:BusineDataLayer。GeoJson数据图层(Cesium原生加载渲染),对应类为:CzmGeoJsonLayer。Echarts图层【mars3d-echarts插件】,对应类为:EchartsLayer。czml数据图层(Cesium原生加载渲染),对应类为:CzmlLayer。kml数据图层(Cesium原生加载渲染),对应类为:KmlLayer。热力图图层【mars3d-heat插件】,对应类为:HeatLayer。

xzfbxncn的博客 626

Ubuntu安装ToDesk远程控制软件

前几天有同学问我怎么在 Ubuntu 系统上安装 ToDesk 远程控制软件, 帮他安装完成后就 顺手整理了一下安装过程,所以就顺手有了这篇在 Ubuntu 系统上安装 todesk 的文章。

小白的博客 8659

vue3+ts+mars3d 3dtiles 重复加载问题解决方案--修改图层配置参数

摘要:这是一个基于Cesium的三维地理信息系统场景配置,中心点位于武汉(北纬30.5375°,东经114.4086°),海拔647.7米。场景配置了天地图影像作为底图,并加载了三维瓦片服务(3DTiles)数据。系统禁用了部分UI控件(如主页按钮、场景模式选择器等),保留了基础的导航功能。场景采用固定视角(方位角5.4°,俯仰角-39.3°),支持光影效果(FXAA)、雾效和大气渲染。性能优化方面设置了瓦片加载参数(最大屏幕空间误差64,内存使用限制2048MB等)。

Amethystzlx的博客 311

CH592F RISC-V蓝牙LED灯设计:WS2812B驱动与微信小程序控制

蓝牙低功耗(BLE)是嵌入式物联网设备主流无线通信技术,其核心在于协议栈轻量化、射频稳定性与外设协同调度。基于RISC-V内核的蓝牙SoC(如CH592F)凭借高集成度、低待机电流和免外部巴伦的射频设计,显著降低硬件复杂度与BOM成本;而WS2812B作为单线级联RGB LED,依赖微秒级精准时序,需借助定时器+DMA机制规避CPU干预,保障动态效果流畅性。该方案融合电容触摸交互、GATT服务自定义与微信小程序标准Bluetooth API对接,适用于智能照明、DIY彩灯及教学实践等场景,是BLE+LED实

weixin_31163455的博客 433

数字IC/FPGA 秋招知识点不全面整理

数字IC/FPGA 秋招知识点不全面整理

w0shishabi的博客 7866

Mars3D环境配置三重门:Node.js、Nginx与VSCode调试实战

三维GIS前端开发中,Mars3D作为基于CesiumJS的国产开源可视化库,其环境配置本质是Node.js构建链路、Nginx静态资源分发与跨域治理、VSCode源码级调试三大技术能力的协同落地。理解vite对Node.js版本与esbuild的隐式依赖,掌握nginx.conf中alias与root的本质区别,以及sourceMap映射与webRoot路径的精准匹配,是突破npm.ps1报错、404资源加载失败、断点失效等高频问题的技术根基。这些能力不仅支撑Mars3D项目启动,更广泛适用于Vue3+W

weixin_30824479的博客 378

Unity与iOS原生交互实战指南

C#(DllImport) → C 接口(extern "C") → Objective‑C / SwiftObjective‑C → UnitySendMessage → C#(GameObject + public 方法)在写.mm文件;在里面写;C# 用声明;调用它,参数就是 string / 数值等;在.mm里做你想做的 iOS 原生操作。在 Unity 里准备一个常驻 GameObject,比如;上面挂一个脚本,写;在 iOS 插件中用;

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1357

vue3 mars3d 天地图

vue3 mars3d集成天地图

2268

k8s篇之underlay网络和overlay区别

underlay和overlay

小橙子的笔记屋 2142

DICOM标准:DICOM医学影像中的覆盖层(Overlay)概念详解

DICOM标准:深入详解DICOM医学影像中的覆盖层(Overlay)

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1562

Cesium结合GIS天地图 加载倾斜摄影3dtile + vue3

将倾斜摄影OSGB数据转换为3dtile(转换方式很多,可以利用第三方工具cesiumlab) 利用Cesium加载GIS地图,我这里使用的是天地图,可以加载其他地图都行 加载3dtile数据到地图中展示

qq_32430463的博客 9084

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【过程记录】Mars3D加载3DTiles三维模型

书接上回,在上篇博文中,我从网络上下载了一个osgb格式的三维模型,如果需要导入到Mars3D之中,需要转换成3DTiles形式。2016年,Cesium 团队借鉴传统2DGIS的地图规范:WMTS,借鉴图形学中的层次细节模型,打造出大规模的三维数据标准:3d-Tiles,中文译名:三维瓦片。它在模型上利用了 gltf 渲染快的特点,对大规模的三维数据进行组织,包括层次细节模型、模型的属性数据、模型的层级数据等。...

兴趣使然的创作者 4085

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

QGIS文章一——实现天地图加载

无论是农业科学还是海洋科学,对地图的处理和数值模型的计算是少不了的,地图是可视化的基础,先有了基础再进行开始某些复杂处理,进而开始模拟推演,最后进行数值模拟和计算。QGIS(原称Quantum GIS)是一个自由软件的桌面GIS软件。它提供数据的显示、编辑和分析功能。QGIS是一个用户界面友好的桌面地理信息系统,可运行在Linux、Unix、Mac OSX和Windows等平台之上。QGIS是基于...

不胜人生一场醉 1030

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

cesium学习记录05-加载数据(矢量、影像、地形、3D模型)

一个基于JSON的地理数据格式,Cesium支持GeoJSON的直接加载。KML (keyhole markup language)是以XML语言为基础开发的一种文件格式,用来描述和存储地理信息数据(点、线、面、图片等),是纯粹的xml文本格式, KMZ是Google Earth默认的输出文件格式,是一个经过ZIP格式压缩过的KML文件。/*** 添加卫星轨迹czml数据*/.add(Cesium.CzmlDataSource.load("../static/卫星轨迹.czml"))},

木卯彳亍的博客 8377

【vue+cesium】加载三维天地图

天地图及 CesiumJs 对 webpack 支持度差,步骤繁琐,因此采用脚本引入方式。 事先注册好cesium和天地图的token <script src="./plugin/cesium/Cesium.js"></script> <script src="./plugin/cesium/cesiumTdt.js"></script> <link href="https://cesium.com/downloads/cesiumjs/rel

ikariku的博客 4400

Vue使用vue-3d-model组件预览3D三维文件、立体文件,支持旋转、自动播放

基于threeJS的vue 3D展示组件。

我驾驶汽车从不是为了从A点到达B点,我喜欢去感受汽车,与之交流,与之融为一体。 6623

mars3d加载建筑物白膜及简单建筑物样式

mars3d加载建筑物白膜及简单建筑物样式

m0_69803146的博客 1502

vue-3d-loader vue实现3d模型展示(vue2)

【代码】vue-3d-loader vue实现3d模型展示(vue2)

微风的博客 2536

VUE使用Three.js实现模型,点击交互,相机旋转视角跟随移动(Threejs中使用Tweenjs,含demo源码)

VUE使用Three.js实现模型,点击交互,相机旋转视角跟随移动(Threejs中使用Tweenjs,含demo源码)

一个咸鱼的博客 1万+
上一篇: nginx解决JSON跨域问题
下一篇: Vue、OpenLayers结合天地图实现Gis
蜗牛与藤曼
博客等级 码龄9年 1万+粉丝 89原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值