八、生产力工具

在前一章中,我们看到了优秀的 Three.js WebGL 框架,并展示了它如何抽象低级 WebGL API 调用。这种抽象简化并加速了开发。这一章介绍了一些额外的工具,可以帮助你的开发更有效率和更愉快。我们将在本章中讨论的主题如下:

  • 使用 WebGL 框架的优点和学习核心 WebGL 的好处
  • 目前可用的框架
  • 基本的“Hello World”philoGL 和 GLGE 框架示例
  • 加载现有网格和模型
  • 文件格式和导入/导出工具
  • 查找和修改现有着色器和纹理
  • JavaScript 物理框架
  • 使用 Three.js 的 physi.js 库的物理演示

框架

一个框架 抽象了底层 API 调用,也扩展了内置功能。WebGL 框架让您开始使用较少的初始设置和样板代码。这使得开始编程更快,开发复杂的应用更容易。框架可以抽象顶点缓冲对象(VBO)和着色器处理,简化相机操作,执行矩阵数学运算,加载网格等。

使用框架的代价是对底层细节的抽象可能会限制可配置性和性能(不需要修改框架源代码)。不过,通常节省的时间超过了可配置性的损失。

然而,不要依附于任何一个框架,先学习基本的 WebGL API 是有益的。这样做的基本原理是,了解核心 WebGL 的工作方式应该能够相当容易地在框架之间切换。相反不成立。如果你首先学习一个框架(不管它有多好),然后需要使用基本的 WebGL API 或切换框架,你可能会很迷茫。此外,如果您了解核心 WebGL 并希望了解特定框架的细微差别,您可以查看源代码并了解基本的 WebGL API 调用。

许多选择

WebGL 有很多很多可用的框架。根据 http://www.khronos.org/webgl/wiki/User_Contributions 的说法,目前有 25 个可用的框架。你应该使用哪一个?

为了脱颖而出,构建了几个框架来提供特定的利基用途,如一般用途、游戏开发、数据可视化、地球仪和地图以及高性能。除了关注点不同,还有哪些因素决定了使用哪个框架?和其他软件项目一样,这里有一些评估标准:

  • 力量和功能 :它可以工作,让你快速创建使用高级技术的场景。代码写得很好,可扩展,很少崩溃,也没有很多严重的错误。
  • 可用性 :清晰的 API 和好的文档,wiki,FAQ 等等。
  • 支持和活动 :作者和社区积极参与。Bug 修复相当快,新的特性需求也在增加(代码库不会无限期地停滞)。要问的一些问题是:项目已经提交了多少次?有多少贡献者?这个项目已经存在多久了?最后一次提交是什么时候?释放?稳定发布?有论坛或者用户群吗?
  • 受欢迎程度 :这更适用于低端和高端人群。如果没有人使用某样东西,就很难获得对图书馆的支持。该框架也更有可能失效并被抛弃。另一方面,如果某个东西广受欢迎,那么资源很容易获得,并且你可以确信这个框架将会有一个光明的未来。
  • 个人喜好 :你就是更喜欢。当所有其他事情都差不多的时候,你自己的直觉偏好很重要。

比较活动的一些项目度量的一个地方是在https://www.ohloh.net/p/compare,在那里你可以一次比较多达三个项目的统计数据。

可用框架

在这里,我选择了几个最有前途的框架(对我来说),并附有概要和网站地址。之后,我们将给出一个基本的“你好,世界!”两个框架的例子:GLGE 和 philoGL。

image 注意我看不出列出所有当前的框架有多大价值,因为许多框架缺乏之前指定的必要标准(支持、特性、用户),而这些标准是长期存在所必需的。当你试图选择一个来使用时,把它们都展示出来只会把水搅浑。在撰写本文时,这个列表包含了一些顶级的框架。这个列表有些主观,所以如果我遗漏了一个你认为有价值的框架,我很抱歉。

C3DL

C3DL 代表 C anvas 3D L 库。该库旨在提供“一组数学、场景和 3d 对象类,使 WebGL 对于那些希望在浏览器中开发 3D 内容但不想深入处理 3D 数学的开发人员来说更容易访问。”

C3DL 网页有几个教程和很好的文档。你可以在这里找到它:http://www.c3dl.org/

铜光〔t0〕〔t1〕T2〕

CopperLicht 可用于 3D 应用和游戏。特性包括快速渲染、世界编辑器和许多模型格式的导入。你可以在这里找到更多关于它的信息:http://www.ambiera.com/copperlicht/index.html

GLGE

GLGE 的主要目标是简化。“懒人的 WebGL”和“GLGE 的目的是向 web 开发者掩盖 WebGL 的复杂本质,然后他们可以花时间为 web 创造更丰富的内容。”在本章的后面我们将展示一个 GLGE 的例子。你可以在这里找到 GLGE:【http://www.glge.org/】T2

Jax

Jax 的设计考虑到了快速开发。它是“快速构建健壮、高质量 WebGL 应用的一站式商店”Jax 使用 Ruby 语言和模型-视图-控制器(MVC)模式来分离组件。一些内置功能包括键盘和鼠标输入处理,以及单元测试功能。你可以在 http://jaxgl.com/的找到 Jax 网站,在 https://github.com/sinisterchipmunk/jax 的找到 github 的源代码

kicks

KickJS 专注于用 WebGL 进行游戏开发。KickJS 还提供了一个在线交互式 GLSL 编辑器,如第 2 章中展示的那样,还有一个在线编辑器(目前处于测试阶段)。你可以在这里找到 KickJS 网站:【http://www.kickjs.org/】T2,在 github 上托管的源代码在这里:【https://github.com/mortennobel/KickJS/】T4

PhiloGL

PhiloGL 专注于数据可视化和游戏开发。该框架的目标是在编写时考虑到最佳的 JavaScript 实践,并对基本的 WebGL 调用进行抽象。在本章的后面我们将展示一个 philoGL 的例子。你可以在这里找到更多关于它的信息:http://www.senchalabs.org/philogl/

场景 t1

SceneJS 擅长渲染大量可拾取的对象,如工程和医疗应用中使用的对象。这是可能的,因为该框架(顾名思义)提供了一个场景图引擎,它在内部使用了一个高效的优化绘制列表,并且是基于 JSON 的。你可以在这里找到更多关于它的信息:http://www.scenejs.com/

TDL

Threedlibrary (TDL)专注于低水平的使用和性能,而不是易用性。谷歌身体和许多高性能的演示使用 TDL。你可以在这里找到更多关于它的信息:http://code.google.com/p/threedlibrary/

三. js

如前一章所述,Three.js 是一个通用的 3D 引擎,它抽象出了许多细节,使得开发 WebGL 更加容易。Three.js 是目前最流行的 WebGL 框架,有人认为 WebGL 和 Three.js 是一回事。事实并非如此,但正如前一章所展示的,这是一个很好的尝试框架。你可以在这里找到 github 上的 Three.js 库:https://github.com/mrdoob/three.js

在这一章,我们将展示如何导入网格和使用 Three.js 的物理引擎。

一句“你好,世界!”例子

philoGL 是来自 Sencha 实验室的一个框架,该项目的主要开发者是尼古拉斯·加西亚·贝尔蒙特。框架网站在http://www.senchalabs.org/philogl/,源代码在 github 上:https://github.com/senchalabs/philogl

首先,下载这个库,并将其包含在本地

,或从远程位置如

philoGL 库的\examples 文件夹展示了 Giles Thomas 在http://learningwebgl.com/blog/?page_id=1217的热门网站“学习 WebGL”的核心 WebGL 课程的 philoGL 版本。该库分为核心和模块。文件可在 http://www.senchalabs.org/philogl/doc/index.html获得

清单 8-1 显示了库包含的移植的“学习 WebGL”第 4 课示例的修改版本,供我们进一步分析。从清单中可以看出,philoGL 对 JavaScript 使用了非常面向对象的方法。为简洁起见,省略了网格数据,但可以在/08/01_philogl_cube.html 中找到完整的联机文件

清单 8-1 代码用 philoGL 旋转一个立方体

Philo cube 试验