【ThreeJs】【自带依赖】Three.js 自带依赖指南
🛠️ Three.js 辅助库生态手册
定位:覆盖 90% 开发场景的工具选型+实操指南,区分「入门必备」和「进阶扩展」。
适用人群:Three.js 新手(≥ r132 版本)、需要规范开发流程的团队。
1. 控制器(Controls):让用户“摸得到”3D场景
📌 核心作用
通过鼠标、键盘、触控实现相机交互,是 3D 场景的“基础交互入口”。
场景举例:产品3D展示(旋转查看)、FPS游戏(第一人称移动)、漫游系统(飞行浏览)。
🔍 工具选型表(按使用频率排序)
优先级 | 控制器名称 | 核心功能 | 适用场景 | 自带/引入方式 |
---|---|---|---|---|
⭐⭐⭐ | OrbitControls | 轨道旋转+缩放+平移,带边界限制 | 产品3D展示、模型查看 | 需引入:import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; |
⭐⭐ | FirstPersonControls | 第一人称视角(WASD移动+鼠标转向) | FPS游戏、虚拟漫游 | 需引入:import { FirstPersonControls } from 'three/addons/controls/FirstPersonControls.js'; |
⭐⭐ | FlyControls | 自由飞行(类似飞船操控) | 大场景漫游(如数字城市) | 需引入:import { FlyControls } from 'three/addons/controls/FlyControls.js'; |
⭐ | PointerLockControls | 锁定鼠标(隐藏指针,纯视角控制) | 沉浸式游戏、VR交互前置 | 需引入:import { PointerLockControls } from 'three/addons/controls/PointerLockControls.js'; |
✍️ 入门实操:OrbitControls 基础用法
效果:鼠标左键旋转、右键平移、滚轮缩放,限制相机最小/最大距离。
// 1. 引入并实例化(依赖 camera 和 renderer.domElement)
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';const controls = new OrbitControls(camera, renderer.domElement);// 2. 核心配置(必调参数)
controls.enableDamping = true; // 开启阻尼(平滑交互)
controls.dampingFactor = 0.05; // 阻尼系数(越小越平滑)
controls.minDistance = 5; // 相机最近距离
controls.maxDistance = 50; // 相机最远距离
controls.maxPolarAngle = Math.PI / 2; // 禁止俯视到地平面以下// 3. 动画循环中更新(否则阻尼不生效)
function animate() {requestAnimationFrame(animate);controls.update(); // 关键:更新控制器状态renderer.render(scene, camera);
}
animate();
⚠️ 避坑提示
- OrbitControls 默认会禁用相机的
position.z
手动修改,如需同时控制,需设置controls.screenSpacePanning = false;
。 - FirstPersonControls 需单独处理键盘事件,建议搭配
KeyboardState
库监听按键。
2. 加载器(Loaders):导入外部3D资源
📌 核心作用
将设计师输出的 模型(GLB/FBX)、纹理(JPG/PNG/KTX2)、动画 转化为 Three.js 可识别的对象。
行业主流:GLB 格式(体积小、支持动画/材质,优先选择);KTX2 纹理(压缩率高,适合移动端)。
🔍 工具选型表(按资源类型分类)
资源类型 | 加载器名称 | 支持格式 | 核心优势 | 自带/引入方式 |
---|---|---|---|---|
纹理 | TextureLoader | JPG/PNG/WEBP | 基础纹理加载,核心库自带 | 自带:new THREE.TextureLoader().load('texture.jpg'); |
纹理 | KTX2Loader | .ktx2 | GPU 纹理压缩,节省内存 | 需引入:import { KTX2Loader } from 'three/addons/loaders/KTX2Loader.js'; |
模型 | GLTFLoader | .gltf / .glb | 支持动画、PBR材质、压缩 | 需引入:import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'; |
模型 | FBXLoader | .fbx | 兼容老版3DMax输出模型 | 需引入:import { FBXLoader } from 'three/addons/loaders/FBXLoader.js'; |
模型压缩 | DRACOLoader | 配合 GLTFLoader | 减小 GLB 模型体积(50%+) | 需引入:import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js'; |
✍️ 进阶实操:GLTFLoader + DRACOLoader 加载压缩模型
场景:加载 10MB+ 的 GLB 模型,用 DRACO 压缩后体积降至 3MB 左右。
// 1. 引入加载器
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';// 2. 配置 DRACO 解码器(需下载解码器文件到本地)
const dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath('libs/draco/'); // 解码器路径(从 three/examples/jsm/libs/draco 复制)
dracoLoader.setDecoderConfig({ type: 'js' });// 3. 关联 GLTFLoader 并加载模型
const gltfLoader = new GLTFLoader();
gltfLoader.setDRACOLoader(dracoLoader); // 启用 DRACO 解压缩gltfLoader.load('models/product.glb', // 模型路径(gltf) => { // 加载成功回调scene.add(gltf.scene); // 将模型添加到场景console.log('模型加载成功:', gltf);// 如需播放动画:gltf.animations 存放动画数据},(xhr) => { // 加载进度回调console.log(`加载中:${(xhr.loaded / xhr.total) * 100}%`);},(error) => { // 加载失败回调console.error('模型加载失败:', error);}
);
📎 资源准备
- DRACO 解码器下载:Three.js 官方 examples/libs/draco
- 模型压缩工具:Blender 导出 GLB 时勾选“DRACO Compression”。
3. 调试辅助(Helpers):可视化“看不见”的元素
📌 核心作用
开发阶段显示 坐标轴、相机视锥、光源位置、物体边界 等不可见元素,快速定位问题(如“模型为什么看不见?因为在相机视锥外”)。
发布建议:上线前删除所有 Helper 代码,避免性能消耗。
🔍 常用 Helper 速查表
Helper 名称 | 功能说明 | 自带/引入 | 基础用法示例 |
---|---|---|---|
AxesHelper | 显示 X(红)/Y(绿)/Z(蓝) 坐标轴 | 自带 | scene.add(new THREE.AxesHelper(5)); // 5 为坐标轴长度 |
GridHelper | 显示网格地面(辅助定位物体) | 自带 | scene.add(new THREE.GridHelper(20, 20, 0xcccccc, 0x999999)); // 大小/细分/颜色 |
CameraHelper | 显示相机的视锥体( frustrum ) | 自带 | const camHelper = new THREE.CameraHelper(camera); scene.add(camHelper); |
PointLightHelper | 显示点光源的位置和照射范围 | 自带 | const lightHelper = new THREE.PointLightHelper(pointLight, 1); scene.add(lightHelper); |
Box3Helper | 显示物体的包围盒(碰撞检测前置) | 自带 | const boxHelper = new THREE.Box3Helper(mesh.geometry.boundingBox); scene.add(boxHelper); |
📸 效果示意图(文字描述替代图片)
- AxesHelper:场景中心出现红、绿、蓝三根轴,红色指向右(X轴),绿色指向上(Y轴),蓝色指向屏幕外(Z轴)。
- CameraHelper:以线框形式显示相机的“视野范围”,如果模型在框外,则说明相机看不到该模型。
4. 后期处理(Postprocessing):让画面“更高级”
📌 核心作用
渲染完成后对画面进行二次加工,实现 抗锯齿、泛光、描边、景深 等特效,提升视觉质感。
核心逻辑:EffectComposer
(容器)+ 多个 Pass
(特效通道)叠加。
🔍 常用特效表(按效果分类)
特效类型 | 模块名称 | 效果说明 | 引入方式 |
---|---|---|---|
基础容器 | EffectComposer | 后期处理的核心容器(必用) | import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js'; |
抗锯齿 | FXAAPass | 快速抗锯齿(适合性能有限场景) | import { FXAAPass } from 'three/addons/postprocessing/FXAAPass.js'; |
泛光 | UnrealBloomPass | 模拟 unreal 引擎的泛光效果 | import { UnrealBloomPass } from 'three/addons/postprocessing/UnrealBloomPass.js'; |
描边 | OutlinePass | 高亮物体边缘(选中效果常用) | import { OutlinePass } from 'three/addons/postprocessing/OutlinePass.js'; |
环境光遮蔽 | SSAOPass | 增强物体阴影细节(更真实) | import { SSAOPass } from 'three/addons/postprocessing/SSAOPass.js'; |
✍️ 实操示例:抗锯齿 + 泛光效果
// 1. 引入模块
import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
import { FXAAPass } from 'three/addons/postprocessing/FXAAPass.js';
import { UnrealBloomPass } from 'three/addons/postprocessing/UnrealBloomPass.js';// 2. 初始化后期容器
const composer = new EffectComposer(renderer);// 3. 添加基础渲染通道(必须第一个)
const renderPass = new RenderPass(scene, camera);
composer.addPass(renderPass);// 4. 添加抗锯齿通道
const fxaaPass = new FXAAPass();
composer.addPass(fxaaPass);// 5. 添加泛光通道
const bloomPass = new UnrealBloomPass(new THREE.Vector2(window.innerWidth, window.innerHeight), // 窗口大小1.5, // 泛光强度0.4, // 泛光半径0.85 // 阈值(亮度超过该值才会泛光)
);
composer.addPass(bloomPass);// 6. 动画循环中替换 renderer.render 为 composer.render
function animate() {requestAnimationFrame(animate);controls.update();composer.render(); // 用后期容器渲染,而非直接用 renderer
}
animate();
⚡ 性能提示
- 后期处理会增加 GPU 负担,移动端建议只保留
FXAAPass
,避免泛光/SSAO。 - 多个 Pass 叠加时,按“基础渲染 → 效果处理 → 输出”的顺序添加。
📋 开发规范建议(团队级)
1. 目录结构(按功能分层)
src/
├── three/
│ ├── controls/ # 控制器实例(如 OrbitControls.js)
│ ├── loaders/ # 加载器封装(如 modelLoader.js)
│ ├── post/ # 后期处理配置(如 bloomEffect.js)
│ └── helpers/ # 调试辅助(开发时引入,上线时删除)
2. 版本兼容
- 所有辅助库均从
three/addons/
导入(r132+ 版本推荐,替代旧版three/examples/jsm/
)。 - 保持 Three.js 核心库与辅助库版本一致,避免兼容性问题。
三、进一步优化的方向(按需选择)
- 添加「交互性」:
- 用折叠面板隐藏“进阶实操”和“避坑提示”,新手只看核心表格。
- 为每个库添加“官方文档链接”,方便深入查询。
- 补充「可视化素材」:
- 为控制器、Helper 添加截图/动图(如 OrbitControls 交互动图、GridHelper 效果截图)。
- 为后期处理添加“前后对比图”(如泛光开启/关闭的差异)。
- 增加「场景化案例」:
- 新增“产品3D展示”“FPS游戏demo”等完整案例,串联多个辅助库(如 GLTFLoader + OrbitControls + FXAAPass)。
- 适配「多端场景」:
- 标注每个库的“移动端性能表现”(如 FlyControls 在触控屏上的适配建议)。