webGL 的 3D 世界主要由三大要素构成:场景(scene)、相机(camera)和渲染器(renderer),三者缺一不可。渲染的原理是:我们将创建的物体,添加到场景中,再通过相机(可以理解为人的视角)渲染到渲染器,从而呈现在网页中。three.js 是 webGL 一款比较热门的类库,本文以”three.js”: “^0.77.1”为例,通过网上教程和自身实践整理成这篇笔记。
1.场景(scene)
场景就是所有物体的容器,只需创建一个。假设我们要显示一个苹果,那么就将苹果加入到场景中即可,多个物体可加入到一个场景。
构造函数:
1 | var scene = new THREE.Scene(); |
2.相机(camera)
相机决定了场景中哪个角度的景色会显示出来,就像人的视角,分为正投影相机(THREE.OrthographicCamera)和透视投影相机(THREE.PerspectiveCamera),正投影和透视投影的区别是:透视投影有一个基本点,就是远处的物体比近处的物体小,一般我们采用透视投影相机的情况比较多。
构造函数:
1 | //正投影相机 |
1 | //透视投影相机 |
3.渲染器(renderer)
渲染器决定了渲染结果应挂接在页面的什么元素上,并以怎样的方式绘制。
构造函数:
1 | var renderer = new THREE.WebGLRenderer(); |
如果要让物体动起来,那么我们可以利用循环渲染:requestAnimationFrame
4.光源
光是我们看见物体的关键,用 Light 表示,是所有光源的基类,底下还有很多分类,我举几个最常用的:
环境光:环境光是经过多次反射惹来的光,无法确定其最初的方向,是一种无处不在的光。环境光源放出的光线被认为来自任何方向。因此,当你仅为场景设定环境光时,所有的物体无论法向量如何,都将表现为同样的明暗程度。
构造函数:
1 | THREE.AmbientLight(hex); //hex为一个16进制的颜色值 |
平行光:是一组没有衰减的平行的光线,类似太阳光的效果
1 | THREE.DirectionalLight(hex, intensity) |
点光源:由这种光源放出的光线来自同一点,且方向辐射自四面八方
1 | THREE.PointLight(color, intensity, distance); |
聚光灯:这种光源的光线从一个椎体中射出,在被照射的物体上产生聚光的效果
1 | THREE.SpotLight(hex, intensity, distance, angle, exponent) |
5.物体
创建一个物体可以包含多种元素,几何体,材质,纹理等,创建一个小球的简单示例:
1 | let geometry =new THREE.SphereGeometry(3, 16, 16); //球体 |
关于几何体,材质等种类非常多,具体可以参考[three.js 源码]:https://github.com/mrdoob/three.js/
6.动画
总结上述步骤:
- 创建场景、相机、渲染器
- 创建光源
- 创建物体并添加至场景中
- 渲染出场景
这样就构成了一个完整的但也是最基础的流程,网页中能看到我们创造的物体,接下来说到动画,3D 世界中的运动方式总结为三种:移动,旋转和缩放。
运动是相对的,场景动起来有两种方式:
1). 物体在坐标系中移动,相机不动
1 | function animate(){ |
2). 相机在坐标系中移动,物体不动
1 | function animate(){ |