《WebGL入门指南》——第2章,第2.1节Three.js——一个JavaScript 3D引擎

简介:

本节书摘来自异步社区《WebGL入门指南》一书中的第2章,第2.1节Three.js——一个JavaScript 3D引擎,作者 【美】Tony Parisi,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.1 Three.js——一个JavaScript 3D引擎
WebGL入门指南
需求是创新之母。每个开发者在项目之初都必须不厌其烦的使用WebGL原生API来编写代码,直到可以建立一个自己的代码库,以用于随后的通用3D编程。事实上,已经有很多人完成了这项工作。现在有很多不错的WebGL开源框架,例如GLGE(http://www.glge.org/)、SceneJS(http://www.scenejs.org/)、CubicVR(http://www.cubicvr.org/)等。每个框架都有各自不同的地方,但它们的共同目的都是为了构建一个高等级的、对开发者相对友好的WebGL开发环境。

在本书中我们使用的WebGL框架叫做Three.js,它是由居住在西班牙巴塞罗那的程序员Ricardo Cabello Miguel开发的,此人更出名的网名叫做Mr.doob。Three.js以简单、直观的方式封装了3D图形编程中常用的对象。Three.js在开发中使用了很多图形引擎的高级技巧,极大地提高了性能。另外,由于内置了很多常用对象和极易上手的工具,Three.js的功能也非常强大。最后,Three.js还是完全开源的,你可以在GitHub上找到它的源代码,并且有很多人贡献代码,帮助Mr.doob一起维护这个框架。

我选择Three.js来编写示例代码有两个原因。第一,我目前在我自己的项目中也在使用它,并且我很喜欢它。第二,在众多引擎中它更受欢迎,已经成为其中的佼佼者。不过没有关系,你也可以选择其他你喜欢的框架,也许其他框架会更适合你的项目,更满足你项目的需求。一个引擎肯定不能适用于所有情况。我提及的其他引擎也都非常不错。如果可以的话,你甚至也可以编写自己的3D引擎。但在这之前,我们还是来看看既存的WebGL框架吧!

事实上,像Three.js这种工具集的出现和存在很大程度上是因为在最近几年中浏览器中的JavaScript虚拟机的迅猛发展。在一些年之前,虚拟机的性能还不足以支持这种库的存在,甚至连WebGL都不可能投入实际应用。得益于虚拟机的技术进步,才让WebGL和像Three.js这种工具集走进数以百万计的Web开发者的视线。

随着本书的逐步深入,你会了解到Three.js的更多细节。现在,我们先简要地列出Three.js的功能概述。

Three.js掩盖了3D渲染的细节
Three.js将WebGL原生API的细节抽象化,将3D场景拆解为网格、材质和光源(即它内置了图形编程常用的一些对象种类)。
Three.js是面向对象的
开发者可以使用上层的JavaScript对象,而不是仅仅调用JavaScript函数。
Three.js功能非常丰富
除了封装了WebGL原始API之外,Three.js还包含了许多实用的内置对象,可以方便地应用于游戏开发、动画制作、幻灯片制作、高分辨率模型和一些特殊的视觉效果制作。
Three.js速度很快
Three.js采用了3D图形最佳实践来保证在不失可用性的前提下,保持极高的性能。
Three.js支持交互
WebGL本身并不提供拾取(picking)功能(即是否知道鼠标正处于某个物体上)。而Three.js则固化了拾取支持,这就使得你可以轻松为你的应用添加交互功能。
Three.js包含数学库
Three.js拥有一个强大易用的数学库,你可以在其中进行矩阵、投影和矢量运算。
Three.js内置文件格式支持
你可以使用流行的3D建模软件导出文本格式的文件,然后使用Three.js加载;也可以使用Three.js自己的JSON格式或二进制格式。
Three.js扩展性很强
为Three.js添加新的特性或进行自定义优化是很容易的事情。如果你需要某个特殊的数据结构,那么只需要封装到Three.js即可。
Three.js同时支持HTML5 2DCanvas
尽管WebGL日益流行,但是仍然有一些环境尚未支持。Three.js可以同时在2D画布中渲染大部分的3D内容,尤其是在那些无法成功获取3D上下文的地方,可以让你的代码平滑的回滚到其他解决方案。
另外很重要的一点就是了解有哪些事情是Three.js无法做到的。Three.js不是一个游戏引擎,也不是一个虚拟现实平台。它缺少了一些在这些系统中常用的特性,比如公告板(billboard)、头像(avatar)和物理引擎。另外,如果你打算开发一个多人在线游戏,那么很可惜,Three.js并没有内置任何的网络支持。如果你确实需要这些功能模块,那你必须在Three.js上层再进行二次封装。尽管如此,Three.js的简洁和强大仍然使其成为开始学习WebGL的最佳选择之一。

好了,如果没有其他问题,那么就让我们继续,并开始写一些代码吧!

相关文章
|
23天前
|
机器学习/深度学习 人工智能 JavaScript
js和JavaScript
js和JavaScript
21 4
|
1月前
|
前端开发 JavaScript 区块链
连接区块链节点的 JavaScript 库 web3.js
连接区块链节点的 JavaScript 库 web3.js
27 2
|
22天前
|
JavaScript 前端开发
JavaScript生成的随机数随机字符串JS生成的随机数随机字符串
JavaScript生成的随机数随机字符串JS生成的随机数随机字符串
14 1
|
1月前
|
JavaScript 前端开发
js开发:请解释什么是模块化(modularization),并说明如何在JavaScript中实现模块化。
模块化将复杂系统拆分为松散耦合的模块,提高代码可读性、可维护性、可复用性和可扩展性。JavaScript模块化历经CommonJS(Node.js中常见,使用`require()`和`module.exports`)、AMD(RequireJS,异步加载,`define()`和`require()`)和ES6 Modules(官方标准,`import`和`export`)三个阶段。打包工具如Webpack、Rollup处理兼容性问题,使模块化代码能在各种环境中运行。
|
1月前
|
JavaScript 前端开发
js开发:请解释this关键字在JavaScript中的用法。
JavaScript中的`this`关键字根据执行上下文指向不同对象:全局作用域中指向全局对象(如`window`),普通函数中默认指向全局对象,但作为对象方法时指向该对象。在构造函数中,`this`指向新实例。箭头函数不绑定`this`,而是继承上下文的`this`值。可通过`call`、`apply`、`bind`方法显式改变`this`指向。
10 2
|
1月前
|
JavaScript 前端开发
编程笔记 html5&css&js 079 JavaScript 循环语句
编程笔记 html5&css&js 079 JavaScript 循环语句
|
1月前
|
JavaScript 前端开发 开发者
编程笔记 html5&css&js 078 JavaScript 条件判断语句
条件判断语句是首先要接触的语句。通过条件判断来执行不同的代码块。
|
1月前
|
JavaScript 前端开发 编译器
编程笔记 html5&css&js 077 Javascript 关键字
编程笔记 html5&css&js 077 Javascript 关键字
|
2月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
27 0
|
2月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
75 0