Статьи

Three.js и Babylon.js: сравнение фреймворков WebGL

Сегодняшние веб-браузеры прошли долгий путь со времен сэра Тима Бернерса-Ли и его программного обеспечения Nexus. Благодаря фантастическим API-интерфейсам JavaScript, таким как WebGL, современные браузеры полностью способны воспроизводить продвинутую 2D и 3D-графику без помощи сторонних плагинов. Используя мощь выделенных графических процессоров, WebGL дает нашим веб-страницам доступ к динамическому затенению и реалистичной физике.

Как вы уже догадались, такие мощные API обычно имеют недостаток. WebGL, конечно, не исключение, и его недостаток проявляется в форме сложности. Не бойтесь, однако, поскольку мы исследовали две полностью функциональные платформы, которые призваны сделать вашу жизнь проще и, возможно, даже на ощупь более продуктивной при работе с WebGL.

Скромное происхождение 3D-фреймворков

Всегда популярный Three.js вместе с более новым Babylon.js предлагают веб-разработчикам абстрактную основу для создания многофункциональных творений WebGL — от анимированных логотипов до полностью интерактивных 3D-игр.

Three.js начал свою работу еще в апреле 2009 года и изначально был написан на ActionScript, а затем переведен на JavaScript. Будучи созданным до появления WebGL, Three.js обладает уникальным удобством модульного интерфейса рендеринга, позволяющего использовать его вместе с SVG и HTML5-элементом canvas в дополнение к WebGL.

Babylon.js, будучи относительным новичком, вышел на сцену летом 2013 года. Представленный вам умом в Microsoft, Babylon.js был представлен вместе с первой официальной поддержкой Internet Explorer 11 для API WebGL. Несмотря на происхождение из лабораторий Редмонда, Babylon.js (как и Three.js) поддерживает лицензию с открытым исходным кодом.

Тонкая разница в дизайне

И Three.js, и Babylon.js представляют собой простые в использовании библиотеки для работы со сложностями анимации WebGL.

Следуя сцене, рендереру, камере, объектам модели анимации, эти фреймворки используют аналогичные методы для использования 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>

Основное различие между ними заключается в их предполагаемом использовании. Хотя это может быть правдой, любой из этих фреймворков можно использовать для создания одной и той же 3D-анимации, важно знать, для чего каждая из них была создана.

Three.js был создан с одной целью: использовать веб-рендеры для создания трехмерной графики и анимации с улучшенным графическим процессором. Таким образом, эта структура использует очень широкий подход к веб-графике, не сосредотачиваясь на какой-либо отдельной нише анимации.

Этот гибкий дизайн делает Three.js отличным инструментом для веб-анимации общего назначения, такой как логотипы или приложения для моделирования (отличные примеры можно найти здесь ).

В то время как Three.js пытается привнести в таблицу WebGL широкий спектр анимационных функций, Babylon.js использует более целенаправленный подход. Первоначально разработанный как игровой движок Silverlight, Babylon.js сохраняет склонность к разработке веб-игр с такими функциями, как обнаружение столкновений и сглаживание. Как указывалось ранее, Babylon.js по-прежнему полностью поддерживает веб-графику и анимацию, о чем свидетельствуют демонстрации, размещенные на первой странице его веб-сайта .

Параллельная демонстрация технологий WebGL

Чтобы дополнительно продемонстрировать сходство и различие этих двух структур, давайте создадим быструю 3D-анимацию. Наш проект будет очень простым кубом с медленным вращением. Создавая эти два примера проектов, вы должны начать понимать, как две технологии постепенно расходятся и демонстрировать свои уникальные преимущества. С этого, давайте начнем.

Первым делом при создании творческих проектов практически любого рода является инициализация чистого холста, в котором будет размещаться наша 3D-анимация.

Three.js:

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

Babylon.js:

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

С Three.js мы просто создаем пустой div в качестве контейнера для анимации. Babylon.js, с другой стороны, использует явно определенный холст HTML5 для хранения своей трехмерной графики.

Затем мы загружаем средство визуализации, которое будет отвечать за подготовку сцены и рисование на холсте.

Three.js:

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

Babylon.js:

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

Ничего особенного, мы просто инициализируем средства визуализации (или движок в случае Babylon.js) и прикрепляем их к нашему холсту.

Наш следующий шаг будет немного более сложным, когда мы создадим сцену для размещения нашей камеры и куба.

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);

Здесь мы создаем наши сцены почти идентичным образом, а затем внедряем камеры (из которых обе платформы поддерживают разные типы), с которых мы фактически будем просматривать созданные сцены. Параметры, передаваемые в камеру, определяют различные детали относительно перспективы камеры, такие как поле зрения, соотношение сторон и глубина.

Мы также включаем DirectionalLight для 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);

Сначала мы создаем наши объекты куба указанного размера, а затем создаем наш материал / сетку (думаю, текстура), которая будет рисоваться на кубах. Любой файл изображения будет работать для текстуры, и обе платформы поддерживают экспорт сетки из инструментов трехмерного моделирования, таких как 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.js, и Babylon.js используют цикл анимации или рендеринга, чтобы обновить холст новым повернутым рисунком. Вы также заметите, что Three.js немного отличается от Babylon.js, прикрепив камеру в точке рендеринга. Наш конечный продукт — два кубика, мягко вращающихся в воздухе. Довольно легко, а?

Сказка о двух рамках

И там у вас есть это. Две очень функциональные платформы WebGL, построенные на одной и той же основе, но сосредоточенные на различных аспектах улучшенной графики на основе Web.

Вы из первых рук увидели, насколько похожи могут быть их подходы к анимации с точки зрения парадигмы сцены, рендера, камеры и объектов. Несмотря на сходство, Babylon.js тонко дифференцируется, фокусируясь на традиционных требованиях игрового движка, таких как движки и настраиваемое освещение.

В конце концов, эти две относительно молодые платформы позволяют веб-разработчикам легче использовать мощные возможности 3D, предоставляемые WebGL. Таким образом, любой, кто интересуется разработкой 3D-веб-приложений, должен, конечно, поближе взглянуть на эту передовую технологию.

Скачать демо-код в zip-файле