three.js 完整笔记

【three.js】简介和本地部署 实现企业网站三维呈现,让企业形象更直观、更立体地展现给客户,打破传统平面展示模式,打造智慧、个性、创新的企业形象。因此我们可以访问b站大佬在国内搭建好的本地three.js官网,大家访问如下链接即可,当然也可以自己搭建,下面有讲解。什么是点、线、面、几何体、材质、物体、场景、相机、渲染器、动画、控制器等基础概念,搞定一个最基础的场景和3d物体的显示。接着3d渲染要真实性,肯定离不开PBR,详细了解什么是PBR,PBR基于物理的光照原理的渲染,。由于访问three.js官网是国外的网站,非常慢。 阅读详情

一、three.js 是什么

Three.js 是一个基于 WebGL 的 JavaScript 3D 图形库,简单说:用 JS 在浏览器里写 3D 效果,不需要安装插件。

官网:threejs.org

浏览器原生只支持 2D 画布(Canvas),WebGL 可直接调用显卡做 3D 渲染,但原生 WebGL API 非常底层、代码繁琐。Three.js 对 WebGL 做了封装,用简单 API 即可创建 3D 场景,支持几何体、材质贴图、光照阴影、相机控制、动画、粒子、后期特效等。

基础三要素(场景必备)

  1. Scene(场景):3D 世界,所有物体放置于此
  2. Camera(相机):相当于眼睛,决定观察视角
  3. Renderer(渲染器):把场景+相机画面绘制到网页

几何体 + 材质 → Mesh(网格物体,即 3D 模型)

能做什么

  • 网页 3D 产品展示(手机、家具、汽车预览)
  • 网页 3D 小游戏
  • 数据可视化、3D 地图
  • 网页 VR / AR 页面
  • 交互式艺术、动态 3D 海报

特点

✅ 纯前端 JS,浏览器直接运行
✅ 开源免费,MIT 协议,可商用
✅ 支持模型导入:GLB/GLTF(最常用)、OBJ 等
✅ 跨平台:电脑、手机浏览器都能用
❌ 是渲染库不是引擎:无内置物理、UI、编辑器;物理需搭配 cannon.js,模型制作一般用 Blender

最简示例代码

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, innerWidth / innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(innerWidth, innerHeight);
document.body.appendChild(renderer.domElement);

const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
camera.position.z = 5;

function animate() {
  requestAnimationFrame(animate);
  cube.rotation.x += 0.01;
  cube.rotation.y += 0.01;
  renderer.render(scene, camera);
}
animate();

运行后网页出现一个旋转的绿色立方体。


二、核心知识点

1. 坐标系

右手坐标系:X 向右(红)、Y 向上(绿)、Z 朝向观察者(蓝)

const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper); // 显示坐标轴辅助线

2. 相机两种类型

  1. PerspectiveCamera 透视相机:近大远小,最常用,模拟人眼视觉
  2. OrthographicCamera 正交相机:无近大远小,适合 CAD、2.5D、工程图

3. 材质(重点区分)

  • MeshBasicMaterial:基础材质,不受光照影响
  • MeshStandardMaterial:PBR 物理材质,支持金属度、粗糙度,写实首选
  • MeshPhysicalMaterial:增强 PBR,支持玻璃透射、清漆、色散(水、玻璃、钻石)
  • MeshPhongMaterial:老式反光材质,新项目一般不推荐
  • ShaderMaterial:自定义着色器(GLSL),做高级特效、水面、光晕

常用属性:roughness 粗糙度、metalness 金属度、emissive 自发光、transparent 透明、opacity 透明度

注意:MeshBasicMaterial 不响应灯光,要有光影必须用 Standard/Phong 类材质

4. 灯光系统

  • AmbientLight:环境光,均匀照亮,无阴影
  • DirectionalLight:平行光(太阳光),支持阴影
  • PointLight:点光源(灯泡),向四周发光
  • SpotLight:聚光灯(手电筒),锥形光束

5. Addons(官方扩展包,需单独导入,高频使用)

不属于 three.js 核心代码,不能直接从 three 主包导入,须从 three/addons/ 引入:

  • OrbitControls 轨道控制器:鼠标拖拽旋转、滚轮缩放场景,绝大多数项目都会用
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
  • GLTFLoader:加载 GLB/glTF 模型(行业标准格式),支持 Draco 压缩,减小体积
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
  • PostProcessing:后期特效,bloom 泛光、轮廓描边、SSR 反射
import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
  • CSS3DRenderer:把网页 DOM 元素放进 3D 空间(3D 网页卡片)
import { CSS3DRenderer } from 'three/addons/renderers/CSS3DRenderer.js';
  • WebXR 相关:网页 VR/AR 控制器、手部追踪工具

核心 vs Addons 速记:
✅ 核心:Scene、Camera、WebGLRenderer、基础几何体、基础材质、基础灯光、TextureLoader —— import * as THREE from 'three' 直接用
⚠️ Addons:控制器、各类模型加载器、后期管线、WebXR —— 需 three/addons/ 单独导入
注:TextureLoader(图片贴图加载器)是核心自带;GLTFLoader/OBJLoader/STLLoader 属于 Addons

6. 模型格式选型

  • glTF / GLB:首选!Web3D 标准,文件小、加载快,Blender 直接导出,支持材质、动画;GLB 是二进制单文件,更方便
  • OBJ+MTL:老格式,不支持动画
  • STL:CAD 模型,仅存几何、不带材质,多用于 3D 打印

7. 渲染器新选择:WebGPURenderer

性能远高于旧 WebGL,支持更多 GPU 特效;浏览器不支持时可自动降级 WebGLRenderer

8. 交互:射线投射 Raycaster

实现鼠标点击拾取 3D 物体。原理:从相机向鼠标位置发射射线,检测与哪些模型相交

9. 性能优化(实战必看)

  1. InstancedMesh:批量渲染大量相同物体(草地、树木、粒子),大幅减少绘制调用
  2. LOD:远处用低面数模型,近处用高精度
  3. 模型压缩:Draco、Meshopt,降低文件体积
  4. 合并静态几何体,减少 draw call
  5. 控制阴影数量:阴影开销高,不要给太多光源开阴影
  6. 移动端限制 pixelRatio,避免高分辨率卡顿

10. 配套工具

  • Blender:建模、展 UV、调材质,导出 glb
  • glTF Viewer:在线预览 glb,提前检查模型
  • 官方示例:threejs.org/examples
  • 文档:threejs.org/docs

11. 局限(客观缺点)

  1. 不是完整游戏引擎:无内置物理、UI、场景编辑器(物理需引 cannon-es)
  2. 移动端性能上限有限,面数/灯光过多易掉帧
  3. 浏览器差异、移动端 WebGL 兼容性偶有坑

12. 安装方式

  1. CDN 直接引入,快速写 demo
  2. npm 安装(vite/webpack):npm install three,ES 模块 import

13. 动画相关

帧动画 / 骨骼动画
  • AnimationMixer:动画混合器,加载 glTF 骨骼动画的核心,驱动人物走动、挥手
  • AnimationClip:动画片段,一个模型可携带多个(走路、跳跃、待机)
  • AnimationAction:动画实例,控制播放、暂停、淡入淡出、混合

常见用法:多个动作平滑过渡(待机→跑步)

Tween 补间动画(addon)

Tween.js:位置、旋转、颜色平滑过渡(物体移动、弹窗动画),是属性插值动画

渲染循环注意点
  • requestAnimationFrame:跟随屏幕刷新率,一般 60 帧
  • 循环内不要频繁新建物体/材质,会产生大量 GC 垃圾导致卡顿
  • 用 clock.getDelta() 保证动画速度在不同帧率下一致:
const clock = new THREE.Clock();
function animate() {
  requestAnimationFrame(animate);
  const delta = clock.getDelta();
  cube.rotation.y += delta * 2; // 按时间驱动,帧率变化速度不变
  renderer.render(scene, camera);
}

14. 纹理 Texture

  • TextureLoader:加载图片纹理(贴图)
  • 贴图分类:颜色、法线、粗糙度、金属、AO 环境闭塞(PBR 写实必备)
  • CubeTexture 立方体贴图:环境贴图,做天空盒、物体反射
  • VideoTexture:把视频作为材质贴图

坑点:跨域图片不能直接作为纹理,服务器需配置 CORS

15. 阴影完整要点

  1. 渲染器开阴影:renderer.shadowMap.enabled = true;
  2. 光源开投影:light.castShadow = true;
  3. 物体:mesh.castShadow = true(投影)+ mesh.receiveShadow = true(接收)
  4. shadow.mapSize 阴影贴图分辨率,越大越清晰、越耗性能

仅平行光/点光源/聚光灯支持阴影;环境光无阴影

16. 分组 Object3D

const group = new THREE.Group();
group.add(cube1, cube2);
scene.add(group);
group.position.x = 2; // 整个组一起平移

Scene、Camera、Mesh、Group 都继承自 Object3D,都有 position/rotation/scale
rotation 默认是弧度,角度转弧度:THREE.MathUtils.degToRad(45)

17. 常用工具类 MathUtils

THREE.MathUtils.degToRad(degrees)   // 角度→弧度
THREE.MathUtils.radToDeg(radians)   // 弧度→角度
THREE.MathUtils.clamp(value, min, max) // 限制区间
THREE.MathUtils.lerp(a, b, alpha)   // 线性插值

18. 几何体新老版本区别

  • BufferGeometry:新版默认,数据存 GPU 缓冲区,性能高(BoxGeometry 本质即它)
  • Geometry:旧版,已废弃,新项目不要用
    几何体属性:顶点、法线、UV;可自定义顶点做不规则模型

19. 空间坐标相关

  • position:世界坐标(简写)
  • .getWorldPosition(target):获取物体在场景中的世界坐标
  • lookAt():让物体/相机/灯光看向某坐标,如 camera.lookAt(cube.position)

20. 资源释放(SPA 项目重点,易被忽略)

不释放会内存泄漏,页面越来越卡:

mesh.geometry.dispose();
mesh.material.dispose();
texture.dispose();
scene.remove(mesh);

21. 多场景、多渲染目标

  • 可多 Scene、多相机切换视角(第一/第三人称切换)
  • RenderTarget 离屏渲染:把 3D 结果当贴图贴到另一模型(监控屏、镜像效果)

22. 单位规范

Three.js 无内置单位,1 是自定义单位。行业惯例 1 单位 = 1 米

23. 版本注意事项

  • 大版本 API 改动大,不要混用不同版本的 three 和 addons(必须完全一致,否则报错)
  • 锁版本,不用 latest,上线固定版本号

24. 常见误区

  1. ❌ 共用材质 dispose 多次(一次即可)
  2. ❌ 以为 MeshBasicMaterial 能接收光照(不响应任何光源)
  3. ❌ 旋转直接写角度,忘用弧度
  4. ❌ 大量独立 Mesh 不用 InstancedMesh → draw call 爆炸
  5. ❌ 模型导入发黑:多半忘了环境光/环境贴图,或法线贴图翻转

25. 相关生态周边库

  • cannon-es / Ammo.js:物理引擎(碰撞、重力、刚体)
  • lil-gui:网页调试面板,实时调参数,开发神器
  • troika-three-text:高性能 3D 文字
  • postprocessing:官方后期管线(bloom、景深、抗锯齿)
  • @react-three/fiber + drei:React 生态封装

26. 抗锯齿

new THREE.WebGLRenderer({ antialias: true });WebGPU 有更好的方案;开启会耗性能

27. 裁剪与可视剔除

  • Frustum culling(视锥剔除):默认开启,视野外物体不渲染
  • mesh.frustumCulled = false 关闭剔除(极少用)
  • 遮挡剔除:three.js 原生不自带,需自实现或用第三方库

超详细的threeJS教程(一) 无论是Vue + three.js 还是 React+three.js ,直接通过npm命令安装即可。四个参数fov, aspect, near, far构成一个四棱台3D空间,被称为视锥体,虚拟场景 (scene)+ 虚拟相机(Camera) + 渲染器(Renderer),才会渲染出,注意near和far的值,以为相机和物体的位置关系。给物体添加什么颜色/种类的光,光的强度和是否衰减。 阅读详情

相关推荐

threeJs 入门篇

1.什么是threeJs 简单的说 ,就是一门 绘制 3D 的 javaScript 轻量级框架; 主要采用 ,HTML5 Canvas提供硬件3D加速渲染; 于是web 端 ,就能制作出 3D 系统 ,访问就能操作 ,十分方便。 文章目录1.什么是threeJsⅠ.为什么要学这门前沿技术Ⅱ.应用场景2. 学习Three .js 入门篇 (一)Ⅰ.安装下载Ⅱ. 创建场景、摄像机、渲染器(画布)Ⅲ. 创建坐标系Ⅳ.平面、立方体、球 的创建Ⅴ. 光源的创建Ⅵ.添加投影Ⅶ.鼠标操控三维场景3. 整合代码 Ⅰ

好川的博客 1万+

Three.js入门教程——教不会算我输

在javascript中使用Three.js设计并且实现3D场景是一个很有意思的事情,因为在浏览器中就能够渲染出3D场景,非常简单和轻便。接下来就总结以下我学习Three.js过程中的心得。 1 建立基本场景 在Three.js中有三要素:场景、摄像机和渲染器,只有以上三者结合才能渲染出可见的内容。当然在这之前你需要先下载Three.js文件,直接百度搜索Three.js到官网下载即可,下载完...

哆啦A瑶的博客 10万+

【Three.js】一、第一个Three.js项目

【Three.js】一、第一个Three.js项目一、Three.js下载 一、Three.js下载 Three.js github:https://github.com/mrdoob/three.js

MAXLZ的博客 3611

【Three.js】搭建Three.js开发环境

Three.js是一个比较著名的3d引擎了,今天搭建了下它的开发环境。 一 官网 官网地址如下: https://threejs.org/ 二 下载源码包 在官网左侧直接点击download,就会把所有的源码下载下来。为方便使用,直接解压,放到web工程的某个地方即可。 三 引入库文件 可以直接引用build下面的库文件。示例代码如下,注意改成你的实际位置 <script src="/static/threejs/build/three.js"></script>.

chengzhf的专栏 8216

three.js学习笔记 射线

Three.js提供一个射线类Raycasting来拾取场景里面的物体。更方便的使用鼠标来操作3D场景。

mystery的专栏 1万+

three.js实现全套3d测距功能(附完整代码)

网上关于测距的实现都是比较片面的,没有完整的例子,最近因为需求,有对相关需求进行实现,给出我的实现方案,供大家参考 效果图: 完整代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" c

codingWeb的博客 4459

three.js 基础认识与简单应用

three.js 基础认识与简单应用

前端菜菜DayDayUp的博客 1万+

three.js多卫星环绕效果

three.js+webgl+卫星多维度环绕+光晕效果

m0_51244077的博客 2132

【基础】Three.js的零基础入门篇(附案例代码)

在使用Three.js时,初学者需要了解如何从零开始创建一个简单的3D场景。以下是创建步骤和一些注意点: 1. 初始化基本组件每个Three.js场景需要几个核心组件:场景(Scene)、相机(Camera)和渲染器(Renderer)。

stay hungry, stay foolish 2万+

three.js学习笔记 用Tween.js做动画

Tween.js 可以定义某个属性在两个值之间过渡。我们可以通过Tween.js控制我们的camera(相机)进行漫游或是控制物体或是粒子进行补间动画的操作。   添加补间动画   1.定义要控制的属性 var option = { px: camera.position.x, pz: camera.position.z }; 我们这里控制camera(相机)的x,z轴

mystery的专栏 7463

【Three.js】五、three.js中的材质——Material

【Three.js】五、three.js中的材质——Material一、 three.js中的材质就是几何体表面的材料。 一、

MAXLZ的博客 2929

Three.js入门学习笔记14:动画小球完整案例

three.js

基本无害的博客 217

Three.js 第一个 3D 场景:从 0 到 1 实现旋转立方体(完整注释 + 环境搭建)

本文详细介绍了使用Three.js创建旋转3D立方体的完整流程。首先提供3种环境搭建方案(CDN引入、Vite+NPM安装、在线编辑器),推荐初学者使用CDN快速入门。核心代码分为8个步骤:创建场景、相机、渲染器;添加立方体几何体和材质;设置灯光;实现动画循环;处理窗口缩放。重点讲解了Three.js四大核心组件(场景、相机、渲染器、物体)的协作关系,并解答了常见问题(如灯光必要性、相机位置设置等)。最后还介绍了如何通过OrbitControls添加交互功能。该案例为后续复杂3D开发奠定基础,建议通过修改参

前端互助会 1933

Three.js初识:three.js的下载与使用

引用cdn: <script src="https://cdn.bootcss.com/three.js/92/three.js"></script>

YanHSama的博客 5729

【Three.js】十一、three.js使用Tween.js

【Three.js】十一、three.js使用Tween.js tween.js是一个轻量级js库,可用来实现一些动画效果。github地址:https://github.com/tweenjs/tween.js/. cnpm安装方式:cnpm install @tweenjs/tween.js -S 使用方法: 1.创建补间 let size1 = {width: 10, height:...

MAXLZ的博客 2843

three.js+node.js入门helloworld

1.因为three.js需要依赖服务器才能完整加载,所以需要先配置好服务器环境,我采用比较流行的node.js。node.js配置见https://www.runoob.com/nodejs/nodejs-install-setup.html以及https://www.runoob.com/nodejs/nodejs-http-server.html。 2.下载three.js的库文件,https://github.com/mrdoob/three.js/。把整个库下载下来。 3. 第一步:新建一个项

qq_42987967的博客 3285

Three.js模型加载及动画效果

在Three.js中导入3D模型并且展示动画 话不多说,先来展示一下背景图 Three.js中必须具备的是:场景,相机,渲染器,几何图形 好了,开始撸代码!!! // 首先需要引人的js文件 // 需要在官网下载 example文件夹中 import * as THREE from './three.module.js'; import Stats from './jsm/libs/stats.module.js'; import { GUI } from

weixin_44078610的博客 5364

three.js学习笔记 相机控件

Three.js 提供了几个camera(相机)的控件,你可以通过使用控件来控制相机的移动。当然你也可以通过调用camera(相机)的position属性来控制。   camera(相机)控件包括:轨迹球控件TrackballControls(最常用的控件,用鼠标控制相机移动和转动)                                               飞行控件F

mystery的专栏 4703
上一篇: Spring WebSocket(STOMP)
ab123768
博客等级 码龄3年 43粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

ab123768

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

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

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

打赏作者

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

抵扣说明:

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

余额充值