七、Three.js 框架

有许多 WebGL 框架可用于抽象出我们在本书前六章中提到的低级应用编程接口(API)调用。这种抽象有助于使 WebGL 开发更加容易和高效。我们将在下一章讨论几个 WebGL 框架。在这一章中,我们将集中讨论最广泛使用的框架之一——three . js。我们将涵盖以下内容:

  • 图书馆的背景
  • 如何用 Three.js 开始开发
  • 如果不支持 WebGL,则退回到 2D 画布上下文进行渲染
  • Three.js API 调用来轻松创建相机、对象和使用光照模型
  • 展示与前面章节中的一些例子等价的 Three.js 代码,这些例子使用了直接的低级 WebGL API 调用
  • 介绍 tQuery,这是一个将 Three.js 与 jQuery 选择器结合在一起的库

背景

Three.js 由 Ricardo Cabello(又名 Doob 先生)创建,自 2010 年以来一直在 gitHub 上。从那时起,它得到了许多贡献者的额外帮助,它的用户群已经发展到一个很大的规模。

Three.js 提供了几种不同的绘制模式,如果不支持 WebGL,可以退回到 2D 渲染上下文。Three.js 是一个设计良好的库,使用起来相当直观。默认设置减少了所需的初始工作或“样板文件”的数量。设置可以作为对象构造时传入的参数来重写,也可以通过随后调用适当的对象方法来重写。

image 注意从 WebGL 开始的人可能会有一个错误的观念认为 Three.js 和 WebGL 开发是一回事。就像 JavaScript 框架 jQuery 和 JavaScript 不一样,Three.js(或者其他任何框架)和纯 WebGL 开发也不一样。

如果你精通一门底层语言,你通常可以理解它的框架代码。反之则不然。了解一个框架并不能保证你了解一门语言,所以学习低级语言是非常有益的。

特征

以下是 Three.js 框架众多特性中的一些:

  • 当不支持 WebGL 时,优雅地退回到 2D 上下文
  • 内置向量和矩阵运算符
  • 摄影机、灯光、材质、着色器、对象和常见几何体的 API 包装实现
  • 导入和导出实用程序
  • 良好的文档和示例

设置

我们现在将讨论如何获得 Three.js 库代码、它的目录结构和核心对象。

获得库

three . js 项目在 https://github.com/mrdoob/three.js 的github 上托管。最新版本可以从https://github.com/mrdoob/three.js/downloads下载。或者,如果您熟悉 git,您可以克隆存储库:

git clonehttps://github . com/mrdoob/3 . js . git。

该库正在积极开发中,对 API 的更改并不少见。最新的完整 API 文档可以在 URL mrdoob.github.com/three.js/docs/latest/,找到,它将重定向到当前版本。在https://github.com/mrdoob/three.js/wiki/有一个 wiki 页面,网上也不乏使用 Three.js 的演示或关于 Three.js 开发的文章。一些较好的文章列在附录 D 中。

目录结构

一旦您下载或克隆了存储库,您就可以将文件放在您的活动开发文件夹中。目录结构显示如下文件夹布局:

/生成源文件的压缩版本

/docs API 文档

/示例示例

/导出 Three.js 源代码的阿桂拖放式 gui 生成器

/src 源代码,包括中央的 Three.js 文件

/utils 实用程序脚本,如导出程序

在 src 目录中,组件被很好地分成以下子文件夹:

/src

/相机相机对象

/core 核心功能,如颜色、顶点、面、矢量、矩阵、数学定义等

/额外的实用程序、助手方法、内置效果、功能和插件

/灯光灯光对象

/材质网格和粒子材质对象,如 Lambert 和 Phong

/objects 物理对象

/renderers 呈现模式对象

/scenes 场景图形对象和雾函数

/textures 纹理对象

Three.js 中心文件

基本要素

Three.js 中有几个核心对象类型(见表 7-1 )。

表 7-1 。Three.js 中的核心对象

基础对象 描述
三个。渲染器 实际渲染场景的对象。实现可以是 CanvasRenderer、DOMRenderer、SVGRenderer 或 WebGLRenderer。
三个。事件 存储场景中包含的对象和灯光的场景图。
三个。照相机 虚拟相机;可以是透视照相机或正投影照相机。
三个。对象 3D 许多对象类型,包括网格,线,粒子,骨骼和精灵。
三个。光 轻型模型。类型可以是环境光、方向光、点光或聚光灯

关于对象层次的另外两个注意事项:三。网格对象有一个相关的三个。几何和三。物质对象,依次各三个。几何包含三个。顶点和三。面部物体。

基本用法

现在我们已经获得了 Three.js 库,我们准备开始使用它。我们需要包含来自本地资源的脚本,如下所示:

或者从 github 远程访问,例如:

你好世界 !

使用 Three.js 与我们到目前为止所做的底层编码相比是非常容易的。虽然已经学习了基本的 WebGL API 调用,但是我们可以在了解(或者至少在不实际检查库代码的情况下假设了解)surface Three.js API 调用下面发生了什么的同时,充分体会到框架的加速。

在我们的第一个例子中,如图 7-1 所示,我们将用 Three.js 渲染一个没有照明的长方体。

9781430239963_Fig07-01.jpg

图 7-1 。用 Three.js 渲染的矩形长方体。没有光线会使长方体显得扁平

与纯 WebGL 相比,该示例的完整代码相当短(参见清单 7-1 )。我们将在清单之后详细讨论代码的每一部分。

清单 7-1。 渲染一个未点亮的长方形长方体

Three.js 立方体测试