返回知识库

网页 3D · 底座与选型

three.jsthree.js

three.js 把 WebGL 的三角形和着色器包装成场景、相机、网格、灯光、控制器这些有名字的积木;你用这些名字指挥 AI、看懂报告,并要求它只在需要 3D 的页面加载。

从空场景开始,一块块搭出 3D 地球

下面的 3D 画面是真的在用 three.js 渲染,现在什么都没有。按任务清单的顺序加积木:每加一块,画面会变、AI 报告多一行,下面的读数是 WebGL 这一帧实际收到的工作量。试着移除相机或灯光,看画面会怎样。

第 0 步 · 依赖正在按需加载 three…three 是一个 npm 依赖:本站构建实测核心包约 734 KB,压缩传输约 184 KB。只有打开这种 3D 页面时才下载,知识列表和首页不加载它。

正在按需加载 3D 引擎(three.js)…

加上「拖拽控制器」后才能转
WebGL 实际在做renderer.info
三角形 / 帧
—
绘制次数 draw call
—
显存里的几何体
—
任务:照着 AI 报告搭出 3D 地球
  1. 相机下一步 · 先决定从哪里看
  2. 地球球体形状 + 地球贴图材质
  3. 灯光让材质有光可反
  4. 拖拽控制器让用户能转着看
  5. 卫星复用同一个球体几何
AI 报告 · 用到的 three.js 对象
  • Scene场景:装下面所有东西
  • WebGLRenderer渲染器:把相机看到的画到 canvas 上
  • 还没有加任何积木:报告里只有场景和渲染器两个空架子。

正在按需加载 three.js:这一步只发生在需要 3D 的页面。

知识点:积木名是你和 AI 的共同语言

刚才每一次画面变化,都对应下面一件事。

  • three.js 是建在 WebGL 上的库:WebGL 只认三角形和着色器,three.js 让你用「场景、相机、网格、灯光」这样有名字的东西描述画面。
  • 积木各管一件事:场景装东西,相机决定从哪看,网格 = 几何体(形状)+ 材质(表面),灯光让标准材质能反光,控制器让用户转动视角。少了相机或灯光,画面就是黑的。
  • 三角形数和绘制次数是 three.js 替你算出来的:一个物体至少一次绘制,复用几何体能省显存,但每多一个物体,三角形和绘制次数照样增加。
  • three 是一个依赖,有实打实的体积:它应该只在需要 3D 的页面按需加载,不能拖慢整站首屏。

什么时候用、怎么验收

当你想要网页里有能转、能点、能动的 3D 时,three.js 是最常见的默认选择。

  • 信号:要做 3D 产品展示、3D 地球 / 地图、可交互的 3D 背景,或者 AI 报告里出现 Scene、Mesh、WebGLRenderer。
  • 项目是 React / Next 且 3D 交互多:考虑让 AI 用 React Three Fiber(底下仍是 three.js);只是一段视频或一张图能讲清的效果,先别上 3D。
  • 验收一:让 AI 在报告里列出用到的 three.js 对象(相机、网格、灯光、控制器),你能对着画面一一认出来。
  • 验收二:打开一个不含 3D 的页面(比如首页),在开发者工具的 Network 里确认没有下载 three;3D 页面则要报告增加了多少 KB。
  • 验收三:离开 3D 页面再回来几次,页面不越来越卡,说明 AI 写了释放(dispose)。

正反例:同一个「首页 3D 地球」

需求只差一句话,用户下载的东西差了一个库。

反例「用 three.js 做个 3D 地球」

AI 在全站布局里直接引入 three,地球是做出来了,可每个页面都多下载约 180 KB;报告只写「已完成 3D 效果」,你看不出用了哪些对象、出问题该从哪查。

正例「只在首页按需加载 three,报告列出用到的对象和增加的体积」

其他页面体积不变;报告写清 PerspectiveCamera、Mesh、DirectionalLight、OrbitControls,地球发黑时你一眼知道该问「灯加了吗」。

快速自测

AI 说「3D 地球已完成」,可你打开页面只看到一团黑色的球形影子,背景星空却正常。最先该问 AI 哪一块积木?

继续查证

术语的技术定义和行为以这些一手或权威资料为准。

下一步学

和本知识点经常一起出现的概念。

看看真实的项目蓝图里,three.js是怎么被用上的。