Просмотр модели по этажам c помощью альтернативной реализации функции "разбить модель"
Посмотреть пример реализации можно здесь.
Мне недавно задали вопрос "есть ли способ просмотра модели здания, созданной в Revit в случае, если этажи в модели никак не помечены?". Так у меня получился пример "разбить по этажам", который состоит из следующих компонентов:
1. Функция "разбить модель" (explode), управляемая слайдером
2. Управление скоростью ForgeViewer Camera
3. Простая анимация
4. Восстановление 4 состояний объекта camera
1. Альтернативная реализация функции Explode для моделей AEC / зданий.
Я немножко переделал код функции explode из этой статьи, ограничив преобразования координат только по вертикали, затем я объединил объекты по уровням. Протестировать эту функциональность можно с помощью слайдера.
Основной код:
- var cz = Math.floor(boxes[box_offset + 2] / 10) * 10;
- pt.z = cz * scale * 4;
- fragList.updateAnimTransform(fragId, null, null, pt);
2. Управление скоростью ForgeViewer Camera
Мы можем управлять скоростью камеры с помощью этих 2 строк кода:
- viewer.autocam.shotParams.destinationPercent=3;
- viewer.autocam.shotParams.duration = 3;
3. Простая анимация разбиения модели по уровням
Затем мне нужно было добавить плавную анимацию. За основу я взял этот пример, и реализовал алгоритм метода onSlider().
- // animate.js
- function circ(timeFraction) { return 1 - Math.sin(Math.acos(timeFraction)) }
- function makeEaseOut(timing) { return function(timeFraction) {return 1 - timing(1 - timeFraction)}}
- function animate({timing, draw, duration}) {
- let start = performance.now();
- requestAnimationFrame(function animate(time) {
- let timeFraction = (time - start) / duration;
- if (timeFraction > 1) timeFraction = 1;
- let progress = timing(timeFraction);
- draw(progress);
- if (timeFraction < 1) {
- requestAnimationFrame(animate);
- }
- });
- }
4. Восстановление состояний камеры
Этот трюк я уже проделывал несколько раз раньше.
Настройте камеру и скройте ненужные на сцене объекты вручную, затем сохраните состояние:
- view_state_level1 = viewer.getState()
Затем добавьте кнопки в меню, по нажатию которых Вы будете восстанавливать сохраненное состояние камеры примерно так:
- 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