前端三维可视化:使用 Three.js 构建数据可视化大屏 🚀

在 数字孪生、智慧城市、工业监控 等领域,三维数据可视化(3D Data Visualization)正逐渐成为趋势。相比传统的 ECharts、D3.js2D 可视化,Three.js 让我们能在 Web 端实现更酷炫、更直观的 3D 数据展示。

本篇文章将结合 Three.js + Vue3 ,实现一个 3D 数据可视化大屏 ,涵盖 模型加载、动态数据更新、交互控制 等核心技术,适用于 智慧城市大屏、企业数据看板 等场景。

技术选型

  • Three.js:主流 WebGL 库,用于渲染 3D 场景
  • Vue3 + Vite:前端框架,提升开发效率
  • GSAP:动画库,实现平滑的相机和对象过渡效果
  • TWEEN.js:轻量级动画库,控制对象的渐变效果
  • dat.GUI:开发调试工具,动态调整 3D 参数

3D 可视化大屏效果

我们将实现以下核心功能:

✅ 加载城市建筑模型:展示高楼、道路、桥梁等基础设施

✅ 数据点可视化 :以 粒子、热力图、3D 柱状图 方式显示数据

✅ 交互控制:支持鼠标旋转、缩放、点击查看详情

✅ 动态数据更新 :模拟实时数据变化 ,如交通流量、空气质量等

✅ 炫酷动画:相机飞跃、数据点波动等特效

项目初始化

先创建 Vue3 项目,并安装 Three.js:

sh 复制代码
npm create vite@latest three-dashboard --template vue
cd three-dashboard
npm install three gsap @tweenjs/tween.js dat.gui

然后在 src/components 目录下创建 ThreeScene.vue,用于 3D 场景渲染。

Three.js 基础场景

vue 复制代码
<template>
  <div ref="threeContainer" class="three-container"></div>
</template>

<script setup>
import { ref, onMounted } from "vue";
import * as THREE from "three";

const threeContainer = ref(null);
let scene, camera, renderer;

onMounted(() => {
  initThree();
});

const initThree = () => {
  // 创建场景
  scene = new THREE.Scene();

  // 创建相机
  camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
  camera.position.set(0, 10, 20);

  // 渲染器
  renderer = new THREE.WebGLRenderer({ antialias: true });
  renderer.setSize(window.innerWidth, window.innerHeight);
  threeContainer.value.appendChild(renderer.domElement);
​
  // 添加光源
  const light = new THREE.AmbientLight(0xffffff, 0.6);
  scene.add(light);
​
  // 添加测试立方体
  const geometry = new THREE.BoxGeometry();
  const material = new THREE.MeshStandardMaterial({ color: 0x0077ff });
  const cube = new THREE.Mesh(geometry, material);
  scene.add(cube);
​
  // 渲染循环
  const animate = () => {
    requestAnimationFrame(animate);
    cube.rotation.y += 0.01;
    renderer.render(scene, camera);
  };
  animate();
};
</script>
​
<style>
.three-container {
  width: 100%;
  height: 100vh;
  overflow: hidden;
}
</style>

🚀 效果:一个简单的 3D 立方体旋转,可作为可视化组件的基础。

加载 3D 城市模型

在实际项目中,我们可以使用 GLTF 模型(比 OBJ、FBX 更高效)加载一个城市模型:

javascript 复制代码
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
​
const loader = new GLTFLoader();
loader.load('/models/city.glb', (gltf) => {
  const city = gltf.scene;
  city.scale.set(10, 10, 10);
  scene.add(city);
});

✅ 效果 :加载一个 3D 城市模型,如 智慧城市、工业园区 等场景。

添加数据可视化

3D 柱状图(用于显示流量、销售数据等)

javascript 复制代码
const createBar = (x, z, height) => {
  const geometry = new THREE.BoxGeometry(1, height, 1);
  const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });
  const bar = new THREE.Mesh(geometry, material);
  bar.position.set(x, height / 2, z);
  scene.add(bar);
  return bar;
};
​
// 生成多个数据点
const bars = [];
for (let i = 0; i < 10; i++) {
  bars.push(createBar(i * 2, Math.random() * 10, Math.random() * 5 + 2));
}
​
// 动态更新数据
setInterval(() => {
  bars.forEach(bar => {
    bar.scale.y = Math.random() * 3 + 1;
  });
}, 2000);

✅ 效果 :3D 柱状图动态变化,可用于实时流量监控、销售数据分析。

粒子特效(模拟数据点)

javascript 复制代码
const particles = new THREE.BufferGeometry();
const positions = new Float32Array(1000 * 3);
​
for (let i = 0; i < 1000; i++) {
  positions[i * 3] = Math.random() * 50 - 25;
  positions[i * 3 + 1] = Math.random() * 10;
  positions[i * 3 + 2] = Math.random() * 50 - 25;
}
​
particles.setAttribute('position', new THREE.BufferAttribute(positions, 3));
​
const particleMaterial = new THREE.PointsMaterial({ color: 0x44ccff, size: 0.5 });
const particleSystem = new THREE.Points(particles, particleMaterial);
scene.add(particleSystem);

✅ 效果 :使用 粒子系统 模拟数据点,如 空气质量监测、传感器数据可视化。

交互与相机动画

鼠标拖拽控制

javascript 复制代码
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true; // 惯性效果

✅ 效果 :支持 旋转、缩放、拖拽,提升用户体验。

相机动画

javascript 复制代码
import gsap from "gsap";
​
const flyToPosition = (x, y, z) => {
  gsap.to(camera.position, { x, y, z, duration: 2, ease: "power2.inOut" });
};
flyToPosition(10, 10, 10);

✅ 效果 :相机平滑移动 ,适用于场景切换、巡航动画。

总结

本篇文章从 0 到 1 实现 Three.js 3D 数据可视化大屏,包含:

✅ Three.js 场景搭建

✅ GLTF 城市模型加载

✅ 3D 柱状图、粒子系统

✅ 交互控制、动画优化

未来可以扩展:

  • WebSocket 实时数据更新
  • 3D 热力图
  • 光影特效优化

如果你对 3D 数据可视化 感兴趣,不妨亲自实践一下,打造属于你的 智慧城市大屏!🚀

相关推荐
计算机魔术师12 分钟前
没有人告诉他们要这么做——AI 智能体自己学会了"组团"越狱
前端
a努力。23 分钟前
LangChain Agent消息链路全解析
java·前端·javascript
今年下半年26 分钟前
【前端】ant-design-vue 表格「行、列都动态」的处理方案
前端·javascript·vue.js
szarron1 小时前
VNA6 便携式矢量网络分析仪|1MHz‑6.3GHz 手持 VNA 真实应用场景全解析
前端·嵌入式硬件·信息可视化·数据挖掘·数据分析
Reisentyan1 小时前
B站首页,点击视频卡片之后首页自动刷新的问题
前端
默_笙1 小时前
🚕 缺料就出门买:给 RAG 装上"信息够不够"的判断力
前端·javascript
Liora_Yvonne2 小时前
同样用 Element Plus,为什么你的后台总有一股“模板味”?
前端
葡萄城技术团队2 小时前
用 Sheet 页导航视图管理复杂 SpreadJS 工作簿
前端
志尊宝2 小时前
Vue3 零基础每日笔记(054):Pinia 三件套详解——state / getters / actions 全搞懂
前端·javascript·vue.js·vue·前端开发
Caroline5162 小时前
GPT Image 2.5还能这么玩!一套提示词生成IP吉祥物,附完整案例
前端·gpt·tcp/ip