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

28/12/2018

Просмотр модели по этажам c помощью альтернативной реализации функции "разбить модель"

Посмотреть пример реализации можно здесь.

Мне недавно задали вопрос "есть ли способ просмотра модели здания, созданной в Revit в случае, если этажи в модели никак не помечены?". Так у меня получился пример "разбить по этажам", который состоит из следующих компонентов:

1. Функция "разбить модель" (explode), управляемая слайдером

2. Управление скоростью ForgeViewer Camera

3. Простая анимация

4. Восстановление 4 состояний объекта camera

1. Альтернативная реализация функции Explode для моделей AEC / зданий.

Я немножко переделал код функции explode из этой статьи, ограничив преобразования координат только по вертикали, затем я объединил объекты по уровням. Протестировать эту функциональность можно с помощью слайдера.

Основной код:

Код - JavaScript: [Выделить]
  1. var cz = Math.floor(boxes[box_offset + 2] / 10) * 10;
  2. pt.z = cz * scale * 4;
  3. fragList.updateAnimTransform(fragId, null, null, pt);

2. Управление скоростью ForgeViewer Camera

Мы можем управлять скоростью камеры с помощью этих 2 строк кода:

Код - JavaScript: [Выделить]
  1. viewer.autocam.shotParams.destinationPercent=3;
  2. viewer.autocam.shotParams.duration = 3;

3. Простая анимация разбиения модели по уровням

Затем мне нужно было добавить плавную анимацию. За основу я взял этот пример, и реализовал алгоритм метода onSlider().

Код - JavaScript: [Выделить]
  1. // animate.js
  2. function circ(timeFraction) { return 1 - Math.sin(Math.acos(timeFraction)) }
  3.  
  4. function makeEaseOut(timing) { return function(timeFraction) {return 1 - timing(1 - timeFraction)}}
  5.  
  6. function animate({timing, draw, duration}) {
  7.   let start = performance.now();
  8.   requestAnimationFrame(function animate(time) {
  9.     let timeFraction = (time - start) / duration;
  10.     if (timeFraction > 1) timeFraction = 1;
  11.     let progress = timing(timeFraction);
  12.     draw(progress);
  13.     if (timeFraction < 1) {
  14.       requestAnimationFrame(animate);
  15.     }
  16.   });
  17. }

4. Восстановление состояний камеры

Этот трюк я уже проделывал несколько раз раньше.

Настройте камеру и скройте ненужные на сцене объекты вручную, затем сохраните состояние:

Код - JavaScript: [Выделить]
  1. view_state_level1 = viewer.getState()

Затем добавьте кнопки в меню, по нажатию которых Вы будете восстанавливать сохраненное состояние камеры примерно так:

Код - JavaScript: [Выделить]
  1. viewer.restoreState(view_state_level1)

Я объединил 4 состояния в массиве vstates и переключаюсь между ними.

Посмотреть пример реализации можно здесь.

Исходный код доступен на GitHub.

Источник: https://forge.autodesk.com/blog/view-each-floor-using-vertical-explode

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

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 28.12.2018