ADN Open CIS
Сообщество программистов Autodesk в СНГ

29/04/2020

Пользовательские модели в Forge Viewer.

 

В нашей практике часто встречается вопрос внедрения произвольной пользовательской геометрии three.js в Forge Viewer. Мы обычно рекомендуем использовать scene overlays, а если Вы готовы к приключениям, то вы можете исследовать не нанесенные на карту территории viewer.impl.scene или viewer.impl.sceneAfter. Эти технологии работают — во Viewer прекрасно отображаются созданные Вами объекты с созданными Вами материалами. Но это, пожалуй и всё. В остальном, они не взаимодействуют с остальным функционалом Viewer-а. Вы не можете выбрать эти объекты, переместить камеру к ним, используя Viewer API и так далее. Но теперь команда Forge Viewer создала новое расширение Autodesk.Viewing.SceneBuilder, позволяющее преобразовать пользовательскую геометрию в «настоящие» модели viewer-а. Давайте посмотрим, как с ним работать!

 

Возможности нового расширения

Расширение Autodesk.Viewing.SceneBuilder позволяет на-лету создавать модели, аналогичные тем, которые Вы загружаете из сервиса Model Derivative. Это расширение не является заменой scene overlays, которые были упомянуты выше. Они по-прежнему больше подходят для некоторых сценариев, но объекты, создаваемые  Autodesk.Viewing.SceneBuilder ведут себя аналогично стандартным моделям Forge – вы можете взаимодействовать с ними как программно, так и с помощью пользовательского интерфейса.

Тем не менее, расширение в настоящий момент не поддерживает:

  • создание 2D моделей
  • создание свойств
  • создание дерева модели

Создание новой модели

После загрузки расширения, вызовите асинхронный метод addNewModel для того, чтобы создать новую Model и инициализировать ModelBuilder для неё:

Код - JavaScript: [Выделить]
  1. async function addModel(viewer) {
  2.   const sceneBuilder = await viewer.loadExtension('Autodesk.Viewing.SceneBuilder');
  3.   const modelBuilder = await sceneBuilder.addNewModel({
  4.     modelNameOverride: 'My Custom Model',
  5.     conserveMemory: false
  6.   });
  7.   // ...
  8. }

Примечание: значение conserveMemory (false по умолчанию) изменяет способ хранения геометрии создаваемого объекта. Если указать true, геометрия будет упакована в единый mesh.

Когда ModelBuilder создан, вы можете начать добавлять в созданную модель геометрию three.js

Добавление объектов

Есть несколько способов добавления геометрии в модель.

Первый способ — передать THREE.BufferGeometry, THREE.Material, и THREE.Transform в метод addFragment ModelBuilder-а, например:

Код - JavaScript: [Выделить]
  1. const sphereGeometry = new THREE.BufferGeometry().fromGeometry(new THREE.SphereGeometry(5, 8, 8));
  2. const sphereMaterial = new THREE.MeshPhongMaterial({ color: new THREE.Color(0, 1, 0) });
  3. const sphereTransform = new THREE.Matrix4().compose(
  4.   new THREE.Vector3(0, 0, 0),
  5.   new THREE.Quaternion(0, 0, 0, 1),
  6.   new THREE.Vector3(1, 1, 1)
  7. );
  8. const sphereFragId = modelBuilder.addFragment(sphereGeometry, sphereMaterial, sphereTransform);
  9. modelBuilder.changeFragmentsDbId(sphereFragId, 12345); // Используйте этот dbId в API Viewer-а как обычно

Второй способ — создать геометрию методом ModelBuilder.addGeometry и передать созданный ID геометрии, THREE.Material, и THREE.Transform в метод ModelBuilderaddFragment:

Код - JavaScript: [Выделить]
  1. const cylinderGeometry = new THREE.BufferGeometry().fromGeometry(new THREE.CylinderGeometry(5, 5, 10));
  2. const cylinderMaterial = new THREE.MeshPhongMaterial({ color: new THREE.Color(0, 0, 1) });
  3. const cylinderTransform = new THREE.Matrix4().compose(
  4.   new THREE.Vector3(+10, +10, 0),
  5.   new THREE.Quaternion(0, 0, 0, 1),
  6.   new THREE.Vector3(1, 1, 1)
  7. );
  8. const cylinderGeomId = modelBuilder.addGeometry(cylinderGeometry);
  9. const cylinderFragId = modelBuilder.addFragment(cylinderGeomId, cylinderMaterial, cylinderTransform);
  10. modelBuilder.changeFragmentsDbId(cylinderFragId, 12345); // Используйте этот dbId в API Viewer-а как обычно

Третий способ доступен, если модель была инициализирована со значением conserveMemory: false. В этом случае Вы можете передать THREE.Mesh в методModelBuilder.addMesh:

Код - JavaScript: [Выделить]
  1. const boxGeometry = new THREE.BufferGeometry().fromGeometry(new THREE.BoxGeometry(10, 10, 10));
  2. const boxMaterial = new THREE.MeshPhongMaterial({ color: new THREE.Color(1, 0, 0) });
  3. const boxMesh = new THREE.Mesh(boxGeometry, boxMaterial);
  4. boxMesh.matrix = new THREE.Matrix4().compose(
  5.   new THREE.Vector3(-10, -10, 0),
  6.   new THREE.Quaternion(0, 0, 0, 1),
  7.   new THREE.Vector3(1, 1, 1)
  8. );
  9. boxMesh.dbId = 12345; // Используйте этот dbId в API Viewer-а как обычно
  10. modelBuilder.addMesh(boxMesh);

Примечание: Вы также можете добавлять точки и линии. Убедитесь, что Вы передаёте экземпляр класса THREE.BufferGeometry со значениями isPoint или isLine установленными в  true.

 

Добавление материалов

В настоящее время Autodesk.Viewing.SceneBuilder-ом поддерживаются следующие типы материалов:

Вместо передачи материалов непосредственно в методы ModelBuilder, перечисленные выше, вы также можете зарегистрировать материал с уникальным именем и затем использовать это имя, например так:

Код - JavaScript: [Выделить]
  1. const myMaterial = new THREE.MeshPhongMaterial({ color: new THREE.Color(1, 1, 1) });
  2. modelBuilder.addMaterial('MyCustomMaterial', myMaterial);
  3. modelBuilder.addFragment(myGeometry, 'MyCustomMaterial', myTransform);

 

Другие операции

В классе ModelBuilder также есть дополнительные методы, с помощью которых Вы можете изменять созданные Вами модели, например:

Детальный обзор всем методов и их аргументов доступен по ссылке: https://forge.autodesk.com/en/docs/viewer/v7/reference/Extensions/ModelBuilder.

Интерактивное превью нового функционала доступно здесь.

 

Источник: https://forge.autodesk.com/blog/custom-models-forge-viewer

Автор перевода: Александр Игнатович
Опубликовано 29.04.2020