成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

maptalks+three.js+vue webpack實現二維地圖上貼三維模型操作

瀏覽:136日期:2022-12-11 11:26:33

我們不是走在坑里就是走在前往坑的路上_(:з?∠)_

最終效果如圖:(地圖上添加一個“三維地圖”的toolbar按鈕,點擊后在二維地圖上貼上建好的三維模型點擊顯示彈框)

maptalks+three.js+vue webpack實現二維地圖上貼三維模型操作

以下都在已經引入并且初始化maptalks地圖的基礎上,如何引入使用maptalks可以查看以下文章

https://www.jb51.net/article/192983.htm

1、安裝maptalks.three包

npm install maptalks.three

2、安裝three包

npm install three

3、安裝obj-loader和mtl-loader包

npm i --save three-obj-mtl-loader

4、引入model模型文件到public下(放在這里是因為打包后讀取路徑問題,目前發現放在這里才能在打包后正確讀取)

maptalks+three.js+vue webpack實現二維地圖上貼三維模型操作

5、Vue頁面代碼

引入包

import * as THREE from ’three’import * as maptalks from ’maptalks’import { ThreeLayer } from ’maptalks.three’import { MTLLoader, OBJLoader } from ’three-obj-mtl-loader’

初始化的地圖對象是

this.map

下面是渲染三維模型的方法

// 渲染三維draw3D() { const that = this // 三維地圖 var three_flag = false // ///單體化交互開始 var INTERSECTED this.map.on(’click’, function(e) { // console.log(e) var raycaster = new THREE.Raycaster() var mouse = new THREE.Vector2() const camera = threeLayer.getCamera() const scene = threeLayer.getScene() if (!scene) return const size = that.map.getSize() const width = size.width; const height = size.height mouse.x = (e.containerPoint.x / width) * 2 - 1 mouse.y = -((e.containerPoint.y) / height) * 2 + 1 raycaster.setFromCamera(mouse, camera) raycaster.linePrecision = 3 var intersects = raycaster.intersectObjects(scene.children, true) // var intersects = raycaster.intersectObject(points); if (!intersects) return if (Array.isArray(intersects) && intersects.length === 0) return console.log(intersects) // 這里我們操作第一個相交的物體 if (intersects.length > 0) { if (INTERSECTED != intersects[0].object) { if (INTERSECTED) { // INTERSECTED.material.color.setHex(INTERSECTED.currentHex); // INTERSECTED.scale.set(1,1,1); if (INTERSECTED.material.length === undefined) { INTERSECTED.material.color.setHex(INTERSECTED.currentHex) } else { for (var i = 0; i < INTERSECTED.material.length; i++) { INTERSECTED.material[i].color.setHex(INTERSECTED.currentHex) } } } INTERSECTED = intersects[0].object // 設置相交的第一個物體的顏色 // INTERSECTED.currentHex = INTERSECTED.material[0].color.getHex(); INTERSECTED.currentHex = 16777215 // 將該物體設為隨機的其他顏色 // INTERSECTED.material.opacity = 0.2; // INTERSECTED.material.transparent = true; // INTERSECTED.material.opacity = 0.2; // INTERSECTED.material.needsUpdate = true; // INTERSECTED.material.transparent = false; // INTERSECTED.material.color.setHex(0xff0000); if (INTERSECTED.material.length === undefined) { INTERSECTED.material.color.setHex(0x1E90FF) } else { for (var i = 0; i < INTERSECTED.material.length; i++) { INTERSECTED.material[i].color.setHex(0x1E90FF) } } } // ////////////// var lonlat = e.coordinate if (true) { var options = { ’autoOpenOn’: ’null’, // set to null if not to open window when clicking on map ’single’: true, ’width’: 410, ’height’: 190, ’custom’: true, ’autoCloseOn’: ’click’, ’dy’: -316, ’content’: ’<div class='content build-content'>’ + ’<div class='pop-img'><img src='http://pde56fqkk.bkt.clouddn.com/1544760152593.jpg'/><p id='viewDetial'><span >浦軟大廈</span><a>詳情<i class='el-icon-arrow-right'></i></a></p></div>’ + ’<div class='pop-txt'><ul><li>入駐企業:<span>12 家</span> </li><li>登記人員:<span>1000 人</span> </li><li>今日訪客:<span>100 人</span> </li><li>登記車輛:<span>500 輛</span> </li><li>實時人數:<span>0 人</span> </li><li>監控點位:<span>0 個</span> </li><li>人臉門禁:<span>0 個</span> </li><li>消防設施:<span>0 個</span></li></ul></div>’ + ’</div>’ } var infoWindow = new maptalks.ui.InfoWindow(options) infoWindow.addTo(that.map).show(lonlat) } } else { // 當射線離開的時候變為原來的顏色 if (INTERSECTED) { // INTERSECTED.material.color.set(INTERSECTED.currentHex); if (INTERSECTED.material.length === undefined) { INTERSECTED.material.color.setHex(INTERSECTED.currentHex) } else { for (var i = 0; i < INTERSECTED.material.length; i++) { INTERSECTED.material[i].color.setHex(INTERSECTED.currentHex) } // INTERSECTED.scale.set(1,1,1); } } INTERSECTED = null } threeLayer.renderScene() }) function closeBox() { var theClose = document.getElementById(’close_id’) var cont = document.getElementById(’infow’) cont.style.display = ’none’ } // ///單體化交互結束 // the ThreeLayer to draw buildings // //ThreeLayer初始化 var threeLayer = new ThreeLayer(’t_forbcmp’, { forceRenderOnMoving: true, forceRenderOnRotating: true, animation: true }) threeLayer.prepareToDraw = function(gl, scene, camera) { var me = this // var light = new THREE.PointLight(0xffffff); // camera.add(light); // let axes=new THREE.AxesHelper(200000000); // scene.add(axes); var light0 = new THREE.DirectionalLight(’#ffffff’, 0.5) light0.position.set(800, 800, 800).normalize() light0.castShadow = true camera.add(light0) // 環境光 var light01 = new THREE.AmbientLight(’#f7fdf9’) light01.castShadow = true scene.add(light01) // var light1 = new THREE.DirectionalLight('#ffffff'); // light1.position.set(-800,-800,800).normalize(); // light1.castShadow = true; // camera.add(light1); // 測試加載obj和mtl貼圖 // addmtlLoaderTest(13.438186479666001,52.530305072175594); // addmtlLoaderTestforMTL(13.436186479666001,52.530305072175594); // 相對路徑參數, var mtlPath = process.env.BASE_URL + ’model/obj/’ var mtlName = ’3d_puruan_new.mtl’ var objPath = process.env.BASE_URL + ’model/obj/’ var objName = ’3d_puruan3.obj’ var objlon = 121.60499979860407 var objlat = 31.20150084741559 addLoaderForObj(objlon, objlat, mtlPath, mtlName, objPath, objName) } threeLayer.addTo(that.map).hide() // ////////////////加載模型相關 // 加載obj+mtl function addLoaderForObj(lon, lat, mtlPath, mtlName, objPath, objName) { const me = threeLayer const scene = me.getScene() const scale = -0.0007 var mtlLoader = new MTLLoader() // 加載貼圖mtl mtlLoader.setPath(mtlPath) mtlLoader.load(mtlName, function(materials) { materials.preload() var objLoader = new OBJLoader() objLoader.setMaterials(materials) // 加載模型obj Math.PI*3/2 objLoader.setPath(objPath) objLoader.load(objName, function(object) { object.traverse(function(child) { if (child instanceof THREE.Mesh) { child.scale.set(scale, scale, scale) child.rotation.set(-Math.PI / 2, Math.PI, 0) // 賦予基礎材質的顏色,無色(0xFFFFFF)調試色0x0000FF for (var i = 0; i < child.material.length; i++) { child.material[i].color.setHex(0x0000FF) } } }) var v = threeLayer.coordinateToVector3(new maptalks.Coordinate(lon, lat)) object.position.set(v.x, v.y, 0) scene.add(object) mtlLoaded = true threeLayer.renderScene() }) // var mm = new THREE.MeshPhongMaterial({color:0xFF0000}); // objLoader.setMaterials( mm ); // objLoader.setMaterials(materials); }) } var toolbar = new maptalks.control.Toolbar({ position: { ’right’: 40, ’bottom’: 40 }, items: [ { item: ’二三維圖層切換’, click: function() { if (three_flag === false) { that.map.animateTo({ center: [121.6050804009, 31.2015354151], zoom: 18, pitch: 45 }, { duration: 2000 }) threeLayer.show() three_flag = true } else { that.map.animateTo({ center: [121.6050804009, 31.2015354151], zoom: 18, pitch: 0 }, { duration: 2000 }) threeLayer.hide() three_flag = false } console.log(’obj模型’) } } ] }).addTo(this.map)}

上面這段代碼需要注意的是模型數據文件的讀取路徑

// 相對路徑參數,var mtlPath = process.env.BASE_URL + ’model/obj/’var mtlName = ’3d_puruan_new.mtl’var objPath = process.env.BASE_URL + ’model/obj/’var objName = ’3d_puruan3.obj’

關于process.env.BASE_URL的值可以在vue.config.js里自定義設置(cli3.0)

baseUrl: process.env.NODE_ENV === ’production’ ? ’/bcmp-web/’ : ’/’,

關于draw3D的代碼我沒有進行詳細的解釋,如果需要會出一個詳細版的方法使用介紹

補充知識:Vue npm安裝Vue常用依賴,axios、element ui、mockjs

添加axios依賴:

npm install axios

添加element-ui:

npm i element-ui -S

添加 mockjs:

npm install mockjs

以上這篇maptalks+three.js+vue webpack實現二維地圖上貼三維模型操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Vue
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲午夜精品久久久久久久久| 大美女一区二区三区| 久久精品免费观看| 中文无字幕一区二区三区 | 亚洲香蕉视频| 蜜桃视频一区二区三区在线观看| 国产天堂亚洲国产碰碰| 国产欧美一区二区色老头| 99精品桃花视频在线观看| 久久精品二区亚洲w码| 国产精品久久久久久久久动漫 | 久久亚洲欧洲| 欧美亚洲不卡| 国产精品一区二区在线看| 亚洲一区二区免费视频| 91精品国产综合久久久蜜臀粉嫩| 国产伦精品一区| 亚洲大胆女人| 欧美成人一品| 99久久精品99国产精品| 精品一区二区三区不卡| 丝袜国产日韩另类美女| 亚洲视频电影在线| 欧洲精品中文字幕| 日产精品久久久久久久性色| 日本欧美在线看| 蜜乳av另类精品一区二区| av在线播放一区二区三区| 日韩激情在线观看| 99精品视频免费全部在线| 亚洲无线一线二线三线区别av| 91精品一区二区三区在线观看| 亚洲成人激情自拍| 亚洲久草在线视频| 一本久道久久久| 中文字幕日韩精品一区| 国产毛片一区二区| 9191久久久久久久久久久| 国产一区二区三区观看| 在线成人免费视频| www.性欧美| 中文字幕av一区二区三区| 亚洲美女一区| 日韩精品一区第一页| 欧美日韩国产片| 成人免费精品视频| 久久精品亚洲麻豆av一区二区| 欧美日韩免费精品| 亚洲国产aⅴ成人精品无吗| 欧美视频第二页| gogo大胆日本视频一区| 亚洲国产精品二十页| 国产日韩视频| 久久99精品国产麻豆婷婷| 日韩女优毛片在线| 亚洲视频一区| 日韩影视精彩在线| 欧美一级夜夜爽| 欧美99久久| 亚洲chinese男男1069| 7777精品伊人久久久大香线蕉的 | 亚洲夂夂婷婷色拍ww47 | 亚洲人成网站影音先锋播放| 午夜宅男久久久| 国产精品一区二区久久精品爱涩| 国产亚洲综合av| 亚洲欧美成人综合| 国产一区二区三区在线观看精品 | 99精品国产在热久久下载| 青青草一区二区三区| 精品欧美乱码久久久久久| 精品成人在线| 久久精品国产一区二区| 久久影视一区二区| 亚洲欧美成人综合| 国产传媒欧美日韩成人| 亚洲欧美在线视频观看| 欧美性videosxxxxx| 欧美freesex交免费视频| 亚洲国产一区二区三区青草影视| 欧美美女一区二区| 国产在线欧美日韩| 美女任你摸久久| 国产精品女主播av| 色av成人天堂桃色av| 99视频热这里只有精品免费| 亚洲一区在线免费观看| 日韩一区国产二区欧美三区| 亚洲激情av| 国产综合色在线| ...xxx性欧美| 6080午夜不卡| 在线亚洲成人| 成人国产在线观看| 亚洲成va人在线观看| 欧美精品一区二区不卡| 免费在线观看一区二区| 99视频在线精品| 日本欧美一区二区三区| 国产亚洲婷婷免费| 久久影院亚洲| 午夜精品一区二区三区四区| 免费日韩伦理电影| 国产精品久久久久婷婷| 欧美乱熟臀69xxxxxx| 最新日韩欧美| 成人在线综合网站| 天堂午夜影视日韩欧美一区二区| 久久婷婷综合激情| 色老汉av一区二区三区| 国产精品国产一区二区| 国产伦精一区二区三区| 夜夜精品视频一区二区| 欧美精品一区二区三区在线播放| 在线一区二区三区四区| 亚洲网站啪啪| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 国产伦理一区| 色综合色综合色综合色综合色综合| 美腿丝袜一区二区三区| 亚洲欧洲在线观看av| 欧美videos中文字幕| 欧美综合久久久| 亚洲一区免费| 国内自拍亚洲| 懂色av中文一区二区三区| 日本强好片久久久久久aaa| 中文字幕一区视频| 精品国产欧美一区二区| 91精品福利在线| 一区二区三区偷拍| 欧美激情五月| 国产成人av一区二区三区在线观看| 丝袜国产日韩另类美女| 伊人开心综合网| 国产午夜精品久久| 宅男噜噜噜66一区二区66| 色婷婷久久综合| 夜夜精品视频| 国产精品高清一区二区三区| 不卡的av电影在线观看| 国产毛片一区二区| 日韩高清中文字幕一区| 一区二区高清视频在线观看| 国产视频不卡一区| 精品av久久707| 日韩免费视频一区| 3atv一区二区三区| 欧美日韩一区精品| 在线日韩av片| 色婷婷综合久久久中文字幕| 午夜宅男久久久| 在线亚洲自拍| 一区在线免费| 欧美三日本三级少妇三99| aaa欧美色吧激情视频| 成人性生交大合| 国产精品99久久久久久似苏梦涵| 日本不卡123| 日本亚洲视频在线| 日韩在线一区二区| 首页综合国产亚洲丝袜| 香港成人在线视频| 亚洲成a人在线观看| 偷拍一区二区三区四区| 亚洲自拍都市欧美小说| 夜夜精品浪潮av一区二区三区| 亚洲视频在线一区| 亚洲人精品一区| 一区二区三区美女| 亚洲国产日韩一级| 丝袜亚洲另类欧美| 日本午夜精品一区二区三区电影| 午夜精品福利久久久| 天天综合日日夜夜精品| 亚洲123区在线观看| 亚洲国产色一区| 婷婷一区二区三区| 秋霞电影网一区二区| 久久精品国产精品亚洲精品| 激情成人综合网| 国产一区二区三区免费观看| 国产不卡在线一区| 99麻豆久久久国产精品免费| 91一区一区三区| 欧美精品成人| 在线免费观看欧美| 一区二区久久| 国产精品日韩| 久久精品成人| 欧美日韩一区二区三区在线| 91精品国产综合久久久蜜臀图片 | 日韩二区在线观看| 精品一区精品二区高清| 国产乱人伦精品一区二区在线观看| 国产高清在线观看免费不卡| 成人av动漫在线| 国产精品www.| 一区二区动漫| 在线看一区二区|