Three.js
环境配置
以下内容均需安装在项目根目录下,在项目根目录cmd执行命令。
yarn init -y:初始化文件夹,创建package.json文件yarn add -D vite:安装构建工具viteyarn add -D three:安装three.js"scripts": { "dev":"vite"}:在package.json文件里添加键值对,设置开发环境yarn dev:构建环境,返回的网址后接 根目录起相对路径即可打开网页。
Three.js三要素
- Scene:容器,用于存放所有显示在三维空间中的对象,如几何体、纹理、材质。
- Camera:Three.js提供多种相机模式,包括正交相机、透视相机、立方相机和立体相机,大多数时候(包括后续笔记)都使用PerspectiveCamera(透视相机)。
- Renderer(渲染器):常用WebGLRenderer。
基本语法
初始化场景
//引入模块中的所有内容
import * as THREE from "three"
//创建场景
const scene=new THREE.Scene();
//创建透视相机
const camera=new THREE.PerspectiveCamera(
45,
window.innerWidth/window.innerHeght,
0.1,
1000
);
//创建渲染器
const renderer=new THREE.WebGLRenderer();
//设置渲染器的宽高为相机的宽高
renderer.setSize(window.innerWidth,window.innerHeght);
//将渲染器渲染的界面插入到body中
document.body.appendChild(renderer.domElement);
//应用渲染器
renderer.render(scene,camera);
创建物体
//创建物体并初始化
const cube=new THREE.Mesh(
new THREE.BoxGeometry(1,1,1),
new MeshBasicMaterial()
);
//向已有场景中添加物体
scene.add(cube);
物体运动
function animate(){
requestAnimatuonFrame(animate);
//控制运动
cube.rotation.x+=0.01;
cube.rotation.y+=0.01;
//应用渲染器:每次更新物体状态都要手动应用渲染器
renderer.render(scene,camera);
}
更改场景背景
- 更改背景颜色:
scene.background=new THREE.Color()参数可传0x开头的十六进制颜色、rgb、hsl等,除了十六进制以外都必须传字符串形式. - 更改背景图片:异步加载
PerspectiveCamera(透视相机)
构造函数
PerspectiveCamera()共有以下四个参数,均为Number类型:
- fov:视锥角
- aspect:视野范围的长宽比
- near和far:进行透视投影的计算时的近平面与远平面,在这个范围外的部分会被裁切
成员
整体思路和unity类似。
position:位置坐标,有x、y和z三个属性。 额外的,可以使用obj.position.set()来设置摄像机的整体坐标,三个参数为坐标的x、y和z值。lookAt:面朝向量,即摄像机朝向的方向向量。三个参数为看向目标的坐标的x、y和z值。
Renderer(渲染器)
构造函数
WebGLRenderer()的参数均为可选参数,列表如下:
canvas:指定渲染器的目标位置,值为Element类型。如果不指定,则会自动创建一个默认300px*150px的Canvas。antialias:抗锯齿选项,值为布尔。如果不指定,默认为false。
其它暂略,详见WebGLRenderer – three.js docs
成员
renderer.domElement:返回当前渲染器渲染的目标元素 。renderer.setSize(w,h):设置渲染区域的宽高。
轨道控制器(OrbitControls)
THREE.js提供的附加组件,通过获取鼠标的输入,使相机能够围绕目标进行轨道运动。
可应用的运动类型包括旋转、缩放、以及拖拽。
使用时,需导入该模块。
构造函数
构造函数接收两个参数。
-
carmera:被控制的相机,类型为Element。这个参数是必须的。 -
domElement:用于事件监听的元素,类型是Element。这个参数是可选的。
该元素决定了事件监听依附的元素。通常情况下,该参数被设置为对应的renderer.domElement,它会将事件监听绑定到renderer所在的canvas上。
不设置时,将会默认绑定到 Document元素上。
事件
OrbitContorls提供以下事件用于事件回调。
change:当摄像机被该组件改变时触发。
通常会把渲染语句renderer.render(scene,camera)写在事件内,以在每次更新相机时重新渲染。
-
start:初始化交互时触发。 -
end:交互结束时触发 。
常用属性
-
enablePan:布尔值,是否允许右键拖拽。 -
enableZoom:布尔值,是否允许缩放,默认值为True。 -
enableRotate:布尔值,是否允许旋转,默认为True。 -
minZoom/maxZoom:Number,设置缩放范围,值为相对原始大小的倍率。 -
minPolarAngle/maxPolarAngle:Number,设置上下旋转范围(绕右手坐标系x轴),值为弧度制。 -
minAzimuthAngle/maxAzimuthAngle:Number,设置左右旋转范围(绕右手坐标系y轴),值为弧度制。 -
enableDamping:布尔值,是否启用摄像机的惯性。
启用时,必须在animate调用contorl.update()。
damplingFactor:Number,摄像机的惯性大小。
启用时,必须在animate调用contorl.update()。
常用方法
OrbitContotls提供了以下方法:
update():该方法没有参数,提供了控制器变换的位置同步和后处理,后处理包括惯性与阻尼计算、自动旋转、角度与距离约束、change事件分发等。
通常情况下,都需要将 contorl.update()写在animate中。
坐标网格辅助线(GridHelper)
THREE.js提供的一种可视化工具,用于调试时进行视觉参考。
构造函数
共有以下四个参数:
-
size:Number类型,控制每个坐标格的尺寸,默认为10。 -
divisions:坐标格细分次数,默认为10. -
colorCenterLine:中线颜色,值为Color类型,十六进制值或CSS颜色名。 -
colorGrid:坐标格网格线颜色,值同上。
几何体
创建不同的默认几何体将使用不同的构造函数,函数列表详见BoxGeometry – three.js docs,此处仅作简略说明。
构造函数常用参数
heigthSegments/depthSegments:横向/纵向分段数,控制生成模型的平滑程度,近似blender的细分。
BufferGeometry
所有默认几何体都基于BufferGeometry创建,因此,通过BufferGeometry能够创建任何形状的物体。
构造函数
创建一个BufferGeometry对象并将属性初始化为默认值。该构造函数没有参数。
属性
geometry.attributes:存储该几何体的几何数据,包括但不限于顶点坐标等,通过set和get添加与访问。boundingBox:外边界矩形,默认为null,可以通过.computeBoundingBox()方法计算。boundingSphere:外边界球体,默认为null,可以通过.computeBoundingSphere()方法计算。
常用方法
geometry.setAttribute(name:String,attribute:BufferAttribute):为当前几何体设置一个attribute。
arrtibute以哈希表的方式存储,其中键为该方法的第一个参数,值为该方法的第二个参数。
BufferAttribute
一种用于存储BufferGeometry的数据的数据结构。
构造函数
构造函数共三个参数,其中normalized是可选参数。
-
array:将构造的图形的顶点列表。该列表的元素数量应该是顶点数量*itemSize。 -
itemSize:每个数据在array中由几个元素构成。例如,当存储三维空间中的顶点坐标时,itemSize的值应该是3。 -
normalized:是否进行归一化处理,默认值为false。
此处的归一化是指GPU将接收数据映射到[-1,1]范围内(无符号类型时是[0,1]),不涉及光栅化阶段的投影变换和视图变换。
通常情况下,不需要设置为true。
Material(材质)
material提供颜色、纹理和光照相应等属性 的管理。