91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

HTML5的WebGL3D檔案館圖書可視化管理系統的實現方法

發布時間:2020-10-22 16:01:44 來源:億速云 閱讀:302 作者:小新 欄目:web開發

小編給大家分享一下HTML5的WebGL3D檔案館圖書可視化管理系統的實現方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

前言

檔案管理系統是通過建立統一的標準以規范整個文件管理,包括規范各業務系統的文件管理的完整的檔案資源信息共享服務平臺,主要實現檔案流水化采集功能。為企事業單位的檔案現代化管理,提供完整的解決方案,檔案管理系統既可以自成系統,為用戶提供完整的檔案管理和網絡查詢功能,也可以與本單位的OA辦公自動化和DPM設計過程管理,或者與MIS信息管理系統相結合,形成更加完善的現代化信息管理網絡。傳統檔案館隨著社會的快速發展與變化,其內在形式上也發生了巨大變化,逐漸演變為現代智慧檔案館。智慧檔案館以現代科技為依托,充分結合現代物聯網技術與云計算技術構建完善的城市智慧檔案,實現了現代社會全面管理的目標。本文以當前流行的 H5 技術為主,為現代智慧檔案館提供一套 WEB 解決方案。

代碼實現

場景搭建

在本例中,將使用 HT UI 組件對頁面實現布局;使用 RelativeLayout 相對布局器將頁面分為三個部分:left, top, center,使用 VBoxLayout 縱向布局器將 LEFT 部分分為 logo,editor,chart 三個部分

HTML5的WebGL3D檔案館圖書可視化管理系統的實現方法

Graph4dView 加載 3D 場景

Graph4dView 是 HT 組件中加載 3D 模型的拓撲組件,RelativeLayout 則是 HT 提供的 UI 解決方案,UI 組件中提供 HTView 組件來實現拓撲與 UI 的融合。

// 初始化相對布局器
var relativeLayout = new ht.ui.RelativeLayout();
// 初始化 3D 拓撲
var g3dView = new ht.graph4d.Graph4dView();
// 初始化 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 中的檔案袋模型

左側的 EDITOR 部分使用 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 模型,實現效果如下:

HTML5的WebGL3D檔案館圖書可視化管理系統的實現方法

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(graph4dView.getEye());
    centerBack = ht.Default.clone(graph4dView.getCenter());

    // 設置相機指向配置
    var opt = {};
    opt.animation = true;
    opt.ratio = 1;
    opt.direction = [1, 0.5, 0];
    opt.center = [data.getX(), 100, data.getY()];

    graph4dView.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));
    }
});

看完了這篇文章,相信你對HTML5的WebGL3D檔案館圖書可視化管理系統的實現方法有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

富源县| 大邑县| 西安市| 南投县| 五莲县| 丹棱县| 安丘市| 景谷| 岫岩| 高台县| 阳谷县| 佛学| 衡山县| 航空| 休宁县| 兴山县| 柏乡县| 平湖市| 西昌市| 杭锦后旗| 怀远县| 元谋县| 大城县| 宜都市| 水富县| 吉隆县| 论坛| 托里县| 比如县| 宜川县| 云安县| 师宗县| 赤壁市| 晋江市| 满洲里市| 甘德县| 梅州市| 喀喇沁旗| 津南区| 永州市| 牙克石市|