Skip to main content

WebGL框架:Three.js和Babylon.js的比较

WebGL框架:Three.js和Babylon.js的比较

今天的web浏览器已经走了很长的路。由于出色的 JavaScript WebGL api ,现代浏览器完全有能力在没有第三方插件帮助的情况下呈现先进的 2D3D 图形。利用专用的图形处理器的性能, WebGL 使我们访问的网页实现动态阴影和现实的物理。

正如你可能已经猜到的,如此强大的api通常有一个缺点。WebGL当然也不例外,其缺点是形式的复杂性。不要害怕,然而,当我们探索两个完全有能力框架的目标是,让你的生活更容易,甚至可能使用WebGL时更有效率。

三维框架的出身

曾经流行的 Three.js随着新的 Babylon.jsweb 开发人员提供了一个抽象的,基础制作功能丰富的WebGL创作框架。

Three.js 早在2009年4月出生,在换成 JavaScript 语言之前最初是用 ActionScript 。在 WebGL 的引入之前已经创建了three.js独特方便的模块化渲染接口,并在不用 WebGL 的情况下允许它使用 SVGHTML5 画布元素。

Babylon.js, 是相对陌生的, 它出生在2013年的夏天。由微软中心发布了 Babylon.js 和首次正式支持 WebGL APIInternet Explorer 11

设计的细微差异

Three.js and Babylon.js 两者都提供了易于使用的接口来处理错综复杂的WebGL动画。

利用在HTML一样简单的一行脚本语句引入相应的JavaScript文件。注意:Babylon.js的依赖性,需要引入开源的hand.js。

Three.js:

<script src="three.js"></script>

Babylon.js:

<script src="babylon.js"></script>
<script src="hand.js"></script>

两者之间的主要区别在于他们的预期用途。虽然两者都可以产生相同的效果,但是了解他们两个的过程是很重要的。

Three.js 的一个创作目标是:利用基于 web 的渲染器创建 GPU 增强的 3d 图形和动画。这样,这个框架使用非常广泛的方法 web 图形,而不需要不关注动画的任何一个细节。这种灵活的设计使得 Three.js 成为一个好工具(可以在threejs.org找到很多的例子)。

尽管 Three.js 试图给 WebGL 带来许多的动画方式,而 Babylon.js 采用更有针对性的方法。最初设计作为一个 Silverlight 游戏引擎, Babylon.js 的维护倾向于基于 web 的游戏开发与碰撞检测和抗锯齿等特性。在其官网上可以看到许多的例子。

并排比较

为进一步体现这两个框架的相似点和不同点,让我们快速构建一个3d动画。我们的项目的选择将会是一个超级简单的立方体缓慢旋转的应用。在创建这两个示例项目,你应该开始了解这两种技术和逐渐发现他们独特的优势。让我们开始吧。

第一个任务是初始化一个空白的画布,以便中包含我们的3 d动画。

Three.js:

<div style="height:250px; width: 250px;" id="three"></div>
var div = document.getElementById('three');

Babylon.js:

var canvas = document.getElementById(‘babylonCanvas’);

With Three.js we simply create an empty div as our container for the animation. Babylon.js on the other hand makes use of an explicitly defined HTML5 canvas to hold its 3D graphics.

在使用Three.js时我们简单地创建一个空的div容器。而Babylon.js利用显式定义的HTML5 canvas来开始3D图像。

接下来,我们加载渲染器然后准备场景并绘制到画布上。

Three.js:

var renderer = new THREE.WebGLRenderer();
renderer.setSize(width, height);
div.appendChild(renderer.domElement);

Babylon.js:

var engine = new BABYLON.Engine(canvas, true);

这一步没有太多东西,我们只是初始化渲染器并把它们贴到我们的画布上。

下一步我们设置一个场景来装下我们的相机和立方体cube。

Three.js:

var sceneT = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(70, width / height, 1, 1000);
camera.position.z = 400;

Babylon.js:

var sceneB = new BABYLON.Scene(engine);
var camera = new BABYLON.ArcRotateCamera("camera", 1, 0.8, 10, new BABYLON.Vector3(0, 0, 0), sceneB);
sceneB.activeCamera.attachControl(canvas);
var light = new BABYLON.DirectionalLight("light", new BABYLON.Vector3(0, -1, 0), sceneB);
light.diffuse = new BABYLON.Color3(1, 0, 0);
light.specular = new BABYLON.Color3(1, 1, 1);

这里我们创建了我们几乎相同的场景,然后实现相机(两个框架支持不同类型),从我们创建的场景中获得视图。参数传递给相机决定各种细节包括相机的角度、视野、纵横比和深度。

我们还得为Babylon.js加入方向性光源,同时将它附加到我们场景中,避免待会我们只能盯着漆黑一片的动画。

我们的画布,场景和相机都已经准备好了,在渲染和动画起来之前我们只需要加入方块。

Three.js:

var cube = new THREE.CubeGeometry(100, 100, 100);

var texture = THREE.ImageUtils.loadTexture('texture.gif');
texture.anisotropy = renderer.getMaxAnisotropy();
var material = new THREE.MeshBasicMaterial({ map: texture });

var mesh = new THREE.Mesh(cube, material);
sceneT.add(mesh);

Babylon.js:

var box = BABYLON.Mesh.CreateBox("box", 3.0, sceneB);
var material = new BABYLON.StandardMaterial("texture", sceneB);
box.material = material;
material.diffuseTexture = new BABYLON.Texture("texture.gif", sceneB);

First, we create our cube objects of the specified size and then create our material/mesh (think texture) that will be painted onto the cubes. Any image file will work for the texture and both frameworks support mesh exports from 3D modeling tools like Blender.

首先,我们创建指定大小的立方体对象,然后创建我们的材质/网格,把材质涂在立方体的各个面。任何图像文件都可以导入纹理texture,而且两个框架都支持从3D模型工具软件(如 Blender)中导出模型。

在最后一步,我们添加一个缓慢的旋转动画,然后渲染场景。

Three.js:

function animate() {
     requestAnimationFrame(animate);
     mesh.rotation.x += 0.005;
     mesh.rotation.y += 0.01;
     renderer.render(sceneT, camera);
}

Babylon.js:

engine.runRenderLoop(function () {
     box.rotation.x += 0.005;
     box.rotation.y += 0.01;
     sceneB.render();
     });

Three.jsBabylon.js 两者使用动画或渲染循环去更新一个新的旋转角度内容到画布上。您还将注意到 Three.jsBabylon.js 稍有不同。我们的最终产品是两个立方体在半空中轻轻旋转。

后言

两个 WebGL 框架基于相同的 Web 图形接口,但专注于增强的不同方面,。

最后,这两个相对年轻的框架使 web 开发人员产生了能够更容易地利用强大的 3D WebGL 的机会。这样,任何有兴趣进行 3D web 开发的同学,当然应该仔细看看这前沿技术。