news 2026/8/11 2:52:24

Vue3 + Three.js 入门教程:从零构建3D可视化应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue3 + Three.js 入门教程:从零构建3D可视化应用

1. 前言:为什么选择 Vue3 + Three.js?

Three.js 是目前最流行的 Web 3D 图形库,而 Vue3 以其优秀的响应式系统和组合式 API 成为现代前端开发的首选框架之一。将两者结合,可以让我们在 Vue 的组件化开发模式下,轻松创建交互式 3D 可视化应用。本教程将带你从零开始,一步步搭建一个基础的 Vue3 + Three.js 项目。

2. 环境准备与项目创建

2.1 安装 Node.js 与 Vue CLI

确保你的系统已安装 Node.js(建议版本 16+)。然后通过 npm 全局安装 Vue CLI:

npm install -g @vue/cli

2.2 创建 Vue3 项目

使用 Vue CLI 创建一个新的 Vue3 项目:

vue create vue-three-demo

在提示中选择Vue 3预设,并按照指引完成项目创建。

2.3 安装 Three.js 依赖

进入项目目录,安装 Three.js:

cd vue-three-demo npm install three

3. 第一个 3D 场景:旋转的立方体

3.1 创建 Three.js 组件

src/components目录下创建ThreeScene.vue文件:

<template> <div ref="container" class="three-container"></div> </template> <script setup> import { ref, onMounted, onUnmounted } from 'vue' import * as THREE from 'three' const container = ref(null) // 场景、相机、渲染器 let scene, camera, renderer // 立方体 let cube onMounted(() => { init() animate() }) onUnmounted(() => { // 清理资源 if (renderer) { renderer.dispose() } }) const init = () => { // 1. 创建场景 scene = new THREE.Scene() scene.background = new THREE.Color(0x87ceeb) // 天空蓝背景 // 2. 创建相机(透视相机) camera = new THREE.PerspectiveCamera( 75, // 视野角度 container.value.clientWidth / container.value.clientHeight, // 宽高比 0.1, // 近截面 1000 // 远截面 ) camera.position.z = 5 // 3. 创建渲染器 renderer = new THREE.WebGLRenderer({ antialias: true }) renderer.setSize(container.value.clientWidth, container.value.clientHeight) container.value.appendChild(renderer.domElement) // 4. 创建立方体几何体 const geometry = new THREE.BoxGeometry(1, 1, 1) // 5. 创建基础材质(绿色) const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }) // 6. 创建网格(物体) cube = new THREE.Mesh(geometry, material) scene.add(cube) // 7. 添加环境光(非必须,BasicMaterial 不需要光照) // const ambientLight = new THREE.AmbientLight(0xffffff, 0.5) // scene.add(ambientLight) } const animate = () => { requestAnimationFrame(animate) // 让立方体旋转 if (cube) { cube.rotation.x += 0.01 cube.rotation.y += 0.01 } // 渲染场景 renderer.render(scene, camera) } </script> <style scoped> .three-container { width: 100%; height: 500px; border: 1px solid #ccc; } </style>

3.2 在主页面中使用组件

修改src/App.vue

<template> <div id="app"> <h1>Vue3 + Three.js 入门示例</h1> <ThreeScene /> </div> </template> <script setup> import ThreeScene from './components/ThreeScene.vue' </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; text-align: center; margin-top: 20px; } </style>

3.3 运行项目

npm run serve

打开浏览器访问http://localhost:8080,你将看到一个绿色立方体在蓝色背景中缓缓旋转。

4. 核心概念解析

4.1 Three.js 三大核心对象

  • 场景(Scene):所有 3D 对象的容器,相当于一个舞台。
  • 相机(Camera):观察场景的视角,决定了最终渲染到屏幕上的画面。
  • 渲染器(Renderer):将场景和相机结合,绘制出最终的 2D 图像到 Canvas 上。

4.2 几何体、材质与网格

  • 几何体(Geometry):定义物体的形状(如立方体、球体)。
  • 材质(Material):定义物体的外观(如颜色、纹理、反光度)。
  • 网格(Mesh):将几何体和材质结合,形成一个可以在场景中显示和操作的物体。

4.3 动画循环

使用requestAnimationFrame创建动画循环,在每一帧更新物体状态(如旋转、位移)并重新渲染场景。

5. 进阶:添加交互与光照

5.1 更换为受光照影响的材质

MeshBasicMaterial改为MeshPhongMaterial,并添加光源:

// 在 init 函数中替换材质和添加光源 const material = new THREE.MeshPhongMaterial({ color: 0x00ff00 }) // 添加平行光 const directionalLight = new THREE.DirectionalLight(0xffffff, 1) directionalLight.position.set(1, 1, 1) scene.add(directionalLight) // 添加环境光 const ambientLight = new THREE.AmbientLight(0x404040) scene.add(ambientLight)

5.2 添加轨道控制器(鼠标交互)

安装轨道控制器库:

npm install three-orbitcontrols

在组件中引入并使用:

import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' // 在 init 函数中,创建渲染器后添加 const controls = new OrbitControls(camera, renderer.domElement) controls.enableDamping = true // 启用阻尼(惯性效果) controls.dampingFactor = 0.05

并在animate函数中更新控制器:

controls.update()

现在你可以用鼠标拖拽旋转视角,滚轮缩放场景。

6. 性能优化与资源清理

  • 组件卸载时清理:在onUnmounted中调用renderer.dispose()释放 WebGL 资源。
  • 响应式尺寸:监听窗口大小变化,更新相机和渲染器尺寸。
  • 使用 BufferGeometry:对于复杂模型,使用BufferGeometry性能更好。
  • 按需渲染:静态场景可使用renderer.setAnimationLoop(null)停止动画循环。

7. 总结与下一步

通过本教程,你已经掌握了在 Vue3 项目中集成 Three.js 的基本流程,并创建了一个可交互的 3D 场景。接下来可以探索:

  • 加载外部 3D 模型(GLTF/OBJ)
  • 使用着色器(Shader)实现高级视觉效果
  • 集成物理引擎(如 Cannon.js)
  • 结合 Vue 的响应式数据驱动 3D 场景更新

完整的示例代码可在 GitHub 上找到。祝你玩得开心,创造出惊艳的 3D 应用!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/11 2:50:01

图像抠图与分割核心技术解析:从原理、差异到数据集选型指南

1. 从“抠图”到“分割”&#xff1a;图像处理中的两大核心技术 在图像处理与计算机视觉的实际项目中&#xff0c;我们经常听到“Matting”&#xff08;抠图&#xff09;和“Segmentation”&#xff08;分割&#xff09;这两个词。乍一看&#xff0c;它们的目标似乎都是把图像中…

作者头像 李华
网站建设 2026/8/11 2:49:19

Unity UI动态高度自适应:基于Text.preferredHeight的高性能实现方案

1. 项目概述&#xff1a;为什么UI框的动态扩容如此重要&#xff1f;在Unity UI开发中&#xff0c;我们经常会遇到一个看似简单却影响深远的细节问题&#xff1a;一个固定宽度的文本框&#xff0c;当里面的文字内容增加时&#xff0c;如何让它的高度自动、平滑地增长&#xff0c…

作者头像 李华
网站建设 2026/8/11 2:46:59

FreeRTOS 通信与同步工具总结

FreeRTOS 的通信同步核心解决两大问题:通信(任务之间传递数据 / 事件)、同步(协调任务执行顺序、保护共享资源),一共 5 大核心对象:队列 Queue、信号量 Semaphore、互斥锁 Mutex、任务通知 Task Notification、事件组 Event Group。 一、各工具核心定位与适用场景 表格…

作者头像 李华
网站建设 2026/8/11 2:40:30

非洲如何成为半导体供应链的重要枢纽

生成式 AI 主导着全球微芯片行业的供需格局&#xff0c;但芯片几乎无处不在&#xff0c;从手机到医疗设备&#xff0c;支撑着各类不可或缺的应用场景。推动全球半导体供应多元化&#xff0c;有助于防止 AI 热潮扭曲芯片的供应与定价。非洲国家可以通过区域协同的方式&#xff0…

作者头像 李华
网站建设 2026/8/11 2:40:00

微元法解析含容导体棒在磁场中的变减速运动

在物理和工程问题中&#xff0c;我们常常会遇到物体在变力作用下的运动分析。一个典型的模型是&#xff1a;一根导体棒在磁场中切割磁感线&#xff0c;同时棒上带有电容&#xff0c;构成一个包含电容、电阻和动生电动势的电路。由于棒的运动速度变化&#xff0c;产生的感应电动…

作者头像 李华
网站建设 2026/8/11 2:37:43

前端页面调用应用侧函数:鸿蒙 ArkWeb 双向通信学习笔记

本文是一篇从"踩坑"到"想通"的实战记录&#xff0c;围绕 HarmonyOS 中 Web 组件与 ArkTS 应用侧的双向调用&#xff0c;记录原理、对比、代码与心得。 为什么前端页面需要"反过来"调应用侧 做混合开发久了&#xff0c;会形成一种惯性思维&…

作者头像 李华