当前位置: 首页 > news >正文

three.js与WebGL

🎨 Three.js - 3D 图形库

Three.js 是一个强大的 JavaScript 3D 图形库,让你可以在网页浏览器中轻松创建和展示 3D 内容!

🎨 Three.js 简介

Three.js 是一个轻量级的 JavaScript 3D 图形库,让你能够在浏览器中轻松创建和显示 3D 动画和交互式 3D 内容!

📋 基本信息

  • 官网: https://threejs.org
  • GitHub: https://github.com/mrdoob/three.js
  • 作者: Ricardo Cabello (Mr.doob)
  • 首次发布: 2010年
  • 基于: WebGL(浏览器的 3D API)
  • 代码片段: 11,520+ 个(文档非常丰富!)

🎯 核心作用

Three.js 让你可以:

  • 🎮 创建 3D 游戏
  • 📊 制作 3D 数据可视化
  • 🏠 展示 3D 产品模型
  • 🌍 构建虚拟场景
  • 🎬 制作动画效果
  • 🔬 科学可视化

🧱 核心概念

Three.js 的基本结构包括:

1. 场景 (Scene)

就像一个舞台,所有 3D 对象都放在这里

const scene = new THREE.Scene();

2. 相机 (Camera)

观察场景的视角

const camera = new THREE.PerspectiveCamera(75,                                    // 视野角度window.innerWidth / window.innerHeight, // 宽高比0.1,                                   // 近裁剪面1000                                   // 远裁剪面
);
camera.position.z = 5;

3. 渲染器 (Renderer)

将场景渲染到屏幕

const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

4. 几何体 (Geometry)

定义 3D 对象的形状

const geometry = new THREE.BoxGeometry(1, 1, 1); // 立方体

5. 材质 (Material)

定义物体的外观(颜色、质感等)

从文档中看到的材质类型:

// 基础材质
MeshBasicMaterial      // 基本材质(不受光照影响)
MeshLambertMaterial    // 兰伯特材质(漫反射)
MeshPhongMaterial      // Phong 材质(高光)
MeshStandardMaterial   // 标准材质(PBR,最常用)
MeshPhysicalMaterial   // 物理材质(更真实)
MeshToonMaterial       // 卡通材质// 特殊材质
LineBasicMaterial      // 线条材质
PointsMaterial         // 点材质
ShaderMaterial         // 自定义着色器材质

6. 网格 (Mesh)

几何体 + 材质 = 可见的 3D 对象

const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

7. 光源 (Light)

照亮场景

const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(5, 5, 5);
scene.add(light);

💻 完整示例:旋转的立方体

<!DOCTYPE html>
<html>
<head><title>Three.js 示例</title><style>body { margin: 0; }canvas { display: block; }</style>
</head>
<body><script src="https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.min.js"></script><script>// 1. 创建场景const scene = new THREE.Scene();// 2. 创建相机const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);camera.position.z = 5;// 3. 创建渲染器const renderer = new THREE.WebGLRenderer();renderer.setSize(window.innerWidth, window.innerHeight);document.body.appendChild(renderer.domElement);// 4. 创建立方体const geometry = new THREE.BoxGeometry(1, 1, 1);const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });const cube = new THREE.Mesh(geometry, material);scene.add(cube);// 5. 添加光源const light = new THREE.DirectionalLight(0xffffff, 1);light.position.set(5, 5, 5);scene.add(light);// 6. 动画循环function animate() {requestAnimationFrame(animate);// 旋转立方体cube.rotation.x += 0.01;cube.rotation.y += 0.01;// 渲染场景renderer.render(scene, camera);}animate();// 7. 响应窗口大小调整window.addEventListener('resize', () => {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();renderer.setSize(window.innerWidth, window.innerHeight);});</script>
</body>
</html>

🌟 实际应用场景

1. 产品展示(电商应用)

// 加载 3D 模型(如鞋子、家具)
const loader = new THREE.GLTFLoader();
loader.load('shoe.gltf', (gltf) => {scene.add(gltf.scene);
});// 添加控制器,让用户旋转查看
const controls = new THREE.OrbitControls(camera, renderer.domElement);

2. 数据可视化

// 创建 3D 柱状图
for (let i = 0; i < data.length; i++) {const height = data[i].value;const bar = new THREE.BoxGeometry(1, height, 1);const mesh = new THREE.Mesh(bar, material);mesh.position.x = i * 2;scene.add(mesh);
}

3. 游戏开发

// 创建可控制的角色
const character = new THREE.Mesh(geometry, material);
document.addEventListener('keydown', (e) => {if (e.key === 'ArrowUp') character.position.z -= 0.1;if (e.key === 'ArrowDown') character.position.z += 0.1;
});

4. 虚拟展厅

// 创建房间
const room = new THREE.BoxGeometry(10, 5, 10);
const walls = new THREE.Mesh(room, wallMaterial);
scene.add(walls);// 添加展品
products.forEach(product => {const model = loadModel(product.modelUrl);scene.add(model);
});

📦 安装使用

方法 1: CDN

<script src="https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.min.js"></script>

方法 2: npm(推荐)

npm install three
import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';

🔧 常用功能

加载 3D 模型

import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';const loader = new GLTFLoader();
loader.load('model.gltf', (gltf) => {scene.add(gltf.scene);
});

添加交互控制

import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true; // 阻尼效果

添加阴影

renderer.shadowMap.enabled = true;
light.castShadow = true;
cube.castShadow = true;
ground.receiveShadow = true;

🎮 热门应用示例

  • 🌐 Google Earth - 使用 Three.js 渲染 3D 地球
  • 🏠 宜家 - 在线 3D 家具展示
  • 🚗 汽车官网 - 3D 车型展示
  • 🎨 创意网站 - 炫酷的 3D 交互效果
  • 📊 数据可视化平台 - 3D 图表

🎓 总结

Three.js 是:

  • 🎨 强大的 JavaScript 3D 图形库
  • 🌐 在浏览器中创建 3D 内容
  • 📦 封装了复杂的 WebGL,让 3D 开发更简单
  • 🎮 用于游戏、可视化、产品展示等

核心要素:
场景 + 相机 + 渲染器 + 几何体 + 材质 + 光源 = 3D 世界


WebGL 详解

WebGL (Web Graphics Library) 是一个在浏览器中渲染 2D 和 3D 图形的 JavaScript API,无需安装任何插件!

📋 基本信息

  • 全名: Web Graphics Library
  • 发布: 2011年
  • 维护者: Khronos Group(同样维护 OpenGL)
  • 基于: OpenGL ES 2.0/3.0
  • 运行环境: 浏览器(直接访问 GPU)
  • 支持: 所有现代浏览器

🎯 核心作用

WebGL 允许 JavaScript 直接与 GPU(图形处理器) 交互,实现:

  • 🎨 高性能 3D 图形渲染
  • 🖼️ 复杂的 2D 图形处理
  • 🎮 浏览器游戏
  • 📊 数据可视化
  • 🎬 视频特效

🔄 WebGL 在技术栈中的位置

用户代码层↓
Three.js / Babylon.js  ← 高级 3D 库(封装 WebGL)↓
WebGL                  ← JavaScript API(浏览器提供)↓
OpenGL ES             ← 底层图形标准↓
GPU 驱动              ← 显卡驱动程序↓
GPU 硬件              ← 显卡(NVIDIA、AMD、Intel 等)

🆚 WebGL vs Three.js

直接用 WebGL(原生)

// 非常复杂!需要写很多底层代码
const canvas = document.getElementById('canvas');
const gl = canvas.getContext('webgl');// 创建顶点着色器
const vertexShaderSource = `attribute vec4 a_position;void main() {gl_Position = a_position;}
`;// 创建片段着色器
const fragmentShaderSource = `precision mediump float;void main() {gl_FragColor = vec4(1, 0, 0, 1);}
`;// 编译着色器
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSource);
gl.compileShader(vertexShader);const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);// 创建程序
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);// 创建缓冲区
const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);// 设置顶点数据
const positions = [-0.5, -0.5,0.5, -0.5,0.0,  0.5,
];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);// ... 还需要更多代码才能显示一个三角形!

使用 Three.js(封装了 WebGL)

// 简单!几行代码实现相同效果
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, width/height, 0.1, 1000);
const renderer = new THREE.WebGLRenderer(); // 内部使用 WebGLconst geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);renderer.render(scene, camera);

Three.js 就是对 WebGL 的封装,让开发更简单!

🧠 WebGL 的工作原理

1. 渲染管线(Pipeline)

JavaScript 代码↓
顶点数据(Vertices)↓
顶点着色器(Vertex Shader) ← 处理每个顶点的位置↓
光栅化(Rasterization)      ← 将几何体转换为像素↓
片段着色器(Fragment Shader) ← 计算每个像素的颜色↓
帧缓冲(Frame Buffer)↓
显示在屏幕上

📊 WebGL 版本

WebGL 1.0

  • 基于 OpenGL ES 2.0
  • 2011年发布
  • 所有现代浏览器支持

WebGL 2.0

  • 基于 OpenGL ES 3.0
  • 2017年发布
  • 更多功能(更好的纹理、变换反馈等)
  • 大多数现代浏览器支持

检测浏览器支持

// 检测 WebGL 1.0
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
if (gl) {console.log('✅ 支持 WebGL 1.0');
}// 检测 WebGL 2.0
const gl2 = canvas.getContext('webgl2');
if (gl2) {console.log('✅ 支持 WebGL 2.0');
}

🔧 WebGL 生态系统

高级 3D 库(封装 WebGL)

Three.js         // 最流行,11k+ 代码片段
Babylon.js       // 游戏引擎级别
A-Frame          // VR/AR 框架
PlayCanvas       // 游戏引擎
PixiJS           // 2D(也支持 WebGL)

底层/工具库

REGL             // 函数式 WebGL
twgl.js          // 简化 WebGL API
Oasis Engine     // 阿里开源引擎

⚡ WebGL 性能优势

Canvas 2D vs WebGL

// Canvas 2D(CPU 渲染)
渲染 1000 个圆形: ~30 FPS
渲染 10000 个圆形: ~5 FPS ❌ 卡顿// WebGL(GPU 渲染)
渲染 1000 个圆形: ~60 FPS
渲染 10000 个圆形: ~60 FPS ✅ 流畅
渲染 100000 个圆形: ~60 FPS ✅ 依然流畅!

🎓 学习曲线

难度等级:
WebGL 原生       ████████████ (12/10) 😱 非常难
Three.js        ████░░░░░░░░ (4/10)  😊 中等
Babylon.js      █████░░░░░░░ (5/10)  😊 中等
A-Frame         ██░░░░░░░░░░ (2/10)  😄 简单

💡 什么时候用什么?

直接用 WebGL(不推荐,除非你是专家)

  • ✅ 需要极致性能优化
  • ✅ 开发自己的 3D 引擎
  • ✅ 学术研究

用 Three.js(推荐)

  • ✅ 大多数 3D 应用
  • ✅ 产品展示
  • ✅ 数据可视化
  • ✅ 快速开发

用 Babylon.js

  • ✅ 复杂游戏
  • ✅ 需要物理引擎
  • ✅ VR/AR 应用

🔍 浏览器兼容性

WebGL 1.0 支持率:~97%

✅ Chrome 9+
✅ Firefox 4+
✅ Safari 5.1+
✅ Edge (所有版本)
✅ Opera 12+
✅ 移动浏览器(iOS Safari 8+, Chrome Android)
❌ IE 10 及以下(需要 IE 11)

WebGL 2.0 支持率:~95%

✅ Chrome 56+
✅ Firefox 51+
✅ Safari 15+
✅ Edge 79+
⚠️ 部分移动设备可能不支持

🎓 总结

WebGL 是:

  • 🎮 浏览器中的 GPU 加速图形 API
  • 🔧 底层 API,直接操作 GPU
  • ⚡ 性能极强,但使用复杂
  • 🎨 是 Three.js 的底层基础

关系链:

你的代码 → Three.js → WebGL → GPU(简单)   (复杂)  (硬件)

类比:

  • WebGL = 汽车引擎(复杂但强大)
  • Three.js = 汽车方向盘+仪表盘(易用)
  • 你不需要理解引擎内部构造,就能开车!

同样,你不需要深入 WebGL,用 Three.js 就能做出炫酷的 3D 效果!

http://www.dtcms.com/a/454051.html

相关文章:

  • 网站推广计划怎么写标书制作员是干什么的
  • Doris专题9- 行列混存和冷热数据分层
  • 山西省建筑工程网怎么做外贸网站优化
  • mysql数据类型——认识并掌握数据类型
  • 做搜狗手机网站山东大源建设集团网站
  • 网站收录怎么设置wordpress 科技联盟
  • asp网站开发教程pdf南阳最新通知今天
  • 三极管元器件的识别、检测与主要参数
  • 个人网站备案如何取名称正规网站建设商家
  • 网站链接分享做推广室内设计公司简介
  • 网站seo资讯从留言板开始做网站
  • 掌握 Compose 性能优化三步法:从问题诊断到实战解决
  • 教育行业网站phpmysql网站开发
  • PTA6-4 使用函数统计指定数字的个数(C)
  • 电子商务和网络购物网站中国建设银行国际互联网站
  • 牛客周赛 Round 110(2025.9.21)
  • 湖南省网站搭建网上购物商城的步骤
  • 第六个实验——Nat Server配置
  • 商业网点建设开发中心网站长沙网站优化分析
  • asp网站跳转浏览器网站模板下载后怎么用
  • 潍坊网站定制 优帮云网站建设微信端
  • 新乡谷雨网络公司做的网站怎么样微信网站界面
  • 面向院区病房的空间智能体新范式:下一代病房系统研究(上)
  • 湘乡网站建设建站模板哪个好
  • wordpress首页排版更换网站优化师负责干什么
  • 常熟市建设工程发承包网站海珠做网站要多少钱
  • C语言入门指南:从基础概念到实战编程
  • PyCharm一键安装SciPy全攻略
  • 看网站的访问量做网站和软件的团队
  • 车载诊断架构 --- 企业版ODX AGL(Authoring Guidelines ODX编写指南)都定义什么内容呢?