Three.js 学习系列第一篇

2020-01-31  本文已影响0人  人话博客

在学习 Three.js 之前,感性的了解一些基础的 3D 知识后,后面的学习就不会那么纠结了.


3D 场景前置知识

下面针对上述的各个点,一个一个的来解释.


场景 (Scene)

场景应该很好理解.

我们生活的地球就是一个场景,场景里有物体(大海,高山,河流,你,我),有光源(太阳光,路灯,手电筒),有摄像机(你的眼镜,路边的监控摄像头)

场景中包含了

在 Three.js 中,由于我们需要渲染到 HTML 上. 所以这里还多了一个在现实中很难联想的: 渲染器 renderer


相机 (Camera)

有场景了,瞎子是无法看见的.你需要一双可以观察场景的眼镜.

Three.js 中, Camera 相机,就是充当眼镜的角色.

不同于真是世界,每个人都有一双眼镜,可以有无数个视角范围. 但是针对某一个人来说,它的视角同时只能有一个.

在 Three.js 中,一个场景中,有且只能有一个相机.

Three.js 中,我们常用的相机类型有两种:

一般情况下,模拟人眼观察的世界(3D),都是使用透视相机(perspective) , 它满足真实世界里的远小近大的规则. 透视相机一般用户渲染 3D 场景

正交相机的特点是: 物体渲染的尺寸大小和和观察它相机的远近无关.也就是说,在场景中移动一个物体,其大小不会随着镜头的变化而变化. 正交相机一般用于渲染 2D 场景

关于透视相机 API 的大致了解

Three.PerspectiveCamera(fov,aspect,near,far)

参数描述:

参数的示意图如下:

相机参数图解说明

创建摄像机之后,还要对齐进行定位(人眼在哪?),以及设置观察的角度或者说是方位(往哪看?).

// 伪代码
camera.position = new THREE.Vector3(x,y,z)  // 相机在哪
camera.lookAt = new THREE.Vector3(x, y, z) // 往哪看.


灯光 (Light)

如果你呆在过绝对黑暗的地方,你就会发现,没有光源的环境,绝对是一片漆黑.伸手不见五指.

对于 THREE.js 的世界也是如此.

如果不设置光源,你将无法看见你之前设置的任何场景,物体.(有时候,为什么在浏览器里啥都看不见,可以自检一下,是否是没有设置光源,或者光源的颜色就是黑色)

在 THREE.js 中,光源是必须的.如果不设置光源,浏览器的表现形式就是一片漆黑.什么也看不见.

THREE.js 中内置的大量的类型. 可以先联想真实世界,感性的理解一下.


Mesh

THREE.js 中, Mesh 表示物体.

和真实世界一样, 物体是由几何结构(非标准圆形)和表面材质(一看就知道是🍊)组成.

在计算机的2D世界里,一条弧线是有限个点构成有限个线段连接组成的. 当线段的数量足够多时,每一条线段的长度就会越短,短的像一个点,与此同时,你等到的弧线就会越完美.

计算机的 3D 模型世界也是类似. 只不过线段变成了平面,普遍用很多三角型平面拼接而成的网格模型,我们称之为 Mesh.

THREE.js 的世界中. 材质 (Material) + 几何体 (Geometry) = Mesh(物体)

Geometry 类似于物体的骨架.
Material 类似于物体的皮肤.

材质的分类

材质的分类

2D 图形

2D图形

3D 图形

3D图形

加载外部模型

(对 3D 不熟,对几何体不熟)绝大多数情况下,我们都是使用设计师个我们提供好的 3D 模型文件,让 three.js 来直接加载.(比如某个工厂的厂区的 3D 模型文件)

我们可以根据设计师提供的 3D 文件格式,来选择对应的 loader , 将外部模型加载进来.

加载外部模型是通过 three.js 的加载器(loader) 来实现的.

加载器把文本/二进制数据文件转换为 three.js 对象结构.

由于 3D 文件格式有很多, three.js 也提供的对应的 loader 来处理这些差异化的模型文件. 我们要做的仅仅是使用正确的 loader 加载正确的模型文件即可

3D 文件格式和 loader 对应关系如下:

3D文件格式和 loader 对应关系

粒子

THREE.Sprite

在WebGlRenderer渲染器中使用THREE.Sprite创建的粒子可以直接添加到scene中。创建出来的精灵总是面向镜头的。即不会有倾斜变形之类透视变化,只有近大远小的变
化。


场景交互

Three.js中并没有直接提供“点击”功能,一开始使用的时候我也觉得一脸懵逼,后来才发现我们可以基于THREE.Raycaster来判断鼠标当前对应到哪个物体,用来进行碰撞检测.

上一篇 下一篇

猜你喜欢

热点阅读