Three.js入门

340 阅读6分钟

Threejs中文文档:www.webgl3d.cn/threejs/doc…

英文官网:threejs.org/

官网对 Threejs 的介绍:“Javascript 3D library”。

openGL 是一个跨平台3D/2D的绘图标准,WebGL 则是openGL 在浏览器上的一个实现,而Threejs 对 WebGL 进行了封装

前端开发人员可以直接用WebGL 接口进行编程,但直接使用WebGL进行开发需要具备一定的数学能力和物理知识,为了让前端开发人员能够轻松进行web 3D开发,Threejs 就对 WebGL 进行了封装,降低了门槛,同时大大提升了效率。所以即便你不懂什么计算机图形学,也只要了解一点threejs的基本概念就可以进行3D开发了。

Three.js和Thing.js的区别

Threejs库的出现解决了底层的渲染细节和复杂的数据结构,终于将复杂的底层细节抽象出来。但对于初学者来说需要花费很多时间,就一个加载模型、调光、选择模型弹框的功能,就能写出Threejs上百行代码。 ThingJS是更为上层的抽象,不用关心渲染、mesh、光线等复杂概念。ThingJS封装了对模型交互事件的API、对模型的操作及层次关系,一个个具体的模型抽象把初学者从复杂的3D概念中解放出来

在开发效率上来说ThingJS要更优秀一些

而ThreeJS做出来的东西可能更精致更个性化一些

对了 ThingJS中的模型都是要收费的。

好了接下来我们来讲ThreeJs

three.js基本要素

一、场景

我们要展示东西肯定要有一个场景

就像我们2D作画的时候创建一个canvas画布一样

这里的场景就是一个三维空间,是所有物品的容器,可以把场景想象成一个空房间,接下来我们会往房间里放要呈现的物体、相机、光源等。

其实three.js 所有要素之间的关系就是一个 树形结构

用代码展示就是

const scene = new THREE.Scene();

二、相机

Threejs必须要往场景中添加一个相机,相机就相当于我们的眼睛,用来确定位置、方向、角度,相机看到的内容就是我们最终在屏幕上看到的内容。在程序运行过程中,我们可以调整相机的位置、方向和角度。

Threejs中使用的是PerspectiveCamera(透视相机)

这里的“透视”并不是我们平时理解的那种特异功能,而是指图像中近大远小的现象

上图

大概就是这个样子

代码是这样的

var camera = new THREE.PerspectiveCamera(fov, aspect, near, far);

接下来讲一下这四个参数

1、 fov(视场角):全称field of view,视场角影响视野范围的大小。 就是上图中的那个α角,默认值是50°, 但是一般情况下我们都会用45°,因为45°更接近人眼看到的角度。

2、 aspect(宽高比):指的是成像的宽高比,默认值为1,通常我们会以浏览器的宽高比作为aspect。

3、near (近距剪切面):默认值0.1

4、far (远距剪切面):默认值2000

near和far定义了能够成像的空间范围, 均为正值,且 far 应大于near 。

三、网格和形状和材质

在计算机的世界里,一条弧线是由有限个点构成的有限条线段连接得到的。当线段数量越多,长度就越短,当达到你无法察觉这是线段时,一条平滑的弧线就出现了。 计算机的三维模型也是类似的。只不过线段变成了平面,普遍用三角形组成的网格来描述。我们把这种模型称之为 Mesh 模型

three.js 背后所有的图形在进行渲染之前, 都会进行三角化, 然后交给webgl 去渲染。Threejs提供了一些常见的几何形状,有三维的也有二维的,三维的比如长方体、球体等,二维的比如长方形圆形等,如果默认提供的形状不能满足需求,也可以自定义通过定义顶点和顶点之间的连线绘制自定义几何形状,更复杂的模型还可以用建模软件建模后导入。Threejs使用的是右手坐标系,这是源于opengl默认情况下也是右手坐标系。

ThreeJs提供的3D形状:

只有形状,可能渲染出来的图形并没有美丽的样子,这时候材质就出来了。 组成的mesh其实是有两个部分:材质(Material) +几何体(Geometry) 就是一个 mesh,Threejs提供了集中比较有代表性的材质,常用的用漫反射、镜面反射两种材质,还可以引入外部图片,贴到物体表面,成为纹理贴图。

ThreeJs提供的材质:

四、灯光

ThreeJs中有六中基础的灯光:

1、AmbientLight 环境光, 氛围光: 通常仅作为 基础光线, 一般需要与其他灯光配合使用,不能产生阴影,也无需指定坐标位置, 仅需设置颜色和强度

2、DirectionalLight 平行光:最为经常使用的光源, 光纤 都是平行向着一个方向发射,经常用来模拟太阳光照射到某个物体上的光照效果

3、HemisphereLight 半球光源:更加真实的模拟自然光源, 提供 天空 地面 漫反射光线。一共接收 3 个参数: 第一个: 天空光线颜色,第二个: 地面反射光颜色, 第三个: 光的反射强度

4、PointLight: 点光源: 类似生活中的灯泡, 光纤 没有固定方向, 朝着四周散射, 点光源对应的辅助对象 PointLightHelper 只有一个 菱形的光源形状,并没有 光 的 发射线条。

5、RectAreaLight 矩形面光源: 与 DirectionalLight 模拟太阳光不同, 光源形状为一个矩形, 可以模拟出明亮 的窗口或者 矩形照明光源。

1)只有 MeshStandardMaterial 和 MeshPhysicalMaterial 材质 才支持 RectAreaLight光源

2)RectAreaLight 对应的辅助对象, RectAreaLightArea 引入方式和 其他 光辅助对象 引入方式不同。其他光辅助对象 都是在 three 中 使用之前无需引入, 可以直接使用, RectAreaLight 在使用之前需要引入才可以使用。

****import { RectAreaLightHelper } from 'three/examples/jsm/helpers'

6、SpotLight 聚光灯 类似与生活中的 聚光灯效果

五、渲染器

字面意思,就是把上面所有的元素渲染出来

直接上代码:

let renderer = new THREE.WebGLRenderer({
    antialias: true, // true/false表示是否开启反锯齿
    alpha: true, // true/false 表示是否可以设置背景色透明
    precision: 'highp', // highp/mediump/lowp 表示着色精度选择
    premultipliedAlpha: false, // true/false 表示是否可以设置像素深度(用来度量图像的分率)
    preserveDrawingBuffer: true, // true/false 表示是否保存绘图缓冲
    maxLights: 3, // 最大灯光数
    stencil: false // false/true 表示是否使用模板字体或图案
})
下面贴一些官网的案例:

沙发在线预览:app.xuanke3d.com/apps/trayto…

服装在线预览:suit.xuantech.cn/

化学相关——分子结构可视化:www.yanhuangxueyuan.com/3D/fenzi/in…

地理天文相关——太阳系3D预览:www.yanhuangxueyuan.com/3D/solarSys…

机械模型在线预览demo:www.yanhuangxueyuan.com/3D/jixiezhu…

室内设计作品展示案例:www.yanhuangxueyuan.com/3D/houseDes…

到这threeJs的元素就差不多了 还在学习中,后面有空还会更新……

参考:juejin.cn/post/698098…