前端组件库 ——Three.js 知识点大全(一)

简介: 教程来源 https://www.vhjpe.cn/ Three.js 是基于 WebGL 的主流 JavaScript 3D 库,封装底层图形接口,让开发者用简洁代码快速构建网页级 3D 场景。涵盖场景、相机、渲染器三大核心,支持几何体、材质、光照、动画等完整管线,广泛应用于数据可视化、虚拟展厅与智慧园区等领域。

在 Web 技术飞速发展的今天,3D 可视化不再是桌面应用的专属领域。随着 WebGL 技术的成熟和硬件性能的提升,浏览器已经能够渲染出令人惊叹的 3D 场景。而 Three.js 作为 WebGL 领域最流行、最成熟的 JavaScript 库,极大地降低了 3D 开发的门槛,让开发者能够无需深入了解复杂的图形学原理,就能在网页中创建和展示 3D 内容。

从产品展示、数据可视化到虚拟展厅、元宇宙应用,Three.js 的应用场景日益广泛,不断拓展着 Web 的边界。截止 2026 年,Three.js 在 GitHub 上已拥有超过 10 万 Star,周下载量超过 200 万次,是 Web 3D 开发领域当之无愧的王者。

本文将系统全面地梳理 Three.js 的核心知识点,从其核心概念到场景搭建,从基础几何体到高级动画,帮助读者建立完整的 3D 开发知识体系。

一、Three.js 概述

1.1 什么是 Three.js
Three.js 是一个基于原生 WebGL 的 JavaScript 3D 库,它对 WebGL API 进行了高度封装,提供了一套简洁、易用的面向对象接口。简单来说,Three.js 让开发者能够用几行代码就能在网页中创建 3D 场景,而无需深入了解着色器语言(GLSL)和复杂的图形学原理。

Three.js 的核心理念可以概括为三个关键词:
image.png
1.2 Three.js 的适用场景
得益于其强大的功能和活跃的社区,Three.js 已经被广泛应用于多种领域:
image.png
1.3 Three.js 的核心组成
一个最基本的 Three.js 3D 场景需要三大核心组件:

场景(Scene):一个容器,用于存放所有的物体、光源和相机。它就像是一个舞台,演员和设备都在上面。

相机(Camera):决定我们从哪个角度观察场景。Three.js 提供了多种相机,最常用的是透视相机(PerspectiveCamera),它能模拟人眼看到的“近大远小”效果。

渲染器(Renderer):负责将场景和相机结合起来,并把最终图像绘制到浏览器中。Three.js 最常用的是 WebGL 渲染器(WebGLRenderer)。

除了这三大核心组件,一个完整的 3D 场景通常还包括:

物体(Mesh):我们想要展示的 3D 对象,由几何体(Geometry)和材质(Material)组成。

光源(Light):照亮物体,产生明暗和阴影效果,让物体看起来有立体感。

动画(Animation):让场景中的物体动起来,构成完整的 3D 交互体验。

辅助工具(Helpers):辅助调试的工具,如坐标轴辅助器(AxesHelper)、光源辅助器(LightHelper)等。

二、环境搭建与第一个3D场景

2.1 使用 CDN 快速引入(推荐)
最简单入门的引入方式,适合快速原型开发:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Three.js 第一个场景</title>
    <style>
        body { margin: 0; overflow: hidden; }
        #info {
            position: absolute;
            top: 20px;
            left: 20px;
            color: white;
            background: rgba(0,0,0,0.6);
            padding: 10px;
            font-family: Arial;
            pointer-events: none;
            z-index: 100;
        }
    </style>
</head>
<body>
    <div id="info">Three.js 入门示例 - 旋转立方体</div>

    <!-- 使用 ES Modules 方式引入 Three.js 核心库及扩展 -->
    <script type="importmap">
        {
            "imports": {
                "three": "https://unpkg.com/three@0.128.0/build/three.module.js",
                "three/addons/": "https://unpkg.com/three@0.128.0/examples/jsm/"
            }
        }
    </script>

    <script type="module">
        // 代码将在后续章节详细讲解
    </script>
</body>
</html>

2.2 使用 npm 安装(工程化项目)
对于大型项目,推荐使用 npm 安装:

npm install three

在项目中导入并使用:

import * as THREE from 'three';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

2.3 第一个完整 3D 场景代码解析

import * as THREE from 'three';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

// ========== 1. 创建场景(Scene)==========
// 场景是一个容器,用来放置所有物体、光源和相机。
const scene = new THREE.Scene();
// 设置场景背景色为深灰色(接近黑色)
scene.background = new THREE.Color(0x111122);

// ========== 2. 创建相机(Camera)==========
// 使用透视相机,参数:视野角度FOV、宽高比、近平面、远平面
// - 视野角度:75度,人眼模拟效果最佳
// - 宽高比:窗口宽度 / 窗口高度
// - 近平面:0.1,相机能看到的最小距离
// - 远平面:1000,相机能看到的最大距离
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
// 将相机向后移动 5 个单位,以便看到场景中的物体
camera.position.set(0, 2, 5);
// 让相机看向原点 (0,0,0)
camera.lookAt(0, 0, 0);

// ========== 3. 创建渲染器(Renderer)==========
// WebGLRenderer 是 Three.js 中最常用的渲染器,使用浏览器的 WebGL API 进行硬件加速渲染。
const renderer = new THREE.WebGLRenderer({ antialias: true });
// 设置渲染器尺寸为窗口的完整尺寸
renderer.setSize(window.innerWidth, window.innerHeight);
// 启用阴影映射,让物体可以投射和接收阴影(性能开销较大,按需开启)
renderer.shadowMap.enabled = true;
// 将渲染器的 DOM 元素(canvas)添加到页面的 body 中
document.body.appendChild(renderer.domElement);

// ========== 4. 添加轨道控制器(OrbitControls)==========
// 轨道控制器允许用户通过鼠标/触摸来旋转、缩放和平移场景,极大提升交互体验。
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;      // 启用惯性效果,让运动更平滑
controls.dampingFactor = 0.05;     // 惯性系数
controls.zoomSpeed = 1.2;          // 缩放速度
controls.rotateSpeed = 1.0;        // 旋转速度

// ========== 5. 创建物体 ==========
// 几何体:创建一个长方体,宽 1,高 1,深 1
const geometry = new THREE.BoxGeometry(1, 1, 1);
// 材质:创建标准网格材质,颜色为橙色,并启用阴影
const material = new THREE.MeshStandardMaterial({ 
    color: 0xff6600,
    roughness: 0.3,    // 粗糙度,值越小表面越光滑
    metalness: 0.7     // 金属感,值越高越像金属
});
// 将几何体和材质组合成网格对象
const cube = new THREE.Mesh(geometry, material);
// 设置立方体的位置
cube.position.set(0, 0.5, 0);
// 启用阴影投射和接收
cube.castShadow = true;
cube.receiveShadow = true;
// 将物体添加到场景中
scene.add(cube);

// ========== 6. 添加地板平面(用于展示阴影)==========
const planeGeometry = new THREE.PlaneGeometry(5, 5);
const planeMaterial = new THREE.MeshStandardMaterial({ color: 0x888888, side: THREE.DoubleSide });
const plane = new THREE.Mesh(planeGeometry, planeMaterial);
plane.rotation.x = -Math.PI / 2;  // 旋转使其水平放置
plane.position.y = -0.5;
plane.receiveShadow = true;       // 接收阴影
scene.add(plane);

// ========== 7. 添加光源 ==========
// 环境光:均匀照亮所有物体,没有方向性,避免阴影区域完全黑暗
const ambientLight = new THREE.AmbientLight(0x404060);
scene.add(ambientLight);

// 点光源:从一点向四周发光的灯泡效果
// 参数:颜色、强度
const pointLight = new THREE.PointLight(0xffffff, 1);
pointLight.position.set(2, 3, 4);
pointLight.castShadow = true;
scene.add(pointLight);

// 辅助光源:从侧面补充照明,增强立体感
const fillLight = new THREE.PointLight(0x4466cc, 0.5);
fillLight.position.set(-2, 1, 3);
scene.add(fillLight);

// ========== 8. 添加辅助工具(调试用)==========
// 添加坐标轴辅助器(红色X轴,绿色Y轴,蓝色Z轴)
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);

// 添加光源位置辅助器(帮助调试光源位置)
const pointLightHelper = new THREE.PointLightHelper(pointLight, 0.3);
scene.add(pointLightHelper);

// ========== 9. 动画循环 ==========
// 使用 requestAnimationFrame 实现流畅的动画效果
function animate() {
    // 更新立方体旋转角度(每帧旋转 0.01 弧度)
    cube.rotation.x += 0.01;
    cube.rotation.y += 0.01;

    // 更新轨道控制器(必须在动画循环中调用,以启用 damping 效果)
    controls.update();

    // 渲染场景:使用相机视角渲染整个场景
    renderer.render(scene, camera);

    // 请求下一帧动画
    requestAnimationFrame(animate);
}

// 启动动画循环
animate();

// ========== 10. 处理窗口尺寸变化 ==========
// 当浏览器窗口大小改变时,需要更新相机的宽高比和渲染器的尺寸
window.addEventListener('resize', onWindowResize, false);

function onWindowResize() {
    // 更新相机的宽高比
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();  // 更新相机的投影矩阵

    // 更新渲染器的尺寸
    renderer.setSize(window.innerWidth, window.innerHeight);
}

来源:
https://vhjpe.cn/

相关文章
|
8天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。
3510 20
|
20天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
18105 60
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
1天前
|
SQL 人工智能 弹性计算
阿里云发布 Agentic NDR,威胁检测与响应进入智能体时代
欢迎前往阿里云云防火墙控制台体验!
1158 2
|
4天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
1946 8
|
16天前
|
人工智能 JavaScript Ubuntu
低成本搭建AIP自动化写作系统:Hermes保姆级使用教程,长文和逐步实操贴图
我带着怀疑的态度,深度使用了几天,聚焦微信公众号AIP自动化写作场景,写出来的几篇文章,几乎没有什么修改,至少合乎我本人的意愿,而且排版风格,也越来越完善,同样是起码过得了我自己这一关。 这个其实OpenClaw早可以实现了,但是目前我觉得最大的区别是,Hermes会自主总结提炼,并更新你的写作技能。 相信就冲这一点,就值得一试。 这篇帖子主要就Hermes部署使用,作一个非常详细的介绍,几乎一步一贴图。 关于Hermes,无论你赞成哪种声音,我希望都是你自己动手行动过,发自内心的选择!
3183 29
|
3天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
1567 3
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
4天前
|
机器学习/深度学习 缓存 测试技术
DeepSeek-V4开源:百万上下文,Agent能力比肩顶级闭源模型
DeepSeek-V4正式开源!含V4-Pro(1.6T参数)与V4-Flash(284B参数)双版本,均支持百万token上下文。首创混合注意力架构,Agent能力、世界知识与推理性能全面领先开源模型,数学/代码评测比肩顶级闭源模型。
1752 6
|
5天前
|
人工智能 测试技术 API
阿里Qwen3.6-27B正式开源:网友直呼“太牛了”!
阿里云千问3.6系列重磅开源Qwen3.6-27B稠密大模型!官网:https://t.aliyun.com/U/JbblVp 仅270亿参数,编程能力媲美千亿模型,在SWE-bench等权威基准中表现卓越。支持多模态理解、本地部署及OpenClaw等智能体集成,已开放Hugging Face与ModelScope下载。

热门文章

最新文章