目录

 

一、Three.js 所有功能的基础

1.1 基础环境搭建

1.2 坐标辅助器 + 轨道控制器

二、3D 物体三大变换:位移、缩放、旋转

2.1 位移 position

2.2 缩放 scale

2.3 旋转 rotation

三、父子层级系统

四、响应式画布 + 全屏适配

五、lil-GUI 实时调试工具

六、几何体底层原理

七、Three.js 常用内置几何体

八、材质系统:颜色、光照、高光、透明、金属度

8.1 基础材质(不受光照)

8.2 物理材质(支持光照、金属、粗糙度)

九、贴图

9.1高光贴图

9.2透明贴图

9.3环境贴图

9.4环境光遮蔽贴图

十、场景雾效

10.1线性雾

10.2指数雾

 

一、Three.js所有功能的基础

所有 Three.js 项目,永远离不开三件套:场景 Scene、相机 Camera、渲染器 Renderer。

1.1 基础环境搭建

//导入threejs
import * as THREE from 'three'
//导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
//创建场景
const scene = new THREE.Scene()
const camera = new THREE.PerspectiveCamera(
  45,//视野角度
  window.innerWidth / window.innerHeight,//宽高比
  0.1,//近平面
  1000//远平面
);
//创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);//设置渲染尺寸大小
document.body.appendChild(renderer.domElement);//将渲染器的dom元素添加到页面中

1.2 坐标辅助器 + 轨道控制器

坐标轴帮助我们看懂 3D 空间方向,轨道控制器实现鼠标拖拽、缩放、平移视角

//添加世界坐标辅助器
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);
//添加轨道控制器
const controls = new OrbitControls(camera, renderer.domElement)
//设置带阻尼的惯性
controls.enableDamping = true
//设置阻尼系数
controls.dampingFactor = 0.05
//设置自动旋转
// controls.autoRotate = true

二、3D 物体三大变换:位移、缩放、旋转

所有网格模型(Mesh)都具备 position、scale、rotation 三大属性,是动画和交互的基础。

2.1 位移 position

// 单独设置
cube.position.x = 2
cube.position.y = 1
cube.position.z = -1

// 批量设置
cube.position.set(2,1,-1)

2.2 缩放 scale

cube.scale.set(1.5, 0.5, 1)

2.3 旋转 rotation

cube.rotation.x = Math.PI / 4
cube.rotation.y = Math.PI / 2

三、父子层级系统

Three.js 支持父子嵌套:父物体移动/旋转/缩放,子物体会跟随变化

// 父物体 地球
const earth = new THREE.Mesh(...)
scene.add(earth)

// 子物体 月亮
const moon = new THREE.Mesh(...)
moon.position.x = 2
earth.add(moon) // 月亮挂载到地球

子物体坐标是相对父物体局部坐标,不是世界坐标。

四、响应式画布 + 全屏适配


默认画布不会跟随窗口变化,会导致拉伸变形,必须手动适配。

// 窗口自适应
window.addEventListener('resize', () => {
  camera.aspect = window.innerWidth / window.innerHeight
  camera.updateProjectionMatrix()
  renderer.setSize(window.innerWidth, window.innerHeight)
})

// F键全屏切换
window.addEventListener('keydown', (e) => {
  if(e.key === 'f') {
    if(!document.fullscreenElement) renderer.domElement.requestFullscreen()
    else document.exitFullscreen()
  }
})

五、lil-GUI 实时调试工具

实时调节位置、颜色、旋转、参数

import { GUI } from 'lil-gui'
const gui = new GUI()

// 位置控制
gui.add(cube.position, 'x', -5, 5)
gui.add(cube.position, 'y', -5, 5)

// 颜色控制
gui.addColor(cube.material, 'color')

// 开关控制
gui.add(cube.material, 'wireframe')

六、几何体底层原理

所有内置几何体底层都是 BufferGeometry,由顶点、索引、三角形面组成。
顶点:3D 空间坐标点 (x,y,z)
三角形面:3 个顶点组成一个最小渲染面
索引:复用顶点,节省内存

手动自定义几何体示例

const vertices = new Float32Array([
  0,1,0,
  -1,-1,0,
  1,-1,0
])
const geometry = new THREE.BufferGeometry()
geometry.setAttribute('position', new THREE.BufferAttribute(vertices,3))

七、Three.js 常用内置几何体

new THREE.BoxGeometry() // 立方体
new THREE.SphereGeometry() // 球体
new THREE.CylinderGeometry() // 圆柱
new THREE.ConeGeometry() // 圆锥
new THREE.TorusGeometry() // 圆环
new THREE.PlaneGeometry() // 平面

八、材质系统:颜色、光照、高光、透明、金属度

8.1 基础材质(不受光照)

new THREE.MeshBasicMaterial({
  color:0xffffff,
  wireframe:false,
  transparent:true,
  opacity:0.5
})

8.2 物理材质(支持光照、金属、粗糙度)

new THREE.MeshStandardMaterial({
  metalness:0.8, // 金属度
  roughness:0.2, // 粗糙度
  transparent:true,
  opacity:0.9
})

九、贴图

作用:定义物体表面的基础颜色和图案,相当于给模型 “穿上皮肤”,是最基础的贴图。

9.1高光贴图


作用:控制物体表面不同区域的高光强度,决定哪里反光强、哪里反光弱。
原理:贴图的亮度值控制高光强度:
白色区域:高光最强,反光明显(比如金属边缘、光滑的漆面)
黑色区域:高光最弱,几乎不反光(比如粗糙的布料、污垢区域)
效果:让物体的反光更有层次,比如一个金属球,边缘高光强,磨损的划痕处高光弱,更真实

const specularMap = textureLoader.load('textures/specular.jpg');
const material = new THREE.MeshPhongMaterial({
  map: colorMap,
  specularMap: specularMap, // 高光贴图
  specular: new THREE.Color(0xffffff) // 高光基础颜色
});

9.2透明贴图

作用:控制物体表面不同区域的透明度,实现镂空、半透明效果。
原理:贴图的亮度值控制透明度:
白色区域:完全不透明
黑色区域:完全透明
灰色区域:半透明

const alphaMap = textureLoader.load('textures/leaf_alpha.jpg');
const material = new THREE.MeshStandardMaterial({
  map: colorMap,
  alphaMap: alphaMap, // 透明贴图
  transparent: true, // 必须开启透明模式
  opacity: 1 // 透明贴图生效时,基础opacity也会叠加影响
});

9.3环境贴图

作用:模拟物体反射周围环境的效果,实现金属、玻璃等物体的反射质感。
原理:将一张全景环境贴图(通常是立方体贴图或 HDRI)映射到物体表面,模拟物体对环境的反射。

9.4环境光遮蔽贴图

作用:模拟物体缝隙、褶皱处的环境光遮蔽效果,增强模型的立体感和细节。
原理:贴图的亮度值控制遮蔽强度:
白色区域:完全不遮蔽,正常受光
黑色区域:完全遮蔽,光线难以到达,颜色偏暗(比如物体的缝隙、褶皱、凹陷处)

const aoMap = textureLoader.load('textures/ao.jpg');
const material = new THREE.MeshStandardMaterial({
  map: colorMap,
  aoMap: aoMap, // 环境光遮蔽贴图
  aoMapIntensity: 1.0 // 遮蔽强度,值越大,缝隙处越暗
});

十、场景雾效

10.1线性雾

new Fog( color : number | Color, near : number, far : number )

color:雾的颜色。

near:开始喷洒雾剂的最小距离。

far:雾效停止计算和应用的最大距离。

10.2指数雾

new FogExp2( color : number | Color, density : number )

color:雾的颜色。

density:决定雾气浓化的速度。

 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐