vue 高德地图 3D threejs 可视化开发

vue中使用threejs和高德地图,加载3D模型。

1、准备工作 - 导入3D模型

首先在public中的static文件夹中导入编辑好的3D模型分别是mtl和obj格式的。如图:

2、安装依赖 - threejs和three-obj-mtl-loader

后者依赖前者,所有都要安装。

npm i -S three three-obj-mtl-loader

3、vue中引入高德地图

非常隐含的是,js API并没有离线版本。那么需要引入在线的高德地图。但是如何在vue组件中比较好的使用高德地图,网上查了一些方法,在这里综合一下:

异步创建一个script标签,把高德地图的地址(需要生成自己的key)放进去。如下例子

function createScript (url) {
    

    return new Promise((resolve, reject) => {
            
        let scriptElement = document.createElement('script')
        document.body.appendChild(scriptElement)
        scriptElement.src = url
        
    })

}


createScript('高德地图地址').then(resp => {

       // 地图的初始化
       ...

})

 

4、3D对象和地图之间的融合

首先需要在地图组件中引入上边安装过的依赖,如下:

import { OBJLoader, MTLLoader } from 'three-obj-mtl-loader' 

export default {
 ...

}

然后在地图开始地图初始化准备好地图实例:

// 初始化地图

initMap () {
    
    let map = new Amap.map({

        // 这里地图的配置

    })

}

初始化地图之后,开始解析3D模型了

mtlLoader.load(`static/elight.mtl`, function(materials) {
    materials.preload();

    // 初始化obj解析器
    let objLoader = new OBJLoader();

    // 开始引入3D对象文件进行解析
    objLoader.load(`static/elight.obj`, function(obj) {
        
        // 注意这个回调的参数obj就是我们传入的3D对象
        // 对象的children就是我们要的mesh对象 如下
        console.log('mesh', obj);
        let meshes = obj.children.length == 0 ? [] : obj.children;

        // 接下来很重要
        // 需要就是我们我们把这个mesh对象转变成高德地图可以认识的mesh对象
        // 
         meshes.forEach(meshItem => {
                let vecticesF3 = meshItem.geometry.attributes.position;
                let vecticesNormal3 = meshItem.geometry.attributes.normal;
                let vecticesUV2 = meshItem.geometry.attributes.uv;
                let vectexCount = vecticesF3.count;
                let material = meshItem.material[0] || meshItem.material;

                // 注意这里是高德地图的3d解析器   
                let mesh = new AMap.Object3D.MeshAcceptLights();
                let geometry = mesh.geometry;
                

                 // 以下就是改变3D模型的颜色
                for (var j = 0; j < vectexCount; j += 1) {
                  var s = j * 3;
                  geometry.vertices.push(vecticesF3.array[s], vecticesF3.array[s + 2], -vecticesF3.array[s + 1]);

                  if (vecticesNormal3) {
                    geometry.vertexNormals.push(vecticesNormal3.array[s], vecticesNormal3.array[s + 2], -
                      vecticesNormal3.array[s + 1]);
                  }
                  if (vecticesUV2) {
                    geometry.vertexUVs.push(vecticesUV2.array[j * 2], 1 - vecticesUV2.array[j * 2 + 1]);
                  }
                  // 真实颜色 0.81, 0.73, 0.45
                  geometry.vertexColors.push(...colorBg, 0.9) //0.87,0.93,0.72
                }


                // 以下是根据自己项目需求对这个3d对象调整颜色,旋转角度等属性的
                mesh.DEPTH_TEST = material.depthTest
                mesh.transparent = true; //opacity<1;
                mesh.scale(24, 18, 9) //11
                mesh.rotateZ(r)
                mesh.position(new AMap.LngLat(x, y));
                mesh.id = nid; //'light'+lightId;
                mesh.colorFlag = colorBg[0] == 0.81 ? '00' : '11';
                console.log('地图mesh', mesh);
                _this.meshes.push(mesh);

                // 最后需要把这个3D对象添加到地图的3D解析器中
                sobject3Dlayer.add(mesh);
              })
                

              // 然后需要把所有的3D对象添加到地图上  就可以看到地图上的3D模型了
              map.add(sobject3Dlayer);
    })
    
})

至此,差不多就是在地图中可以展示3D对象了的步骤了。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 是的,Vue.js 和 Three.js 可以很好地结合,用于开发3D可项目。其中,Vue.js 用于构建整个应用程序的前端界面,而 Three.js 用于创建和呈现3D场景。以下是一些简单的步骤: 1. 安装 Vue.js 和 Three.js 首先,你需要安装 Vue.js 和 Three.js。你可以使用 npm 或 yarn 安装这两个库。 2. 创建 Vue.js 应用程序。 使用 Vue CLI 创建一个新的 Vue.js 应用程序。在项目根目录下,可以使用以下命令: ``` vue create my-app ``` 3. 引入 Three.js 在 Vue.js 应用程序中,可以通过以下方式引入 Three.js: ``` import * as THREE from 'three'; ``` 你可以在 Vue.js 组件的任何地方使用 THREE 对象。 4. 创建 Three.js 场景 在 Vue.js 应用程序中,你可以在 Vue.js 组件中创建 Three.js 场景。在组件的 mounted 钩子中创建场景。例如: ``` mounted() { // 创建 Three.js 场景 this.scene = new THREE.Scene(); } ``` 5. 创建 Three.js 渲染器 在 Vue.js 组件中,你可以创建 Three.js 渲染器并将其附加到 HTML 元素上。例如: ``` mounted() { // 创建 Three.js 渲染器 this.renderer = new THREE.WebGLRenderer(); // 添加到 HTML 元素 this.$refs.renderer.appendChild(this.renderer.domElement); } ``` 6. 创建 Three.js 相机 在 Vue.js 组件中,你可以创建 Three.js 相机并将其添加到场景中。例如: ``` mounted() { // 创建 Three.js 相机 this.camera = new THREE.PerspectiveCamera( 75, // 角 this.width / this.height, // 宽高比 0.1, // 近处平面 1000 // 远处平面 ); // 将相机添加到场景中 this.scene.add(this.camera); } ``` 7. 渲染 Three.js 场景 在 Vue.js 应用程序中,你可以使用 requestAnimationFrame() 方法渲染 Three.js 场景。例如: ``` mounted() { // 渲染 Three.js 场景 const render = () => { this.renderer.render(this.scene, this.camera); requestAnimationFrame(render); } requestAnimationFrame(render); } ``` 这样,你就可以在 Vue.js 应用程序中创建 Three.js 场景了。你可以使用 Three.js 的其他功能,在场景中添加物体,创建动画等等。 ### 回答2: Vue和Three.js是两个独立的库,分别用于Web开发和3D可开发Vue是一个用于构建用户界面的JavaScript框架,能够帮助开发者构建响应式的单页应用程序。而Three.js是一个用于创建和渲染三维图形的JavaScript库,它提供了很多功能强大的3D绘制工具和特效。 结合Vue和Three.js开发项目,可以充分发挥两者的优势。首先,可以使用Vue来构建项目的界面,包括导航栏、按钮、输入框等交互元素。Vue的响应式特性可以允许用户输入和状态变实时更新页面,给用户以良好的交互体验。 然后,利用Three.js创建和渲染项目中的三维图形。通过Three.js的API,可以创建各种形状的几何体、灯光、材质等,并在页面中展示出来。可以将数据与Three.js的图形进行绑定,实现实时的数据可。例如,可以将数据表示为柱状图、折线图或散点图,然后使用Three.js在页面中绘制出相应的3D图形。 同时,Vue和Three.js的相互配合也可以提供更多的功能。例如,可以使用Vue的组件开发方式将Three.js的场景、模型等封装为可复用的组件,方便在项目中的多个地方使用。Vue的动画特性也可以与Three.js的动画效果进行结合,实现更加丰富的动态效果。 总之,通过结合Vue和Three.js开发项目,可以充分发挥两者的优势,使项目具有良好的交互性和丰富的3D效果。这种结合方式可以满足项目对于界面和数据可的需求,并为用户提供更好的用户体验。 ### 回答3: Vue结合three.js开发项目的概念是将Vue.js框架与Three.js库相结合,通过Vue.js的组件开发思想和Three.js的三维可技术,构建出一个灵活、交互且具有动态效果的可项目。 首先,Vue.js是一种轻量级的JavaScript框架,通过它可以更方便地创建用户界面和构建交互式的单页面应用。利用Vue.js的组件开发思想,可以将项目拆解成小的组件,提高代码的重用性和维护性。 然后,Three.js是基于WebGL的JavaScript库,用于创建和渲染各类三维场景和动画效果。它提供了丰富的功能和API,可以在网页上创建3D模型、添加光照效果、实现模型动画等。结合Vue.js,可以通过Vue组件的方式创建Three.js场景,并在场景中进行交互操作。 在Vue结合Three.js开发项目时,可以使用Vue.js的生命周期钩子来控制Three.js场景的初始、渲染和销毁。可以将Three.js的代码封装为Vue组件,通过props和events实现组件之间的数据传递和交互。同时,可以结合Vue的数据绑定特性,动态更新Three.js场景中的元素。 此外,还可以借助Vue的动画特性来实现一些动态效果,如模型旋转、相机缩放等。同时,Vue框架的响应式特性也能够方便地监听数据变,实现数据驱动的可效果。 综上所述,通过Vue结合Three.js开发项目可以更加高效地创建、管理和操控三维场景,开发出富有交互性和动态效果的可应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值