模型 Models
1. 3D模型介绍
基本组成:
- 顶点: 表示模型中的点, 具有三维坐标 xyz,
- 边: 连接两个顶点的线段, 通常用于定义模型的轮廓
- 面: 由三个或更多个顶点组成的多边形。面是 3D 模型的表面单元,用于构成模型的外观。
- 几何体: 用于表示 3D 模型顶点、边和面信息的数据结构。
- 网格: 是由顶点、边和面组成的 3D 模型。用于表示可渲染的 3D 对象。
- 材质: 定义了 3D 模型的外观,例如颜色、纹理、光照反射等属性。
- 纹理: 通常通过 UV 映射将二维图像映射到模型的表面上。
- 骨骼(skeleton)和权重(weights): 对于动画模型,骨骼是种用于表示模型的关节和骨架结构的数据结构。权重用于定义每个顶点受到骨骼影响的程度,从而实现模型的形状变形和动画。
1.1 模型的种类
- 静态模型
是固定不变的模型,是静态的、不具有动画效果的模型。通常是静态的、稳定的对象或场景的表示,它不具备时间上的变化。例如,在建筑设计中使用的静态模型可以展示建筑物的外观、结构和细节,但它不包含动态的元素或运动效果。
- 动画模型
是指具有运动或动态效果的模型,它能够在一定时间范围内产生连续的变化和动作。动画模型可以通过关键帧动画、骨骼动画、物理模拟等技术实现。它描述了模型在时间上的变化,可以展示物体的运动、变形、变换等动态效果。
2. 加载3D模型
threejs 针对不同的模型格式提供了对应的加载器
2.1 常见3D模型
| 模型格式 | Loader | 说明 | 其他 |
|---|---|---|---|
| glTF/glb | GLTFLoader (glTF 2.0) | GLTF(GL Transmission Format)是用于在Web上传输和加载3D模型的开放标准格式 | 开放性使得开发者能够在不同的3D工具和引擎之间进行交互和共享模型数据。使用二进制格式存储模型数据,这使得文件大小更小,加载速度更快。同时支持json格式数据。支持使用压缩算法对模型数据进行压缩,以减小文件大小。此外,GLTF还支持使用扩展来实现更高级的功能,如渐进式加载、动画、材质和纹理等。支持扩展来支持特定的功能和需求。 |
| gltf/glb | DRACOLoader | 主要用于压缩和解压缩三维模型及点云。 以客户端上解压缩为代价,显著减少压缩的图形。 | 独立的Draco文件后缀为.drc,其中包含顶点坐标,法线,颜色和其他的属性, Draco文件不包含材质,纹理,动画和节点结构。当使用Draco压缩的GLTF模型时,GLTFLoader内部会调用DRACOLoader。 |
| Obj | OBJLoader | OBJ格式使用ASCII文本文件存储模型数据,包括顶点坐标、法线、纹理坐标、面索引等信息。 | OBJ文件可以直接打开并查看,方便进行调试和修改。兼容性广泛, 但不支持动画和材质,OBJ文件相对较大,加载时间可能较长。 |
| fbx | FBXLoader | 是由Autodesk开发的通用3D模型和动画交换格式。FBX格式主要用于在不同的3D软件和引擎之间交换和共享模型、材质、动画和其他相关信息。 | FBX格式可以存储模型的几何体、材质、纹理、动画、骨骼绑定和其他相关信息。对动画数据的支持非常强大。它可以存储模型的骨骼绑定、关键帧动画、蒙皮权重、动画曲线等信息,使得在不同软件和引擎之间共享和编辑动画变得更加方便和准确。文件大小常常较大。仍然是Autodesk的专有格式。这意味着FBX的规范并不公开,开发者需要使用Autodesk提供的SDK或加载器来解析和处理FBX文件。 |
| ... |
gltf文件格式预览
报名课程后可查看完整文档
.bin 文件
对应了 gltf 文件 buffers 中 uri 指向的路径, 内部存储模型顶点的数据信息, 这些信息可以单独存储为.bin二进制文件, 也可以直接存储到gltf文件中
.glb 文件
glb 是 gltf格式文件的二进制存储方式, .glb文件相对.gltf文件体积更小,网络传输也就更快。
2.2 模型文件资源
- clara.io
- 3dexport.com
- 3dwarehouse.sketchup.com
- nasa3d.arc.nasa.gov/models
- blendswap.com
- cgtrader.com
- turbosquid.com
2.3 使用blender导入导出模型文件
常见建模软件有maya, 3ds max, c4d, unity, UE(虚幻引擎), blender, 这里以 blender 3.6.1 为例
下载 blender 并安装
界面介绍

导入指定格式的模型文件

节点信息

导出模型


2.4 使用加载器加载3D模型文件
加载3D模型
报名课程后可查看完整文档
2.5 使用 Draco加载压缩模型
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader';
const dracoLoader = new DRACOLoader();
// 设置draco文件路径
dracoLoader.setDecoderPath('/draco/');
// 可选: 开启 Pre-fetch Draco WASM/JS 模块.
dracoLoader.preload();
const gltfLoader = new GLTFLoader();
gltfLoader.setDRACOLoader(dracoLoader);
gltfLoader.load('model.drc', (model) => {
// ...
});3. 模型操作
模型加载完成后可以对模型对象进行自由操作, 如平移旋转缩放, 替换纹理图片等
操作方法:
加载完成后的模型操作
报名课程后可查看完整文档
分组管理
Object3D.getObjectById(id), .getObjectByName(name), .getObjectByProperty(name, value), .getObjectsByProperty(name, value) 获取子对象
分组管理子对象
报名课程后可查看完整文档
材质共享
不同的物体可以使用了相同的材质, 此时模型中可能也是1个材质对象, 这样做可以压缩模型大小, 但是在编写代码过程中可能会对某个物体进行材质修改, 但也会影响相同的材质对象
如何判断是否是共享材质
报名课程后可查看完整文档
解决思路
报名课程后可查看完整文档
模型纹理编码
通常为了保证还原模型色彩渲染, threejs要求纹理图片色彩空间要与渲染器色彩空间保持一致
从152版本开始 threejs 使用sRGB作为默认色彩空间
如果是手动加载纹理图片就需要设置 texture.colorSpace = THREE.SRGBColorSpace;
查看模型纹理编码
报名课程后可查看完整文档
gltf 扩展
threejs gltfLoader 可能会加载到无法识别的 gltf 扩展
如果控制台出现警告, 如: THREE.GLTFLoader: Unknown extension "KHR_materials_pbrSpecularGlossiness". 说明threejs不支持该材质对象的gltf扩展.
通常情况下, 3D模型的物体材质都是PBR材质, 因为这种材质对现实世界模拟的最为真实. 所以遇到无法正常渲染的模型, 可以直接创建PBR材质来替换模型中对应的对象
解决不支持的gltf扩展
报名课程后可查看完整文档
手动替换模型纹理图片
自主加载纹理图片
报名课程后可查看完整文档
解决纹理图片显示异常
报名课程后可查看完整文档
vscode 模型预览插件
vscode 有插件可以直接预览模型渲染效果, 方便用于渲染对比
模型渲染精度
报名课程后可查看完整文档
模型后期处理 (效果合成器 EffectComposer)
用于在three.js中实现后期处理效果。该类管理了产生最终视觉效果的后期处理过程链。 后期处理过程根据它们添加/插入的顺序来执行,最后会被自动渲染到屏幕上。
常用的后期效果:
- 运动幻影(Afterimage):通过在场景中创建多个透明或半透明的对象副本,每个对象副本都稍微延迟于前1个对象副本的位置和姿态,从而创建出连续运动的幻影效果。这种效果可以用于增强物体的运动感和动态性,使得物体在场景中的运动更加流畅和生动。
运动幻影
报名课程后可查看完整文档

- 泛光效果(UnrealBloomPass):通过模糊处理和混合操作,实现最终图像上的泛光视觉效果。
泛光效果
报名课程后可查看完整文档

- 半色调效果(HalftonePass):通过将半色调效果与渲染结果混合,实现最终图像上的半色调视觉效果。
半色调效果
报名课程后可查看完整文档

- 图像故障效果(GlitchPass):通过将图像故障效果与渲染结果混合,实现最终图像上的图像故障视觉效果。
图像故障效果
报名课程后可查看完整文档

- 高亮发光描边(OutlinePass):通过在场景中的物体边缘周围绘制线条来突出物体的轮廓,从而使物体在渲染时更加突出和清晰。
高亮发光描边
报名课程后可查看完整文档

- 点阵屏幕效果(DotScreenPass):通过将点阵屏幕效果与渲染结果混合,实现最终图像上的点阵屏幕视觉效果。
点阵屏幕效果
报名课程后可查看完整文档

- 景深效果(BokehPass):通过调整场景中的焦距和景深,可以模拟出现实中的景深效果。
景深效果
报名课程后可查看完整文档

- 辉光效果(Bloom):辉光效果是指当光线照射到物体表面时,部分光线会散射并在周围产生模糊的光晕效果。
辉光效果
报名课程后可查看完整文档

有时你或许想要自己写个自定义后期处理着色器,并将其包含到后期处理过程链中。 对于这个需求,你可以使用ShaderPass。
自定义后期处理着色器示例
报名课程后可查看完整文档
你也可以借助专业的后期效果库来创建视觉效果 如:
4. 动画系统
4.1 关键帧动画
关键帧轨道(KeyframeTrack)中总是存在两个数组:times数组按顺序存储该轨道的所有关键帧的时间值,而values数组包含动画属性的相应更改值。(官方文档)
手动创建 keyframes
报名课程后可查看完整文档
3D模型动画
- 动画混合器(AnimationMixer)
是用于场景中特定对象的动画的播放器。当场景中的多个对象独立动画时,每个对象都可以使用同1个动画混合器。
- 动画剪辑(AnimationClip)
是可重用的关键帧轨道集,它代表动画。
- 动画动作(AnimationAction)
用来调度存储在AnimationClips中的动画。而且大多数方法都可以链式调用。不要直接调用这个构造函数,而应该先用AnimationMixer.clipAction实例化 AnimationAction,因为这个方法提供了缓存以提高性能。
简单案例
报名课程后可查看完整文档
webworker并发加载模型
webworker
报名课程后可查看完整文档
控制动画
控制动画
报名课程后可查看完整文档
控制模型动画案例
报名课程后可查看完整文档
4.2 变形动画
报名课程后可查看完整文档
4.3 骨骼动画
报名课程后可查看完整文档
创建骨骼
Bone 有以下属性:
- name:骨骼的名称。
- parent:骨骼的父骨骼。
- children:骨骼的子骨骼。
- matrix:骨骼的变换矩阵。
- position:骨骼的位置。
- rotation:骨骼的旋转。
- scale:骨骼的缩放。
- ...
创建骨骼 Bone
报名课程后可查看完整文档
创建骨架 skeleton
报名课程后可查看完整文档
借助 SkeletonHelper 进行可视化骨骼关节
报名课程后可查看完整文档
通常来说模型文件中的骨骼都是在3D建模软件中制作的, 我们不用关心如何生成骨骼网格, 只需要获取到骨骼的信息即可
模型文件中也可能包含人物动画, 如人物行走, 跳跃, 摔倒等动作, 这些动作也是由建模软件来实现, 我们只要关心如何读取动画
实现原理是物体表面的顶点会与附近的骨骼绑定, 骨骼的移动旋转会带动附近的顶点位置发生变化, 然后通过关键帧动画来控制骨骼关节运动, 从而带动皮肤(顶点)发生变形, 形成骨骼动画效果
借助 SkeletonHelper 可视化查看3D模型骨骼关节
报名课程后可查看完整文档
蒙皮网格 (SkinnedMesh)
报名课程后可查看完整文档
4.4 路径动画
报名课程后可查看完整文档
4.4.1 创建路径动画
报名课程后可查看完整文档
4.4.2 路径动画在游戏和场景中的应用
报名课程后可查看完整文档
4.4.3 脚步预测
报名课程后可查看完整文档
4.4.4 如何在不平坦的地面行走
报名课程后可查看完整文档
4.5 物理引擎动画
见第12章物理引擎章节
5. 性能优化&常见模型加载问题
报名课程后可查看完整文档
报名课程后可查看完整文档
