学习Three.js--简介+几何体

4 阅读10分钟

学习Three.js--简介+几何体

一、Three.js 简介

1.1 什么是 Three.js

Three.js 是一款基于原生 WebGL 封装的轻量级 JavaScript 3D 图形库,它对 WebGL 底层复杂的图形学逻辑做了高度封装,让开发者无需掌握 WebGL/着色器/线性代数知识,仅通过原生 JS 语法,就能在浏览器中轻松创建高性能的 3D 场景、模型、动画与交互效果。

1.2 核心价值

  • 原生 WebGL 开发门槛极高,需要手动处理顶点着色器、片元着色器、矩阵变换等底层细节;
  • Three.js 屏蔽所有底层复杂度,提供了语义化的 API,专注于「3D 业务实现」而非「图形学底层」;
  • 核心能力:浏览器端纯前端实现 3D 可视化,适用于 3D 产品展示、元宇宙场景、数据可视化、小游戏、建筑漫游等场景。

1.3 前置学习要求

必备:HTML + CSS + JavaScript 基础(ES6 语法即可) 无需:不用懂 WebGL、不用会 3D 建模软件、不用懂线性代数,Three.js 内置所有所需工具

1.4 核心坐标系规则(必记)

Three.js 遵循 右手坐标系,贯穿所有开发环节,所有几何体/物体的位置/尺寸都基于此:

  • X 轴 → 水平向右
  • Y 轴 → 垂直向上
  • Z 轴 → 垂直屏幕向外(相机默认看向 -Z 轴方向)

二、Three.js 三大核心基石(缺一不可,重中之重)

任何一个完整的 Three.js 3D 可视化效果,必须由「场景 + 相机 + 渲染器」三大核心组件构成,三者是 3D 世界的基础,没有例外,全部掌握才能看到最终的 3D 画面。

2.1 场景 (Scene) - 3D世界的「容器/舞台」

核心概念

THREE.Scene() 是一个无视觉形态的容器,可以理解成「3D世界的舞台」,所有的几何体、光源、相机、粒子、模型等3D内容,都需要添加到场景中才能被管理和渲染。

创建语法
// 创建空的3D场景
const scene = new THREE.Scene();
核心特性
  1. 场景本身不可见,仅做「收纳」作用;
  2. 支持通过 scene.add(物体/光源) 方法,向场景中添加任意3D元素;
  3. 支持通过 scene.remove(物体) 方法,移除场景中的指定元素。

2.2 相机 (Camera) - 你的「眼睛/视角」

核心概念

THREE.Camera3D世界的观察者视角,你在浏览器屏幕上看到的所有内容,本质都是「相机拍摄到的场景画面」。相机决定了:从哪个角度、以什么视野、看场景中的哪些内容。

核心常用相机(99%开发场景只用这一种)

Three.js 有多种相机,新手只需掌握「透视相机 PerspectiveCamera」,该相机模拟人眼的视觉效果,实现「近大远小」的透视关系,最符合人类的视觉习惯。

创建语法
// 透视相机:new THREE.PerspectiveCamera(视角, 宽高比, 近裁剪面, 远裁剪面)
const camera = new THREE.PerspectiveCamera(
  75,                // 视角(fov):越大看到范围越广,画面越广,默认75
  window.innerWidth / window.innerHeight, // 宽高比:与画布一致,避免画面拉伸
  0.1,               // 近裁剪面:距离相机小于该值的物体,不渲染(看不见)
  1000               // 远裁剪面:距离相机大于该值的物体,不渲染(看不见)
);
关键注意点

相机默认创建在场景的坐标原点 (0,0,0),与场景中心重合,此时会和几何体重叠导致看不到内容,必须手动调整相机位置,最常用的就是调整Z轴让相机「后退」:

// 相机沿Z轴向后移动5个单位,即可看到场景中心的物体
camera.position.z = 5;

2.3 渲染器 (Renderer) - 画画的「画家/画笔」

核心概念

THREE.WebGLRenderer 是 Three.js 的渲染核心,可以理解成「画家」,核心作用是:把相机视角下的场景内容,绘制到浏览器的 canvas 画布上,我们最终在页面上看到的 3D 画面,就是渲染器的工作成果。

创建语法
// 创建WebGL渲染器
const renderer = new THREE.WebGLRenderer();
// 设置渲染画布的尺寸(与浏览器窗口一致,满屏显示)
renderer.setSize(window.innerWidth, window.innerHeight);
// 将渲染器生成的canvas画布,添加到HTML页面中
document.body.appendChild(renderer.domElement);

2.4 三大核心联动 - 核心渲染指令(必写)

拥有了「场景、相机、渲染器」后,三者唯一的联动核心语法,就是执行渲染命令,让渲染器把相机拍到的场景,绘制到画布上,这行代码是所有Three.js程序的核心

// 语法:渲染器.render(要渲染的场景, 拍摄的相机)
renderer.render(scene, camera);

三、物体形状:几何体 Geometry(完整参数+用法+注意事项)

场景是空的容器,想要在3D世界中看到「物体」,首先需要定义物体的形状和结构 → 这就是「几何体 Geometry」。 Three.js 中所有可见的3D物体,都是 「几何体(形状) + 材质(外观)」 的组合体,几何体是物体的「骨架」,材质是物体的「皮肤」。

核心通用说明

  1. 所有几何体的长度单位:无物理单位,默认约定 1 单位 = 1 米,可根据业务自定义缩放;
  2. 所有几何体的分段数(Segments):参数值越大,几何体的面数越多、顶点越多,形状越平滑,但会增加性能开销;常规开发中 16~64 足够,远距离物体可使用更小的值;
  3. 所有角度相关参数:单位均为 弧度,而非角度(Math.PI = 180°Math.PI*2 = 360°);
  4. 搭配规则:如果几何体使用 MeshStandardMaterial/MeshPhongMaterial/MeshLambertMaterial 等受光照影响的材质,必须给场景添加光源,否则物体会显示纯黑色。

3.1 长方体 | BoxGeometry

用途

创建立方体、长方体,是最基础、最常用的几何体,适用于盒子、方块、墙体、立方体模型等场景。

创建语法
// 最简创建(长宽高为2的正方体)
const boxGeometry = new THREE.BoxGeometry(2, 2, 2);
// 完整语法
const boxGeometry = new THREE.BoxGeometry(width, height, depth, widthSegments, heightSegments, depthSegments);
完整参数说明
参数类型默认值核心说明
widthnumber1X 轴方向的尺寸(长方体的长)
heightnumber1Y 轴方向的尺寸(长方体的高)
depthnumber1Z 轴方向的尺寸(长方体的深)
widthSegmentsinteger1X 轴方向的分段数,值越大侧面越平滑
heightSegmentsinteger1Y 轴方向的分段数
depthSegmentsinteger1Z 轴方向的分段数

3.2 圆柱体 | CylinderGeometry

用途

创建标准圆柱、空心圆柱、圆锥台、管道;特殊用法:顶部半径设为0 → 圆锥、扫描角度小于360° → 弧形柱体。

创建语法
// 最简创建(上下半径1,高度2,圆周32段的标准圆柱)
const cylinderGeometry = new THREE.CylinderGeometry(1, 1, 2, 32);
// 完整语法
const cylinderGeometry = new THREE.CylinderGeometry(radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength);
完整参数说明
参数类型默认值核心说明
radiusTopnumber1圆柱体顶部圆形的半径
radiusBottomnumber1圆柱体底部圆形的半径
heightnumber1圆柱体的高度(沿 Y 轴方向)
radialSegmentsinteger32圆周方向的分段数,值越大圆柱越圆滑
heightSegmentsinteger1高度方向的分段数
openEndedbooleanfalse是否无顶面/底面,true=空心柱体,false=封闭柱体
thetaStartnumber(弧度)0圆柱的起始绘制角度(从X轴正方向开始)
thetaLengthnumber(弧度)Math.PI*2圆柱的扫描角度,=完整圆柱,小于则为扇形柱

3.3 球体 | SphereGeometry

用途

创建完整球体、半球、球壳、扇形球等,适用于球体模型、星球、圆球物体等场景。

创建语法
// 最简创建(半径1,32段经线、32段纬线的标准球体)
const sphereGeometry = new THREE.SphereGeometry(1, 32, 32);
// 完整语法
const sphereGeometry = new THREE.SphereGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength);
完整参数说明
参数类型默认值核心说明
radiusnumber1球体的半径大小
widthSegmentsinteger32经线数量(绕Y轴方向),值越大球体越圆滑
heightSegmentsinteger16纬线数量(从上到下),值越大球体越圆滑
phiStartnumber(弧度)0球体的起始极角(从顶部开始)
phiLengthnumber(弧度)Math.PI球体的极角跨度,π=完整球体上下,小于则为部分球
thetaStartnumber(弧度)0球体的起始方位角
thetaLengthnumber(弧度)Math.PI*2球体的方位角跨度,=完整一圈,小于则为扇形球

优化建议:widthSegments ≥32 、heightSegments ≥16 即可保证球体足够平滑。


3.4 圆锥体 | ConeGeometry

用途

创建标准圆锥、扇形圆锥、尖塔等模型,是圆柱体的特殊形态(顶部半径固定为0)。

创建语法
// 最简创建(底面半径1,高度2,圆周32段的标准圆锥)
const coneGeometry = new THREE.ConeGeometry(1, 2, 32);
// 完整语法
const coneGeometry = new THREE.ConeGeometry(radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength);
完整参数说明
参数类型默认值核心说明
radiusnumber1圆锥底面圆形的半径
heightnumber1圆锥的高度(沿 Y 轴方向)
radialSegmentsinteger32底面圆周的分段数,值越大圆锥越圆滑
heightSegmentsinteger1圆锥高度方向的分段数
openEndedbooleanfalse是否无底面,true=只有侧面,false=封闭底面
thetaStartnumber(弧度)0圆锥的起始绘制角度
thetaLengthnumber(弧度)Math.PI*2圆锥的扫描角度,小于则为扇形圆锥

3.5 矩形平面 | PlaneGeometry

用途

创建无限薄的2D矩形平面,适用于地面、墙面、UI背景、广告牌、画布等场景,是使用率极高的几何体。

创建语法
// 最简创建(宽5、高5的矩形平面)
const planeGeometry = new THREE.PlaneGeometry(5, 5);
// 完整语法
const planeGeometry = new THREE.PlaneGeometry(width, height, widthSegments, heightSegments);
完整参数说明
参数类型默认值核心说明
widthnumber1平面在 X 轴方向的宽度
heightnumber1平面在 Y 轴方向的高度
widthSegmentsinteger1X 轴方向的分段数
heightSegmentsinteger1Y 轴方向的分段数

关键注意:PlaneGeometry 默认创建在 XY 平面,如果需要作为「地面」使用,需要绕X轴旋转90°,让平面落在 XZ 平面:

plane.rotation.x = -Math.PI / 2;

3.6 圆形平面 | CircleGeometry

用途

创建无限薄的2D圆形平面、扇形平面,适用于圆形地面、雷达图、指示器、饼图、圆形画布等场景。

创建语法
// 最简创建(半径1,32段的标准圆形)
const circleGeometry = new THREE.CircleGeometry(1, 32);
// 完整语法
const circleGeometry = new THREE.CircleGeometry(radius, segments, thetaStart, thetaLength);
完整参数说明
参数类型默认值核心说明
radiusnumber1圆形的半径大小
segmentsinteger32圆周方向的分段数,值越大圆形越圆滑
thetaStartnumber(弧度)0圆形的起始绘制角度(从X轴正方向开始)
thetaLengthnumber(弧度)Math.PI*2圆形的扫描角度,=完整圆,小于则为扇形

实用技巧:创建1/4圆 → thetaLength: Math.PI/2,创建半圆 → thetaLength: Math.PI


四、几何体通用优化与注意事项(必看)

  1. 分段数的取舍:分段数越高,几何体越平滑,但顶点和面数越多,渲染性能越低。常规开发中,16~64段 是「平滑度+性能」的最优解,无需盲目调高;
  2. 几何体复用:同一个几何体可以绑定多个不同材质,生成多个不同外观的物体,能极大节省内存,优化性能;
  3. 尺寸缩放:如果需要调整已创建几何体的大小,无需重新创建,可通过物体的 scale 属性缩放:cube.scale.set(2,2,2)(长宽深放大2倍);
  4. 位置调整:几何体默认创建在场景坐标原点,可通过物体的 position 属性调整位置:cube.position.set(1,2,3)

核心知识总结(必记)

  1. Three.js 三大核心:Scene(场景) + Camera(相机) + Renderer(渲染器),缺一不可,核心渲染指令:renderer.render(scene, camera)
  2. 右手坐标系规则:X右、Y上、Z外,相机默认看向 -Z 轴,必须调整相机位置才能看到物体;
  3. 几何体是物体的「骨架」,材质是物体的「皮肤」,二者组合成可渲染的3D物体;
  4. 所有几何体的分段数是「平滑度」和「性能」的权衡,按需设置即可;
  5. 受光照影响的材质,必须搭配光源使用,否则物体全黑。