【前端进阶之旅】Vue3 + Three.js 实战:从零构建交互式 3D 立方体场景

【前端进阶之旅】Vue3 + Three.js 实战:从零构建交互式 3D 立方体场景

文章目录

本文为Three.js系列文章,专注前端 3D 可视化领域,从基础原理到实战落地,带你从零掌握 Three.js,适配 Web 端 VR、数字孪生、3D 展厅、数据可视化等主流业务场景。

【前端进阶之旅】3D 引擎的基本理解 —— 基于 Three.js,吃透 3D 场景六大核心要素
项目完整代码请看这里

前言

Three.js,作为目前业界最主流、生态最完善的 WebGL 开源框架,它封装了复杂的底层 WebGL API,让前端开发者无需深入学习图形学知识,就能快速在网页中构建出高性能、沉浸式的 3D 场景,是前端踏入 3D 世界的最佳入门选择。

一、前置准备:Three.js 环境搭建

npm + Vite 工程化引入(实际项目首选)

# 安装Three.js核心库npminstall three # 安装可视化调试工具pnpmadd dat.gui pnpmadd @types/dat.gui -D 

在项目中引入使用:

<script setup lang="ts">import * as THREE from "three";import{ OrbitControls } from "three/examples/jsm/Addons.js";import{ onMounted, ref } from "vue";import gsap from "gsap";import * as dat from "dat.gui"; // ... </script>

二、初始化 Three.js 核心三要素:场景、相机、渲染器

上一篇文章我们详细讲解了三大核心要素 —— 场景 (Scene)、相机 (Camera)、渲染器 (Renderer),只有三者配合,才能完成一次完整的 3D 画面渲染,这也是所有 Three.js 项目的基础骨架。
核心 API 与基础用法

// 创建场景const scene =newTHREE.Scene();// 创建相机const camera =newTHREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight,0.1,1000,);// fov: 视野角度, aspect: 长宽比, near: 近端, far: 远端// 设置相机位置 camera.position.z =30;// 创建渲染器const renderer =newTHREE.WebGLRenderer();// 设置渲染器大小 renderer.setSize(window.innerWidth, window.innerHeight);const container = ref<HTMLDivElement |null>(null);onMounted(()=>{if(container.value){ container.value.appendChild(renderer.domElement);render();}});<template><div ref="container"class="container"/></template><style lang="scss" scoped>*{margin:0;padding:0; box-sizing: border-box;}.container {width: 100vw;height: 100vh;}</style>

到这里,我们已经完成了 Three.js 最基础的骨架搭建,接下来我们只需要往场景中添加物体、光源、交互逻辑,就能让这个 3D 世界丰富起来。

三、创建物体:几何体与材质

在 Three.js 中,我们想要创建一个可见的 3D 物体,必须由两部分组成:几何体 (Geometry)材质 (Material),再通过网格 (Mesh) 将两者结合,最终添加到场景中。

// 创建几何体const geometry =newTHREE.BoxGeometry(10,10,10);// 宽, 高, 深度(Z轴)// 创建材质const material =newTHREE.MeshBasicMaterial({color:0x00ff00});// 创建网格const box =newTHREE.Mesh(geometry, materials);// 设置摄像机位置,-1表示摄像机在物体内部 box.geometry.scale(1,1,-1);// 将网格添加到场景中 scene.add(box);
代码中的彩蛋:你可能注意到了代码中有两段被注释掉的函数 useBox 和 useSphere。这是实现360 度全景图的两种常用方法(立方体全景和球体全景)。如果你有六张全景图或一张全景图,取消注释并加载正确的图片路径即可体验 VR 效果。
在这里插入图片描述

四、 响应式窗口适配

为了让 3D 场景在浏览器窗口大小改变时也能正常显示,我们需要监听 resize 事件。

window.addEventListener("resize",()=>{// 更新相机的宽高比 camera.aspect = window.innerWidth / window.innerHeight;// 更新相机的投影矩阵 camera.updateProjectionMatrix();// 更新渲染器的尺寸 renderer.setSize(window.innerWidth, window.innerHeight);});

五、集成 dat.GUI 实现可视化调试

dat.GUI 是一个非常棒的工具,它能让我们快速生成一个控制面板,实时修改参数而不用改代码。

// 初始化 GUIconst gui =newdat.GUI();// 创建一个文件夹来管理立方体相关属性const boxFolder = gui.addFolder("立方体属性");// 添加位置控制滑块 boxFolder.add(box.position,"x").name("移动X轴").min(-10).max(10).step(0.01); boxFolder.add(box.position,"y").name("移动Y轴").min(-10).max(10).step(0.01); boxFolder.add(box.position,"z").name("移动Z轴").min(-10).max(10).step(0.01);// 添加颜色选择器 boxFolder .addColor({ color:0x00ff00},"color").name("修改颜色").onChange((value)=>{ box.material.color =newTHREE.Color(value);});// 定义参数对象,用于控制显示隐藏和触发动画const params ={ visible:true,moveAnimation:()=>{ gsap.to(box.position,{ x:10, duration:2, yoyo:true});}}// 添加复选框和按钮 boxFolder.add(params,"visible").name("显示/隐藏").onChange((value)=>{ box.visible = value;}) boxFolder.add(params,"moveAnimation").name("移动动画"); boxFolder.open();// 默认展开该文件夹// 同理,添加相机属性控制文件夹const cameraFolder = gui.addFolder("相机属性");// ... (代码省略,与立方体类似) cameraFolder.open();

六、轨道控制器 (OrbitControls)

这是让场景 “动” 起来的关键。它允许我们通过鼠标拖拽旋转视角、滚轮缩放。

// 声明控制器变量let controls: OrbitControls;// 用于绑定DOM的 refconst container =ref<HTMLDivElement |null>(null);// 渲染循环函数constrender=()=>{// 如果有控制器,需要在每一帧更新(特别是开启阻尼效果时) controls && controls.update();// 执行渲染 renderer.render(scene, camera);// 请求下一帧,形成循环requestAnimationFrame(render);};onMounted(()=>{if(container.value){// 实例化控制器:需要相机和渲染器的DOM元素作为参数 controls =newOrbitControls(camera, renderer.domElement); controls.enableDamping =true;// 开启阻尼(惯性)效果,让交互更丝滑 controls.update();// 将渲染器生成的 canvas 挂载到 Vue 模板中 container.value.appendChild(renderer.domElement);// 开始渲染循环render();}});

七、模板与样式

最后,我们需要一个容器来放置 Three.js 的画布。

<template><divref="container"class="container"/></template><stylelang="scss"scoped>*{margin: 0;padding: 0;box-sizing: border-box;}.container{width: 100vw;height: 100vh;}</style>

总结

通过这段代码,我们已经掌握了在 Vue3 中使用 Three.js 的基本流程:

  1. 搭建基础: 引入库,创建 Scene、Camera、Renderer。
  2. 添加内容: 创建 Geometry 和 Material,合成 Mesh 并加入场景。
  3. 交互控制: 使用 OrbitControls 进行视角控制。
  4. 调试优化: 使用 dat.GUI 快速调参。
  5. 持续渲染: 使用 requestAnimationFrame 建立动画循环。

Read more

GLM-4.6V-Flash-WEB Web界面使用指南,拖图就出结果

GLM-4.6V-Flash-WEB Web界面使用指南,拖图就出结果 你不需要配置环境、不用写一行推理代码、甚至不用打开终端——只要把一张截图拖进浏览器窗口,几秒钟后,它就能告诉你图里写了什么、画了什么、哪里有问题。这不是未来预告,而是你现在就能在本地跑起来的真实体验。 GLM-4.6V-Flash-WEB 是智谱AI最新开源的轻量级视觉语言模型,专为Web端实时交互而生。它不像某些“实验室模型”那样只存在于论文和Benchmark表格里,而是真正做到了:部署快、启动快、响应快、上手更快。一块RTX 3090,一个浏览器,一次拖拽,结果即刻呈现。 本文不讲训练原理,不列参数表格,不堆技术术语。我们只聚焦一件事:怎么用好它的Web界面?从零开始,到稳定产出,每一步都清晰可操作。 1. 为什么说“拖图就出结果”不是宣传话术? 很多多模态模型标榜“支持图文理解”,但实际用起来才发现:要装依赖、改路径、调精度、修CUDA版本、

前端防范 XSS(跨站脚本攻击)

目录 一、防范措施 1.layui util  核心转义的特殊字符 示例 2.js-xss.js库 安装 1. Node.js 环境(npm/yarn) 2. 浏览器环境 核心 API 基础使用 1. 基础过滤(默认规则) 2. 自定义过滤规则 (1)允许特定标签 (2)允许特定属性 (3)自定义标签处理 (4)自定义属性处理 (5)转义特定字符 常见场景示例 1. 过滤用户输入的评论内容 2. 允许特定富文本标签(如富文本编辑器内容) 注意事项 更多配置 XSS(跨站脚本攻击)是一种常见的网络攻击手段,它允许攻击者将恶意脚本注入到其他用户的浏览器中。

详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)

详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)

目录 1. 打开浏览器开发者工具 2. 使用 Network 面板 3. 查看具体的API请求 a. Headers b. Payload c. Response d. Preview e. Timing 4. 实际操作步骤 5. 常见问题及解决方法 a. 无法看到API请求 b. 请求失败 c. 跨域问题(CORS) 作为一名后端工程师,理解前端如何调用接口、传递参数以及接收返回值是非常重要的。下面将详细介绍如何通过浏览器开发者工具(F12)查看和分析这些信息,并附带图片案例帮助你更好地理解。 1. 打开浏览器开发者工具 按下 F12 或右键点击页面选择“检查”可以打开浏览器的开发者工具。常用的浏览器如Chrome、Firefox等都内置了开发者工具。下面是我选择我的一篇文章,打开开发者工具进行演示。 2. 使用

Cursor+Codex隐藏技巧:用截图秒修前端Bug的保姆级教程(React/Chakra UI案例)

Cursor+Codex隐藏技巧:用截图秒修前端Bug的保姆级教程(React/Chakra UI案例) 前端开发中最令人头疼的莫过于那些难以定位的UI问题——元素错位、样式冲突、响应式失效...传统调试方式往往需要反复修改代码、刷新页面、检查元素。现在,通过Cursor编辑器集成的Codex功能,你可以直接用截图交互快速定位和修复这些问题。本文将带你从零开始,掌握这套革命性的调试工作流。 1. 环境准备与基础配置 在开始之前,确保你已经具备以下环境: * Cursor编辑器最新版(v2.5+) * Node.js 18.x及以上版本 * React 18项目(本文以Chakra UI 2.x为例) 首先在Cursor中安装Codex插件: 1. 点击左侧扩展图标 2. 搜索"Codex"并安装 3. 登录你的OpenAI账户(需要ChatGPT Plus订阅) 关键配置项: // 在项目根目录创建.