目标

  1. 介绍 WebGL 基础
  2. 介绍 WebGL 中的骑兵 Three.js
  3. 编写 Three.js 的简单实例

简单实例模板

实例的效果是显示旋转一个绿色正方体,如下,但不同版本的 three.js 可能默认的 背景颜色 不一样:

 

代码解析

1、三大组建

在 Three.js 中,要渲染一个物体到网页中,需要三个组建:场景(scene)、相机(camera)、渲染器(renderer)。有这三样东西,才能将物体渲染到网页中

创建三大要素的代码如下:

2、场景

在 Three.js 中场景只有一种,用 THREE.Scene 来表示,构建的代码如下:

场景是所有物体的容器,如果要显示一个苹果,就需要将苹果对象放入场景中。

3、相机

另一个组建是相机,相机决定了场景中哪个角度的景色会显示出来。就如人的眼睛,相机的位置决定了所渲染的景色的不同。

场景只有一种,但是相机却有很多种。不同的相机确定了呈现出的各个方面比重的不同,例如有的相机适合人像,有的适合风景,专业的摄影师根据实际用途的不同会选择不同的相机。对程序员来说,只要设置不同的相机参数,就能让相机产生不一样的效果。

在 Three.js 中有不同的相机:

(1)透视相机(THREE.PerspectiveCamera),这是一种比较常用的相机类型。定义一个相机的代码如下:

4、渲染器

接触过图像渲染技术的童鞋都知道,渲染器是个什么东西,这个东西的重要性更不用说。渲染器直接决定了渲染的结果应该画在页面的什么地方,以及怎么画(渲染)。

定义一个 WebRenderer 渲染器的代码如下:

需要注意的是,渲染器 renderer 的 domElement 元素一般表示为渲染器中的画布 canvas ,所有的渲染都是画在 domElement 上的,所以这里的 appendChild 表示将这个 domElement 元素挂在 body 下面,这样渲染的结果才能在页面中显示。

5、添加物体到场景中

将一个物体添加到场景中:

代码中出现的 THREE.CubeGeometry 是一个几何体。这里将之定义为 正方体 或 长方体,所以由三个参数组成(长、宽、高)。CubeGeometry 原型为如下代码定义:

6、渲染

上面的几部都是为了渲染之前做的参数设定和准备,在这一步要做的就是 将目标物体(5)在什么场景(2)里怎么渲染(3&4) 出来。

渲染就应该使用渲染器,结合相机和场景来得到结果画面。实现的代码如下:

7、渲染循环

渲染有两种方式:实时渲染离线渲染

离线渲染,就是事先渲染好的一帧帧图像,然后再将之拼接成一段连续的图像。如果不事先处理,那么播放(显示)的时候就会很卡,因为 CPU & GPU 不能够快速的处理 高质量图像

实时渲染,就是需要不停的对画面进行即时渲染,即使画面没有任何变化,也需要 重新渲染 

实例如下:

其中一个重要的函数就是 requestAnimationFrame,这个函数就是让浏览器去执行一个参数中的函数,这样通过上面 render 中调用 requestAnimationFrame() 函数,该函数又让 render() 再执行一次,就形成了我们通常说的游戏循环。

后记

A、场景,相机,渲染器之间的关系

Threejs 中的:

场景(Scene)是一个(或多个)物体的容器,开发者可以将需要的角色(Object)放入场景中。同时,角色自身也在管理着其在场景中的位置。

相机(Camera)的作用就是面对场景,在场景中取一个合适的“景”,将之拍摄下来。

渲染器(Renderer)的作用就是把相机拍摄下来的“景”,放到画布上(这里可以为浏览器界面)显示。

B、第二框架实例

实际上述代码运行并没有东西出来,但是框架的结构已经很明确:

initThreeRenderer():初始化渲染器

initCamera():初始化相机

initScene():初始化场景

initLight():初始化灯光

initObject():初始化物体

render():开始渲染(循环)