three.js地图可视化项目-广州模型

概述

如有不明白的可以加QQ:2354528292;wx: aichitudousien
更多教学视频请访问:https://space.bilibili.com/236087412
详细教学请到上方视频链接访问,总共3个多小时的教学~

three.js地图可视化项目-广州模型

搭建开发环境

使用的开发框架是vue-cli3.0,报表使用echarts, webgl使用three.js,开发工具为vscode
搭建完成后的目录为
在这里插入图片描述

搭建three场景

  1. 创建一个class,用来初始化场景,渲染器,相机,灯光,控制器
import * as THREE from 'three'
import {
  OrbitControls
} from 'three/examples/jsm/controls/OrbitControls.js';
import {
  OBJLoader
} from 'three/examples/jsm/loaders/OBJLoader';
import {
  MTLLoader
} from 'three/examples/jsm/loaders/MTLLoader';

export default class ZThree {
  constructor(id) {
    this.id = id;
    this.el = document.getElementById(id);
  }

  // 初始化场景
  initThree() {
    let _this = this;
    let width = this.el.offsetWidth;
    let height = this.el.offsetHeight;
    this.scene = new THREE.Scene();
    this.camera = new THREE.PerspectiveCamera(45, width / height, 1, 3000)
    this.renderer = new THREE.WebGLRenderer({
      antialias: true,
      alpha: true
    })
    this.renderer.setPixelRatio(window.devicePixelRatio)
    this.renderer.setSize(width, height)
    this.el.append(this.renderer.domElement)
    this.renderer.setClearColor('#000')

    window.addEventListener('resize', function () {
      _this.camera.aspect = _this.el.offsetWidth / _this.el.offsetWidth;
      _this.camera.updateProjectionMatrix();
      _this.renderer.setSize(_this.el.offsetWidth, _this.el.offsetWidth);
    }, false)
  }

  // 初始化helper
  initHelper() {
    this.scene.add(new THREE.AxesHelper(100))
  }

  // 初始化控制器
  initOrbitControls() {
    let controls = new OrbitControls(this.camera, this.renderer.domElement)
    controls.enableDamping = true
    controls.enableZoom = true
    controls.autoRotate = false
    controls.autoRotateSpeed = 0.3
    controls.enablePan = true
    this.controls = controls
  }

  initLight() {
    let directionalLight = new THREE.DirectionalLight('#fff')
    directionalLight.position.set(30, 30, 30).normalize()
    this.scene.add(directionalLight)
    let ambientLight = new THREE.AmbientLight('#fff', 0.3)
    this.scene.add(ambientLight)
    return {
      directionalLight,
      ambientLight
    }
  }
}
  1. 在vue文件中调用此类初始化three
<template>
  <div id="box" class="container"></div>
</template>

<script>
import ZThree from "@/three/ZThree";
import * as THREE from "three";

let app, camera, scene, renderer, controls, clock, cityModel;

export default {
  name: "Home",
  components: {},
  methods: {
    async initZThree() {
      app = new ZThree("box");
      app.initThree();
      app.initHelper();
      app.initOrbitControls();
      app.initLight();
      window.app = app;
      camera = app.camera;
      scene = app.scene;
      renderer = app.renderer;
      controls = app.controls;
      clock = new THREE.Clock();
      camera.position.set(30, 30, 30);
    },
  },
  mounted() {
    this.initZThree();
  },
};
</script>

<style lang='less' scoped>
.container {
  width: 100%;
  height: 100%;
  overflow: hidden;
  background-color: #000;
}
</style>

此时我们可以看到的场景是,如果能够看到坐标轴辅助线,代表我们的场景已经加载成功
在这里插入图片描述
此时我们已经成功创建了three的场景,接下来我们开始加载模型,天空盒等更加好玩的东西~

加载模型

  1. 在ZThree类中加入loaderObjModel方法用来加载模型
// 加载obj模型
  loaderObjModel(path, objName, mtlName) {
    return new Promise(resolve => {
      new MTLLoader()
        .setPath(path)
        .load(mtlName + '.mtl', function (materials) {
          console.log(materials)
          materials.preload();

          // 加载obj
          new OBJLoader()
            .setPath(path)
            .setMaterials(materials)
            .load(objName + '.obj', function (object) {
              resolve(object)
            });
        });
    })
  }
  1. 在vue文件中调用此方法
    模型是我随便在网上找的,各位可以随意在网上找一个obj模型来测试即可
	cityModel = await app.loaderObjModel(
        "model/city/",
        "CityIslands",
        "City_Islands"
      );

      scene.add(cityModel);

此时有些小伙伴可能会比较奇怪的是为什么初始化进来时看不到模型或是只能看到模型的一小部分,那是你的相机设置的位置不对,教给大家一个小技巧,我们把app对象给挂载到window对象上,然后我们在调整控制器到视角最好的位置,此时打开控制台,输入app.camera.position和app.controls.target
在这里插入图片描述
此时我们就可以看到对应的参数,然后我们在设置一下就ok了

camera.position.set(18, 364, 397);
controls.target = new THREE.Vector3(2, 44, -32);
### 回答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开发可视化项目可以更加高效地创建、管理和操控三维场景,开发出富有交互性和动态效果的可视化应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃土豆丝嗯z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值