大家好,我是鱼樱!!!
关注公众号【鱼樱AI实验室】
分享更多前端和AI辅助前端编码新知识~~~后续还会分享cursor无限续杯操作
今年目标打算继续学习辅助编码AI工具、java基础,three.js、web3.js和鸿蒙next(api12后的知识点)
给大家分享~为爱发电,找最难的挑战一下自己~~~
一、Three.js 是什么?
Three.js 是一个基于 WebGL 的 JavaScript 3D 图形库,它简化了浏览器中复杂 3D 场景的创建流程。通过封装 WebGL 底层 API,开发者无需深入掌握图形学原理,即可快速构建交互式 3D 应用。
核心特性
- 跨平台:支持桌面/移动浏览器,兼容 WebXR(VR/AR)
- 模块化:提供几何体、材质、光源、相机、动画等完整工具链
- 高性能:支持 GPU 加速渲染、实例化渲染、LOD 优化等
- 生态丰富:拥有模型加载器(GLTF)、物理引擎(Cannon.js)、后期特效等扩展
二、Three.js 能做什么?
1. 常见应用场景
领域 | 典型应用 | 案例参考 |
---|---|---|
数据可视化 | 3D 地图、分子结构、实时数据仪表盘 | NASA 太空数据可视化 |
游戏开发 | 网页3D游戏、休闲小游戏 | HexGL(赛车游戏) |
产品展示 | 3D 电商商品预览、虚拟展厅 | IKEA Place(AR家具预览) |
教育仿真 | 物理实验模拟、历史场景还原 | Google 海洋探索 |
2. 技术亮点
-
动态交互:实现物体拖拽、射线检测、物理碰撞
-
高级特效:
js// 辉光特效示例 import { BloomEffect, EffectComposer } from 'postprocessing'; const bloomEffect = new BloomEffect({ intensity: 2 }); composer.addPass(bloomEffect);
-
跨端扩展:与 WebXR 结合开发 VR/AR 应用
三、如何系统学习 Three.js?
1. 学习路径(分阶段)
阶段 1:基础入门(1-2周)
-
核心概念:场景(Scene)、相机(Camera)、渲染器(Renderer)
-
基础组件:几何体(Geometry)、材质(Material)、光源(Light)
-
必备工具:
- 调试工具:
Three.js Inspector
浏览器插件 - 模型资源:Sketchfab 免费3D模型库
- 调试工具:
阶段 2:进阶实战(2-4周)
- 动画系统:关键帧动画、骨骼动画、变形动画
- 交互开发:射线检测(Raycaster)、拖拽控制器(DragControls)
- 性能优化:实例化渲染(InstancedMesh)、LOD 技术
阶段 3:高级扩展(4周+)
- 着色器编程:编写 GLSL 实现自定义材质效果
- 物理引擎:集成 Cannon.js 实现刚体动力学
- WebXR:开发 VR/AR 应用
2. 学习方法与资源推荐
高效学习法:
-
20% 理论:理解 3D 坐标系、矩阵变换、光照模型
-
80% 实践:从简单项目开始,如:
md# 新手项目建议 1. 3D 粒子文字动画 2. 全景图片查看器 3. 第一人称视角迷宫
必看资源:
类型 | 推荐内容 |
---|---|
官方文档 | Three.js Docs(最新API查询) |
视频教程 | Three.js Journey(付费,最系统) |
开源项目 | Three.js 官方示例 |
书籍 | 《Learning Three.js》第五版 |
3. 避坑指南
常见误区:
- ❌ 只调 API 不学原理 → 遇到复杂问题无法调试
- ❌ 忽略 3D 数学基础 → 无法实现自定义动画效果
- ❌ 直接上手复杂项目 → 容易挫败放弃
正确姿势:
-
数学补强:掌握向量、矩阵、四元数基础(推荐《3D Math Primer》)
-
调试技巧:
js// 快速定位物体 window.THREE = THREE; // 控制台直接调试场景对象 console.log(scene.children); // 查看场景树结构
-
性能意识 :用
stats.js
监控帧率,避免过度绘制
四、学习路线图
五、入门代码示例
html
<!DOCTYPE html>
<html>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<script>
// 1. 创建场景
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// 2. 添加立方体
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
camera.position.z = 5;
// 3. 动画循环
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
</script>
</body>
</html>
📌 行动建议:
- 立即尝试运行上述代码,观察旋转立方体效果
- 访问 Three.js Editor 在线编辑场景
- 加入 Three.js Slack 社区 获取实时帮助
掌握 Three.js 后,你将能从前端开发者升级为 全栈 3D 开发者,在元宇宙、数字孪生等前沿领域占据先机!
Vue3 + Three
安装
sh
# npm方式
npm install --save three
# pnpm 方式
pnpm add three
基础入门demo
html
<template>
<!-- 3D场景容器,使用ref获取DOM元素 -->
<div class="three-container" ref="container"></div>
</template>
<script setup>
// 导入Three.js核心库
import * as THREE from 'three'
// 导入Vue组合式API
import { onMounted, onBeforeUnmount, ref } from 'vue'
// 创建DOM引用
const container = ref(null)
// 声明Three.js全局变量
let scene, camera, renderer, cube // 场景、相机、渲染器、立方体
let animationFrameId // 动画帧ID,用于清理动画
/**
* 初始化3D场景
* @param {HTMLElement} containerEl - 场景容器DOM元素
*/
const initScene = (containerEl) => {
// 创建场景 - 场景是所有3D对象的容器
scene = new THREE.Scene()
// 创建相机 - PerspectiveCamera模拟人眼视角
// 参数:视野角度(FOV),长宽比,近裁剪面,远裁剪面
camera = new THREE.PerspectiveCamera(
75, // 视野角度
containerEl.clientWidth / containerEl.clientHeight, // 长宽比
0.1, // 近裁剪面
1000 // 远裁剪面
)
// 设置相机位置,默认相机位于原点(0,0,0)
camera.position.z = 5
// 创建WebGL渲染器
renderer = new THREE.WebGLRenderer({
antialias: true // 启用抗锯齿
})
// 设置渲染器尺寸为容器大小
renderer.setSize(containerEl.clientWidth, containerEl.clientHeight)
// 设置设备像素比,避免高DPI设备模糊
renderer.setPixelRatio(window.devicePixelRatio)
// 将渲染器的canvas添加到DOM中
containerEl.appendChild(renderer.domElement)
// 创建立方体
// BoxGeometry创建立方体几何体
const geometry = new THREE.BoxGeometry()
// MeshPhongMaterial创建具有镜面高光的材质
const material = new THREE.MeshPhongMaterial({
color: 0x00ff00, // 绿色
shininess: 60 // 光泽度
})
// 网格对象combines几何体和材质
cube = new THREE.Mesh(geometry, material)
// 将立方体添加到场景中
scene.add(cube)
// 添加光源
// 环境光 - 均匀照亮场景中的所有物体
const ambientLight = new THREE.AmbientLight(0x404040) // 柔和的灰色光
scene.add(ambientLight)
// 平行光 - 模拟太阳光
const directionalLight = new THREE.DirectionalLight(0xffffff, 1)
directionalLight.position.set(1, 1, 1) // 设置光源位置
scene.add(directionalLight)
// 开始动画循环
animate()
}
/**
* 动画循环函数
* 在每一帧中更新场景
*/
const animate = () => {
// 请求下一帧动画
animationFrameId = requestAnimationFrame(animate)
// 更新立方体旋转
if (cube) {
cube.rotation.x += 0.01 // 绕X轴旋转
cube.rotation.y += 0.01 // 绕Y轴旋转
}
// 渲染场景
renderer.render(scene, camera)
}
/**
* 处理窗口大小变化
* 更新相机和渲染器以保持场景正确显示
*/
const handleResize = () => {
if (!renderer || !camera) return
const containerEl = renderer.domElement.parentElement
const width = containerEl.clientWidth
const height = containerEl.clientHeight
// 更新相机宽高比
camera.aspect = width / height
camera.updateProjectionMatrix()
// 更新渲染器尺寸
renderer.setSize(width, height)
}
// 组件挂载时初始化场景
onMounted(() => {
initScene(container.value)
// 监听窗口大小变化
window.addEventListener('resize', handleResize)
})
// 组件卸载时清理资源
onBeforeUnmount(() => {
// 移除事件监听
window.removeEventListener('resize', handleResize)
// 停止动画循环
cancelAnimationFrame(animationFrameId)
// 清理Three.js资源
if (renderer) {
renderer.dispose()
}
if (cube) {
cube.geometry.dispose() // 清理几何体
cube.material.dispose() // 清理材质
}
})
// 定义组件名,用于开发工具调试
defineOptions({
name: 'ThreeScene'
})
</script>
<style scoped>
/* 场景容器样式 */
.three-container {
width: 100%;
height: 100vh; /* 占满视口高度 */
overflow: hidden; /* 防止出现滚动条 */
}
</style>
这样即可完成一个旋转立方体的效果
看到这是不是觉得入门three.js也不是那么的难呢~~~但是学会学精学懂肯定是难度存在的!!!不难咱也不玩~程序代码就是这样的简单的没挑战啊!!!