Наши уроки по 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); });