Наши уроки по webgl продолжаются. Сегодня мы расширяем практику загрузки готовых трехмерных моделей. В постоянных условиях нехватки времени всегда удобнее просто загрузить и внедрить готовую модель, чем реализовать ее программно. На данный момент многие загрузчики для three.js уже разработаны. В этой статье мы рассмотрим следующие загрузчики: AWDLoader, BabylonLoader, PDBLoader, PLYLoader, STLLoader, VRMLLoader и VTKLoader. Да, это намного больше сразу, но мы должны закончить с загрузчиками, чтобы начать со следующей темы следующего урока.
подготовка
Прежде всего, нам нужно подготовить скелет (основную сцену) для всех наших загрузчиков. На этом шаге нам нужно создать новый текстовый файл и назовем его «index.html». Вот источник этого:
<!DOCTYPE html>
<html lang="en" >
    <head>
        <meta charset="utf-8" />
        <meta name="author" content="Script Tutorials" />
        <title>WebGL With Three.js - Lesson 7 - loading three-dimensional models | Script Tutorials</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
        <link href="css/main.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <script src="js/three.min.js"></script>
        <script src="js/AWDLoader.js"></script>
        <script src="js/BabylonLoader.js"></script>
        <script src="js/PDBLoader.js"></script>
        <script src="js/PLYLoader.js"></script>
        <script src="js/STLLoader.js"></script>
        <script src="js/VRMLLoader.js"></script>
        <script src="js/VTKLoader.js"></script>
        <script src="js/THREEx.WindowResize.js"></script>
        <script src="js/OrbitControls.js"></script>
        <script src="js/stats.min.js"></script>
        <script src="js/script.js"></script>
    </body>
</html>
Как вы заметили, мы подключили все стандартные библиотеки (three.js, WindowResize, OrbitControls и stats) и все загрузчики одновременно. В сегодняшнем примере мы будем загружать все 9 различных типов моделей одновременно.
Подготовка основной сцены webgl
script.js
var lesson7 = {
  scene: null,
  camera: null,
  renderer: null,
  container: null,
  controls: null,
  clock: null,
  stats: null,
  init: function() { // Initialization
    // create main scene
    this.scene = new THREE.Scene();
    this.scene.fog = new THREE.FogExp2(0xcce0ff, 0.0003);
    var SCREEN_WIDTH = window.innerWidth,
        SCREEN_HEIGHT = window.innerHeight;
    // prepare camera
    var VIEW_ANGLE = 60, ASPECT = SCREEN_WIDTH / SCREEN_HEIGHT, NEAR = 0.1, FAR = 20000;
    this.camera = new THREE.PerspectiveCamera( VIEW_ANGLE, ASPECT, NEAR, FAR);
    this.scene.add(this.camera);
    this.camera.position.set(-27, 15, -25);
    this.camera.lookAt(new THREE.Vector3(0,0,0));
    // prepare renderer
    this.renderer = new THREE.WebGLRenderer({ antialias:true });
    this.renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
    this.renderer.setClearColor(this.scene.fog.color);
    this.renderer.shadowMapEnabled = true;
    this.renderer.shadowMapSoft = true;
    // prepare container
    this.container = document.createElement('div');
    document.body.appendChild(this.container);
    this.container.appendChild(this.renderer.domElement);
    // events
    THREEx.WindowResize(this.renderer, this.camera);
    // prepare controls (OrbitControls)
    this.controls = new THREE.OrbitControls(this.camera, this.renderer.domElement);
    this.controls.target = new THREE.Vector3(0, 0, 0);
    this.controls.maxDistance = 3000;
    // prepare clock
    this.clock = new THREE.Clock();
    // prepare stats
    this.stats = new Stats();
    this.stats.domElement.style.position = 'absolute';
    this.stats.domElement.style.left = '50px';
    this.stats.domElement.style.bottom = '50px';
    this.stats.domElement.style.zIndex = 1;
    this.container.appendChild( this.stats.domElement );
    this.scene.add( new THREE.AmbientLight(0x606060) );
    // light
    var dirLight = new THREE.DirectionalLight(0xffffff);
    dirLight.position.set(200, 200, 1000).normalize();
    this.camera.add(dirLight);
    this.camera.add(dirLight.target);
    // load models
    this.loadModels();
  },
  loadModels: function() {
    // here we will load all the models ...
  }
};
// Animate the scene
function animate() {
  requestAnimationFrame(animate);
  render();
  update();
}
// Update controls and stats
function update() {
  lesson7.controls.update(lesson7.clock.getDelta());
  lesson7.stats.update();
}
// Render the scene
function render() {
  if (lesson7.renderer) {
    lesson7.renderer.render(lesson7.scene, lesson7.camera);
  }
}
// Initialize lesson on page load
function initializeLesson() {
  lesson7.init();
  animate();
}
if (window.addEventListener)
  window.addEventListener('load', initializeLesson, false);
else if (window.attachEvent)
  window.attachEvent('onload', initializeLesson);
else window.onload = initializeLesson;
С помощью этого кода мы создали пустую сцену (со слабым туманом), камеру, рендер, контроллер, статистику, свет и землю. Мы также подготовили еще одну функцию «loadModels», куда мы поместим все наши загрузчики.
AWDLoader
О AWD — AWD — это двоичный формат файлов для 3D-сцен, объектов и связанных данных. Его основное использование — с движком Away3D, но любой кодер / декодер, который соответствует открытой спецификации, может работать с файлами AWD. Спецификация формата файла и набор инструментов для работы с файлами AWD поддерживаются командой разработчиков Away3D. AWD разработан таким образом, чтобы он был легким, быстрым и простым для анализа, а также расширяемым как для пользовательских приложений, так и для будущих версий формата файла, при этом оставаясь совместимым как с прямой, так и с обратной совместимостью.
Для загрузки файлов AWD в three.js вы можете использовать следующий код:
// prepare AWD loader and load the model
var oAwdLoader = new THREE.AWDLoader();
oAwdLoader.load('models/sample.awd', function(object) {
  object.position.set(-10, 1, -15);
  object.scale.set(0.1, 0.1, 0.1);
  lesson7.scene.add(object);
});
BabylonLoader
О программе — Babylon.js использует формат файла JSON для описания сцен.
Для загрузки файлов babylon в three.js вы можете использовать следующий код:
// prepare Babylon loader and load the model
var oBabylonLoader = new THREE.BabylonLoader();
oBabylonLoader.load('models/rabbit.babylon', function(object) {
  // apply custom material
  object.traverse( function(child) {
    if (child instanceof THREE.Mesh) {
      // apply custom material (texture)
      var textureD = THREE.ImageUtils.loadTexture('models/0.jpg', undefined, function() {
        child.material = new THREE.MeshLambertMaterial({  map: textureD });
        child.position.set(-10, 0, -5);
        child.scale.set(0.1, 0.1, 0.1);
        lesson7.scene.add(child);
      });
      textureD.needsUpdate = true;
      textureD.magFilter = THREE.NearestFilter;
      textureD.repeat.set(1, 1);
      textureD.wrapS = textureD.wrapT = THREE.RepeatWrapping;
      textureD.anisotropy = 16;
    }
  });
});
PDBLoader
О — Банк данных белка (PDB) является хранилищем для трехмерных структурных данных крупных биологических молекул, таких как белки и нуклеиновые кислоты.
Для загрузки файлов PDB в three.js вы можете использовать следующий код:
// prepare PDB loader and load the model
var oPdbLoader = new THREE.PDBLoader();
oPdbLoader.load('models/caf2.pdb', function(geometry, geometryBonds) {
  var group = new THREE.Object3D();
  var i = 0;
  geometry.vertices.forEach(function (position) {
    var sphere = new THREE.SphereGeometry(0.3);
    var material = new THREE.MeshPhongMaterial({color: geometry.colors[i++]});
    var mesh = new THREE.Mesh(sphere, material);
    mesh.position.copy(position);
    group.add(mesh);
  });
  for (var j = 0; j < geometryBonds.vertices.length; j += 2) {
    var path = new THREE.SplineCurve3([geometryBonds.vertices[j], geometryBonds.vertices[j + 1]]);
    var tube = new THREE.TubeGeometry(path, 1, 0.05)
    var material = new THREE.MeshPhongMaterial({color: 0xcccccc});
    var mesh = new THREE.Mesh(tube, material);
    group.add(mesh);
  }
  group.position.set(20, 5, -20);
  group.scale.set(2, 2, 2);
  lesson7.scene.add(group);
});
PLYLoader
О программе — PLY — это компьютерный формат файла, известный как формат файла Polygon или Stanford Triangle Format. Формат был в основном предназначен для хранения трехмерных данных с 3D-сканеров. Он поддерживает относительно простое описание одного объекта в виде списка номинально плоских многоугольников. Могут быть сохранены различные свойства, включая: цвет и прозрачность, нормали поверхности, координаты текстуры и значения достоверности данных. Формат позволяет иметь разные свойства для передней и задней части многоугольника.
Для загрузки файлов PLY в three.js вы можете использовать следующий код:
// prepare PLY loader and load the model
var oPlyLoader = new THREE.PLYLoader();
oPlyLoader.load('models/F117.ply', function(geometry) {
  var material = new THREE.MeshBasicMaterial({color: 0xff4444});
  var mesh = new THREE.Mesh(geometry, material);
  mesh.rotation.set( - Math.PI / 2 - 0.2, 0, - Math.PI / 2 + 0.2);
  mesh.position.set(-20, 15, 10);
  mesh.scale.set(2, 2, 2);
  lesson7.scene.add(mesh);
});
STLLoader
О программе — STL (STereoLithography) — это формат файла, встроенный в программное обеспечение CAD для стереолитографии, созданное 3D Systems. STL также известен как стандартный язык тесселяции. Этот формат файла поддерживается многими другими программными пакетами; это широко используется для быстрого создания прототипов и автоматизированного производства. Файлы STL описывают только геометрию поверхности трехмерного объекта без какого-либо представления цвета, текстуры или других общих атрибутов модели САПР. Формат STL определяет как ASCII, так и двоичные представления. Бинарные файлы более распространены, так как они более компактны.
Для загрузки файлов STL в three.js вы можете использовать следующий код:
// prepare STL loader and load the model
var oStlLoader = new THREE.STLLoader();
oStlLoader.load('models/piano.stl', function(geometry) {
  var material = new THREE.MeshNormalMaterial();
  var mesh = new THREE.Mesh(geometry, material);
  mesh.rotation.set( - Math.PI / 2, 0, Math.PI / 2);
  mesh.position.set(-10, 0, 10);
  mesh.scale.set(2, 2, 2);
  lesson7.scene.add(mesh);
});
VRMLLoader
О программе — VRML — это формат текстового файла, в котором, например, можно указать вершины и ребра для трехмерного многоугольника, а также цвет поверхности, текстуры с УФ-отображением, блеск, прозрачность и т. Д. URL-адреса могут быть связаны с графическими компонентами, чтобы веб-браузер мог получить веб-страницу или новый файл VRML из Интернета, когда пользователь нажимает на определенный графический компонент. Анимации, звуки, освещение и другие аспекты виртуального мира могут взаимодействовать с пользователем или могут запускаться внешними событиями, такими как таймеры. Специальный Script Node позволяет добавлять программный код (например, написанный на Java или ECMAScript) в файл VRML.
Для загрузки файлов WRL в three.js вы можете использовать следующий код:
// prepare WRL loader and load the model
var oWrlLoader = new THREE.VRMLLoader();
oWrlLoader.load('models/house.wrl', function(geometry) {
  lesson7.scene.add(geometry);
});
VTKLoader
Около— Visualization Toolkit (VTK) — это свободно доступная программная система с открытым исходным кодом для трехмерной компьютерной графики, обработки изображений и визуализации. VTK состоит из библиотеки классов C ++ и нескольких интерпретируемых уровней интерфейса, включая Tcl / Tk, Java и Python. Kitware, команда которой создала и продолжает расширять инструментарий, предлагает профессиональную поддержку и консультационные услуги для ВТК. VTK поддерживает широкий спектр алгоритмов визуализации, включая: скалярные, векторные, тензорные, текстурные и объемные методы; и передовые методы моделирования, такие как: неявное моделирование, сокращение полигонов, сглаживание сетки, вырезание, контур и триангуляция Делоне. ВТК имеет обширную инфраструктуру визуализации информации, имеет набор виджетов трехмерного взаимодействия, поддерживает параллельную обработку и интегрируется с различными базами данных с помощью наборов инструментов GUI, таких как Qt и Tk.VTK является кроссплатформенным и работает на платформах Linux, Windows, Mac и Unix. VTK также включает вспомогательную поддержку для 3D-виджетов взаимодействия, двух- и трехмерных аннотаций и параллельных вычислений. По своей сути VTK реализован как инструментарий C ++, требующий от пользователей создания приложений путем объединения различных объектов в приложение. Система также поддерживает автоматическую упаковку ядра C ++ в Python, Java и Tcl, так что приложения VTK также могут быть написаны с использованием этих интерпретируемых языков программирования.Система также поддерживает автоматическую упаковку ядра C ++ в Python, Java и Tcl, так что приложения VTK также могут быть написаны с использованием этих интерпретируемых языков программирования.Система также поддерживает автоматическую упаковку ядра C ++ в Python, Java и Tcl, так что приложения VTK также могут быть написаны с использованием этих интерпретируемых языков программирования.
Для загрузки файлов VTK в three.js вы можете использовать следующий код:
// prepare VTK loader and load the model
var oVtkLoader = new THREE.VTKLoader();
oVtkLoader.load('models/bunny.vtk', function(geometry) {
  geometry.computeVertexNormals();
  var material = new THREE.MeshLambertMaterial( { color:0xff4444, side: THREE.DoubleSide } );
  var mesh = new THREE.Mesh(geometry, material);
  mesh.position.set(0, 0, -15);
  mesh.scale.set(20, 20, 20);
  lesson7.scene.add(mesh);
});