Система управления трехмерными визуальными архивами на основе WebGL

HTML
Система управления трехмерными визуальными архивами на основе WebGL

предисловие

Система управления файлами представляет собой полную платформу службы обмена информацией о файловых ресурсах, которая регулирует все управление файлами, устанавливая единый стандарт, включая стандартизацию управления файлами каждой бизнес-системы, и в основном реализует функцию сбора файлового потока. Обеспечить комплексное решение для современного управления файлами предприятий и учреждений.Система управления файлами может быть автономной системой, предоставляющей пользователям полные функции управления файлами и сетевых запросов, а также может быть объединена с офисной автоматизацией OA подразделения и Управление процессом проектирования DPM или в сочетании с системой управления информацией MIS для формирования более полной современной сети управления информацией. С быстрым развитием и изменением общества традиционные архивы также претерпели огромные изменения в своих внутренних формах и постепенно превратились в современные интеллектуальные архивы. Опираясь на современные технологии, Smart Archives полностью сочетает в себе современные технологии Интернета вещей и технологии облачных вычислений для создания полного городского интеллектуального архива, реализуя цель комплексного управления в современном обществе. В этой статье основное внимание уделяется популярной в настоящее время технологии H5 и предоставляется набор веб-решений для современных интеллектуальных архивов.


Код

Построение сцены

В этом примере компоненты пользовательского интерфейса HT будут использоваться для реализации макета страницы; RelativeLayout будет использоваться для разделения страницы на три части: слева, сверху, по центру, а вертикальный макет VBoxLayout будет использоваться для разделения ЛЕВОЙ часть на три части: логотип, редактор и диаграмма.


Graph3dView загружает 3D-сцену

Graph3dView — это компонент топологии для загрузки 3D-моделей в компоненты HT, RelativeLayout — это решение пользовательского интерфейса, предоставляемое HT, а компоненты HTView предоставляются в компонентах пользовательского интерфейса для реализации интеграции топологии и пользовательского интерфейса.

    // 初始化相对布局器
    var relativeLayout = new ht.ui.RelativeLayout();
    // 初始化 3D 拓扑
    var g3dView = new ht.graph3d.Graph3dView();
    // 初始化 HTVIEW 组件, 并将 3D 拓扑放入其中
    var htView = new ht.ui.HTView(g3dView);
    // 布局器加载 HTVIEW 组件
    relativeLayout.addView(htView, {
        width: 'match_parent',  // 填满
        height: 'match_parent', // 填满
        marginTop: 64,            // 为 TOP 留下空间
        marginLeft: 250            // 为 LEFT 留下空间  });

Создайте модель портфеля в LEFT

Раздел РЕДАКТОР слева использует компонент палитры HT (ht.widget.Palette), чтобы добавить портфолио в палитру и сделать его перетаскиваемым:
  var palette = new ht.widget.Palette();
    // palette 面板是将图元都分在“组”里面,然后向“组”中添加图元即可
    var group = new ht.Group();
    // 设置分组为打开的状态
    group.setExpanded(true);
    // 设置组的说明
    group.setName('基础图元');
    palette.dm().add(group);
    
    // 添加子图元
    var childNode = new ht.Node();
    childNode.setParent(group);
    childNode.setName(name);
    childNode.setImage(image);
    childNode.s({
        'draggable': true,                     // true 为可拖拽 
        'image.stretch': 'centerUniform'    // 图片申展方式
    });
    palette.dm().add(childNode);

Позволяет перетаскивать примитивы из палитры в 3D-сцену.

На предыдущем шаге мы установили свойства перетаскивания примитивов в палитре, и в это время может быть реализована анимация перетаскивания примитивов. Однако нельзя перетаскивать примитивы прямо в 3D-сцену.Идея реализации такова:

1. Получите информацию о перетаскиваемом примитиве при перетаскивании
2. При перетаскивании в соответствующую позицию будет отображаться доступная позиция.
3. Создайте соответствующую 3D-модель в соответствующем месте после перетаскивания.

Соответствующий код реализован следующим образом:

Получить примитивную информацию при перетаскивании
g3dView.getView().addEventListener('dragover', function(e) {
        e.preventDefault();
        var paletteNode = palette.dm().sm().ld();// 获取 palette 上最后选中的节点 
        if (!paletteNode || !g3d.getDataAt(e)) return;
        
        // 获取鼠标下的节点
        var data = g3d.getDataAt(e);
        if (data.s('shape3d') === '档案柜.json') {
            // 记录文件袋拖拽到的是哪个档案柜
            g3dView._focusData = data;
        }

    });

3D-модель создается при перетаскивании в соответствующую позицию.В реальном процессе реализации сложно точно получить координаты положения каждой папки в картотеке, поэтому в данном примере используется предустановленный метод. Конкретный принцип заключается в том, чтобы сначала создать обычную модель невидимого картотеки и поместить в нее все пакеты с файлами. предустановленная модель под курсором мыши, вы можете узнать, может ли там быть создана 3D-модель.Эффект выглядит следующим образом:




g3dView.getView().addEventListener('dragover', function(e) { 
        ... // 旧逻辑省略
        
        // 拖拽下来的时候设置 所有的 displayName 为 box 的节点 为可见 (这样拖拽才能获取到预置模型)
        array.forEach(function(data) {
            data.s('3d.visible', true);
        });

        var data = g3d.getDataAt(e);
        if (data.s('shape3d') === '档案柜.json') {
            // 记录文件袋拖拽到的是哪个档案柜
            g3dView._focusData = data;

            // 将预置模型移动到拖拽的柜子坐标
            shelf.p3(data.p3());
        }

        if(data.getDisplayName() === 'box') {
            // 将对应坐标下预置的档案袋模型进行显示
            // 该属性可修改模型的透明度,更多属性可参考 HT 风格手册
            data.s('shape3d.opacity',  0.8);
        }
        ...
    })
    
    g3dView.getView().addEventListener('drop', function(e) {
        // 获取鼠标位置模型    
        var data = g3dView.getDataAt(e);
        if(!data) return;
        // 鼠标位置不是预置模型,直接跳过
        if(data.getDisplayName() !== 'box') return;
        data.s('shape3d.opacity', 0);
        // 放手时候设置 所有的 displayName 为 box 的节点 不可见
        array.forEach(function(data) {
            data.s('3d.visible', false);
        });

        var node = new ht.Node();
        node.s('shape3d', url); // 档案袋 3D 模型地址
        node.r3([Math.PI/2, -Math.PI/2, 0]); // 旋转档案袋模型, 使其平放
        node.p3(data.p3());
        node.setParent(g3dView._focusData);
        node.setHost(g3dView._focusData);
    });

Эффект размытия картотеки

Мы добились эффекта перетаскивания портфолио на 3D-сцену выше, но можем обнаружить, что модель портфолио намного меньше шкафа, и разместить портфолио в правильном положении не так просто. Так что в это время мы можем увеличить картотеку, которой нужно управлять, к центру, а другие модели можно размыть.



  // 3D 拓扑交互监听
    g3dView.mi(function(e){
        if(e.kind === 'doubleClickData') {
            // 双击事件
            var shape3d = e.data.s('shape3d'),
                parentShape3d = e.data.getParent() && e.data.getParent().s('shape3d');
            if (shape3d && shape3d.indexOf('档案柜') > -1) {
                // 重点突出档案柜
                showDetail(e.data);
            }
            else if (parentShape3d && parentShape3d.indexOf('档案柜') > -1) {
                showDetail(e.data.getParent());
            }
        }
    });

    showDetail = function(data) {
        // 保存进入虚化状态前 视角 与 中心点
        eyeBack = ht.Default.clone(graph3dView.getEye());
        centerBack = ht.Default.clone(graph3dView.getCenter());
    
        // 设置相机指向配置
        var opt = {};
        opt.animation = true;
        opt.ratio = 1;
        opt.direction = [1, 0.5, 0];
        opt.center = [data.getX(), 100, data.getY()];

        graph3dView.flyTo(data, opt);
        focusData = data;

        data.s('select.brightness', 1);
        dataModel.each(function (d) {
            if (d === focusData || (!d.s('3d.selectable') && d.getTag() !== 'wall')
                || d.getParent() === focusData || d.getDisplayName() === 'box') return;
            // 将拓扑中除了要操作的柜子 与柜子中档案袋 以及墙外 透明度都设置为 opacity (0~1)
            
            // 保存设置前配置, 还原用
            if (!opacityMap[d.getId()]) {
                opacityMap[d.getId()] = {
                    'shape3d.opacity': d.s('shape3d.opacity'),
                    'shape3d.transparent': d.s('shape3d.transparent'),
                    'all.opacity': d.s('all.opacity'),
                    'all.transparent': d.s('all.transparent'),
                    'left.opacity': d.s('left.opacity'),
                    'left.transparent': d.s('left.transparent'),
                    'right.opacity': d.s('right.opacity'),
                    'right.transparent': d.s('right.transparent'),
                    'front.opacity': d.s('front.opacity'),
                    'front.transparent': d.s('front.transparent'),
                    'back.opacity': d.s('back.opacity'),
                    'back.transparent': d.s('back.transparent'),
                    'top.opacity': d.s('top.opacity'),
                    'top.transparent': d.s('top.transparent'),
                    'bottom.opacity': d.s('bottom.opacity'),
                    'bottom.transparent': d.s('bottom.transparent'),
                    '3d.selectable': d.s('3d.selectable')
                }
            }
            
            // 透明度设置为 opacity
            d.s({
                'shape3d.opacity': opacity,
                'shape3d.transparent': true,
                'all.opacity': opacity,
                'all.transparent': true,
                'left.opacity': opacity,
                'left.transparent': true,
                'right.opacity': opacity,
                'right.transparent': true,
                'front.opacity': opacity,
                'front.transparent': true,
                'back.opacity': opacity,
                'back.transparent': true,
                'top.opacity': opacity,
                'top.transparent': true,
                'bottom.opacity': opacity,
                'bottom.transparent': true,
                '3d.selectable': false
            });

        });
    }

Выйдите из режима боке, чтобы отслеживать выбранные изменения в 3D-топологии.
     g3dView.dm().ms(function(e) {
        var lastData = g3dView.sm().ld();
        // 判断是否进行虚化
        if(focusData) {
            if(lastData === focusData || (lastData && lastData.getParetn() === focusData)) return;
            g3dView.setEye(eyeBack);
            g3dView.setCenter(centerBack);
            // 还原模型的原透明度
            g3dView.dm().each(function (d) {
                if (d === focusData) return;
                d.s(opacityMap[d.getId()]);
            });
            
            focusData.s('select.brightness', 0.7);
            focusData = null;
            eyeBack = null;
            centerBack = null;
        }
    });

Реализация функции быстрого запроса

В компонентах HT есть плагин быстрого запроса QuickFinder, на этот раз мы будем использовать этот плагин для реализации простого запроса номера файла.
  // 初始化 输入框
    var textField = new ht.ui.TextField;
    textField.setIcon("imgs/search.json");
    textField.setIconPosition("left");

    // 初始化查询器,条件:id
    var finder = new ht.QuickFinder(library.view.dm, "id");
    // 输入框点击查询按钮时触发
    textField.on('p:value', function(e) {
        var dm = library.view.dm;
        var value = e.newValue;
        var datas = finder.find(value);
        // 查询到对应的图元时,我们将第一个结果进行选中
        if (datas && datas.size() > 0) {
            library.view.dm.sm().ss(datas.get(0));
        }
    });

Суммировать

После реализации вышеперечисленных функций формируется базовая интеллектуальная система управления файлами. Конечно, в качестве интеллектуальной системы управления их еще далеко не достаточно, например, динамический мониторинг архивов, мониторинг перемещения персонала в архивах, видеомониторинг, мониторинг температуры, оповещение о стихийных бедствиях и другие модули — все это области, которые могут быть улучшены на более позднем этапе. Вот простое 3D-решение на основе HTML5 WEBGL для всех. По этому же принципу могут быть реализованы и умные здания, и умные компьютерные залы, и умные города.

Окончательный эффект можно посмотреть:высокий topo.com/demo/Intel Ling…