基於WebGL架構的3D視覺化平臺—三維裝置管理(ThingJS實現樓宇裝置管理3D視覺化)
國內高層建築不斷興建,它的特點是高度高、層數多、體量大。面積可達幾萬平方米到幾十萬平方米。這些建築都是一個個龐然大物,高高的聳立在地面上,這是它的外觀,而隨之帶來的內部的建築裝置也是大量的。為了提高裝置利用率,合理地使用能源,加強對建築裝置狀態的監視等,自然地就提出了樓宇自動化控制系統。下面我們將用ThingJS平臺來模擬一個裝置管理系統。
第一步,利用CampusBuilder搭建模擬場景。CampusBuilder的模型庫有各種各樣的模型,使我們搭建出的場景更逼真。使用CampusBuilde建立層級,之後再給層級加外立面就出現了當前的效果。詳情移步:CampusBuilder3D場景製作工具
先看結果:演示地址
第二步,建立Equipment類,這裡建立。switchControl方法主要一個完成一個計時器的功能來模擬裝置警報。
class Equipment extends THING.Thing { constructor(app, name, obj, url) { super(app); this.name = name; this.obj = obj; this.url = url; this.interval = null; this.localPosition = [Math.floor(Math.random() * 7), 2.9, Math.floor(Math.random() * 7)]; } createSelf() { app.create({ type: `Equipment`, name: this.name, url: this.url, parent: this.obj, localPosition: this.localPosition, angle: 0 }); } switchControl(ev) { var flag; var equipment = app.query(this.name)[0]; app.level.change(equipment); if (ev) { this.interval = setInterval(function () { if (flag) { equipment.style.color = `#FF0000`; flag = false; } else { flag = true; equipment.style.color = ``; } }, 500); console.log(this.interval + "檢視是否建立了定時器"); } else { console.log(this.interval); clearInterval(this.interval); if (equipment.style.color == `#FF0000`) equipment.style.color = ``; } } } THING.factory.registerClass(`Equipment`, Equipment);
第三步,建立攝像機皮膚,煙感報警皮膚以及控制裝置的開關,這裡簡單調整一下皮膚位置之後會增加兩個建立裝置的按鈕。
//建立主皮膚 var panel1 = new THING.widget.Panel({ titleText: `攝像機列表`, closeIcon: false, // 是否有關閉按鈕 dragable: true, retractable: true, opacity: 0.9, hasTitle: true, }); panel1.position = [80, 0]; var panel2 = new THING.widget.Panel({ titleText: `煙感報警列表`, closeIcon: false, // 是否有關閉按鈕 dragable: true, retractable: true, opacity: 0.9, hasTitle: true, }); panel2.position = [80, 320]; // 建立任意物件 var dataObj1 = { open1: false, open2: false, open3: false, open4: false, } var dataObj2 = { open5: false, open6: false, open7: false, open8: false, }; // 動態繫結物體 var open1 = panel1.addBoolean(dataObj1, `open1`).caption(`裝置01`); var open2 = panel1.addBoolean(dataObj1, `open2`).caption(`裝置02`); var open3 = panel1.addBoolean(dataObj1, `open3`).caption(`裝置03`); var open4 = panel1.addBoolean(dataObj1, `open4`).caption(`裝置04`); var open5 = panel2.addBoolean(dataObj2, `open5`).caption(`裝置01`); var open6 = panel2.addBoolean(dataObj2, `open6`).caption(`裝置02`); var open7 = panel2.addBoolean(dataObj2, `open7`).caption(`裝置03`); var open8 = panel2.addBoolean(dataObj2, `open8`).caption(`裝置04`);
第四步,開啟場景層級切換,建立攝像機和煙感報警器各四個,建立一個數字標識index和儲存equipment物件的陣列equipmentGroup。
//建立equipment物件陣列,以及陣列標識 var equipmentGroup = []; var index = 0; app.on(`load`, function (ev) { app.level.change(ev.campus); for (var i = 0; i < 8; i++) { var type = null; if (i < 4) { type = `http://model.3dmomoda.cn/models/62A8A75C75044E6AB3D8463FA0CB67AF/0/gltf/`; } else { type = `http://model.3dmomoda.cn/models/641A9B800DE5431E8C84DC290F8EFDE6/0/gltf/`; } var equipment = new Equipment(app, `equipment` + index++, app.query(`floor` + (Math.floor(Math.random() * 5) + 1))[0], type); equipment.createSelf(); equipmentGroup.push(equipment); } });
第五步,為每個裝置對應的建立控制開關。
open1.on(`change`, function (ev) { equipmentGroup[0].switchControl(ev); }); open2.on(`change`, function (ev) { equipmentGroup[1].switchControl(ev); }); open3.on(`change`, function (ev) { equipmentGroup[2].switchControl(ev); }); open4.on(`change`, function (ev) { equipmentGroup[3].switchControl(ev); }); open5.on(`change`, function (ev) { equipmentGroup[4].switchControl(ev); }); open6.on(`change`, function (ev) { equipmentGroup[5].switchControl(ev); }); open7.on(`change`, function (ev) { equipmentGroup[6].switchControl(ev); }); open8.on(`change`, function (ev) { equipmentGroup[7].switchControl(ev); });
最後一步,建立兩個按鈕來控制建立裝置。
new THING.widget.Button(`建立煙感報警`, function () { var type = `http://model.3dmomoda.cn/models/641A9B800DE5431E8C84DC290F8EFDE6/0/gltf/`; var equipment = new Equipment(app, `equipment` + index++, app.query(`floor` + (Math.floor(Math.random() * 5) + 1))[0], type,); equipment.createSelf(); equipmentGroup.push(equipment); app.level.change(app.query(equipment.name)[0]); }); new THING.widget.Button(`建立攝像頭`, function () { var type = `http://model.3dmomoda.cn/models/62A8A75C75044E6AB3D8463FA0CB67AF/0/gltf/`; var equipment = new Equipment(app, `equipment` + index++, app.query(`floor` + (Math.floor(Math.random() * 5) + 1))[0], type,); equipment.createSelf(); equipmentGroup.push(equipment); app.level.change(app.query(equipment.name)[0]); });
在編寫過程還是走了不少彎路的,最主要的就是計時器的解除安裝問題,最初的版本寫來寫去發現不能控制警報的關閉,後來才 發現計時器沒有解除安裝,警報不但不會關閉而且閃動的頻率越來越快。更改之後建立了Equipment這個類來控制所有裝置,通過建立這個類的物件給他賦id,父物體,模型地址。這裡控制器在開關被觸發的時候建立一個新的計時器並賦給的這個物件,再次觸發時清除這個計時器,警報的動畫就關閉了。演示地址
最後附上完整程式碼:
/** * 說明:建立App,url為場景地址(可選) */ var app = new THING.App({ url: "http://www.thingjs.com/./uploads/wechat/oLX7p05lsWJZUIxnIWsNXAzJ40X8/scene/CampusBuilder20181126134710", // 場景地址 "skyBox": "BlueSky" }); //建立主皮膚 var panel1 = new THING.widget.Panel({ titleText: `裝置列表`, closeIcon: false, // 是否有關閉按鈕 dragable: true, retractable: true, opacity: 0.9, hasTitle: true, titleImage: `https://www.thingjs.com/static/images/example/icon.png` }); panel1.position = [80, 0]; var panel2 = new THING.widget.Panel({ titleText: `裝置列表`, closeIcon: false, // 是否有關閉按鈕 dragable: true, retractable: true, opacity: 0.9, hasTitle: true, titleImage: `https://www.thingjs.com/static/images/example/icon.png` }); panel2.position = [80, 320]; // 建立任意物件 var dataObj1 = { open1: false, open2: false, open3: false, open4: false, } var dataObj2 = { open5: false, open6: false, open7: false, open8: false, }; // 動態繫結物體 var open1 = panel1.addBoolean(dataObj1, `open1`).caption(`裝置01`); var open2 = panel1.addBoolean(dataObj1, `open2`).caption(`裝置02`); var open3 = panel1.addBoolean(dataObj1, `open3`).caption(`裝置03`); var open4 = panel1.addBoolean(dataObj1, `open4`).caption(`裝置04`); var open5 = panel2.addBoolean(dataObj2, `open5`).caption(`裝置01`); var open6 = panel2.addBoolean(dataObj2, `open6`).caption(`裝置02`); var open7 = panel2.addBoolean(dataObj2, `open7`).caption(`裝置03`); var open8 = panel2.addBoolean(dataObj2, `open8`).caption(`裝置04`); new THING.widget.Button(`建立煙感報警`, function () { var type = `http://model.3dmomoda.cn/models/641A9B800DE5431E8C84DC290F8EFDE6/0/gltf/`; var equipment = new Equipment(app, `equipment` + index++, app.query(`floor` + (Math.floor(Math.random() * 5) + 1))[0], type,); equipment.createSelf(); equipmentGroup.push(equipment); app.level.change(app.query(equipment.name)[0]); }); new THING.widget.Button(`建立攝像頭`, function () { var type = `http://model.3dmomoda.cn/models/62A8A75C75044E6AB3D8463FA0CB67AF/0/gltf/`; var equipment = new Equipment(app, `equipment` + index++, app.query(`floor` + (Math.floor(Math.random() * 5) + 1))[0], type,); equipment.createSelf(); equipmentGroup.push(equipment); app.level.change(app.query(equipment.name)[0]); }); //建立equipment物件陣列,以及陣列標識 var equipmentGroup = []; var index = 0; app.on(`load`, function (ev) { app.level.change(ev.campus); for (var i = 0; i < 8; i++) { var type = null; if (i < 4) { type = `http://model.3dmomoda.cn/models/62A8A75C75044E6AB3D8463FA0CB67AF/0/gltf/`; } else { type = `http://model.3dmomoda.cn/models/641A9B800DE5431E8C84DC290F8EFDE6/0/gltf/`; } var equipment = new Equipment(app, `equipment` + index++, app.query(`floor` + (Math.floor(Math.random() * 5) + 1))[0], type); equipment.createSelf(); equipmentGroup.push(equipment); } open1.on(`change`, function (ev) { equipmentGroup[0].switchControl(ev); }); open2.on(`change`, function (ev) { equipmentGroup[1].switchControl(ev); }); open3.on(`change`, function (ev) { equipmentGroup[2].switchControl(ev); }); open4.on(`change`, function (ev) { equipmentGroup[3].switchControl(ev); }); open5.on(`change`, function (ev) { equipmentGroup[4].switchControl(ev); }); open6.on(`change`, function (ev) { equipmentGroup[5].switchControl(ev); }); open7.on(`change`, function (ev) { equipmentGroup[6].switchControl(ev); }); open8.on(`change`, function (ev) { equipmentGroup[7].switchControl(ev); }); }); class Equipment extends THING.Thing { constructor(app, name, obj, url) { super(app); this.name = name; this.obj = obj; this.url = url; this.interval = null; } createSelf() { app.create({ type: `Equipment`, name: this.name, url: this.url, parent: this.obj, localPosition: [Math.floor(Math.random() * 7), 2.9, Math.floor(Math.random() * 7)], angle: 0 }); } switchControl(ev) { var flag; var equipment = app.query(this.name)[0]; app.level.change(equipment); if (ev) { this.interval = setInterval(function () { if (flag) { equipment.style.color = `#FF0000`; flag = false; } else { flag = true; equipment.style.color = ``; } }, 500); console.log(this.interval + "檢視是否建立了定時器"); } else { console.log(this.interval); clearInterval(this.interval); if (equipment.style.color == `#FF0000`) equipment.style.color = ``; } } } THING.factory.registerClass(`Equipment`, Equipment);
相關文章
- 基於 HTML5 的 WebGL 樓宇自控 3D 視覺化監控HTMLWeb3D視覺化
- 基於 WebGL 的 HTML5 樓宇自控 3D 視覺化監控WebHTML3D視覺化
- 什麼是裝置運營管理平臺(視覺化管理平臺的功能及優勢)視覺化
- 基於WebGL的三維交通監控視覺化技術應用(實踐版) ThingJSWeb視覺化JS
- 基於 WebGL 3D 的 HTML5檔案館視覺化管理系統Web3DHTML視覺化
- 基於 HTML5 的 WebGL 3D 檔案館視覺化管理系統HTMLWeb3D視覺化
- 【智慧裝置】智慧工廠如何運用視覺化進行裝置管理視覺化
- 流水線三維視覺化運維,裝配自動化提質增效 | 裝置產線管理合集視覺化運維
- WebGL入門之基於WebGL的3D視覺化引擎介紹Web3D視覺化
- 基於 WebGl HTML5 的 3D 視覺化機房WebHTML3D視覺化
- API視覺化管理平臺YApiAPI視覺化
- 基於 HTML5 WebGL 的 3D 風機視覺化系統HTMLWeb3D視覺化
- 基於 WebGL 的 HTML5 3D 工控隧道視覺化系統WebHTML3D視覺化
- 基於 HTML5 WebGL 的挖掘機 3D 視覺化應用HTMLWeb3D視覺化
- 基於 HTML5 WebGL + WebVR 的 3D 虛實現實視覺化培訓系統HTMLWebVR3D視覺化
- 3D視覺化|疫情態勢視覺化3D視覺化
- 藉助WebGL三維視覺化技術檢索3D動態影像Web視覺化3D
- 基於 HTML5 的 WebGL 3D 地鐵站視覺化系統HTMLWeb3D視覺化
- 基於 HTML5 WebGL 的加油站 3D 視覺化監控HTMLWeb3D視覺化
- 基於 HTML5 + WebGL 的無人機 3D 視覺化系統HTMLWeb無人機3D視覺化
- 基於 HTML5 + WebGL 的太陽系 3D 視覺化系統HTMLWeb3D視覺化
- 基於 HTML5 WebGL 的發動機 3D 視覺化系統HTMLWeb3D視覺化
- 基於 HTML5 WebGL 的地鐵站 3D 視覺化系統HTMLWeb3D視覺化
- YApi視覺化介面管理平臺部署API視覺化
- 基於裝置監控運維管理平臺實現預測性維護運維
- 3D視覺化打造智慧工廠數字化管理3D視覺化
- 智慧物流 3D 視覺化——構建一體化監管平臺3D視覺化
- 綠色數字園區運維:一屏群集 3D 視覺化智慧樓宇運維3D視覺化
- 賦予樓宇“智慧大腦”:廈門雙子塔3D視覺化3D視覺化
- 智慧風電 | 圖撲軟體數字孿生風機裝置,3D 視覺化智慧運維3D視覺化運維
- 資料視覺化助你提早發現裝置存在的隱患視覺化
- 成都市 3D視覺化 智慧樓宇(智慧園區) H5 WebGL 開發總結(skycto JEEditor)3D視覺化H5Web
- 基於 HTML5 + WebGL 的 3D 風力發電場視覺化系統HTMLWeb3D視覺化
- 數字孿生智慧儲能電站三維視覺化管理平臺視覺化
- ThingJS如何為低門檻3D視覺化開發賦能JS3D視覺化
- 虛擬現實 VR + 3D 視覺化,打造一體化高階管控平臺VR3D視覺化
- 基於數字孿生+視覺化技術的智慧充電站視覺化運維平臺方案視覺化運維
- linux 上部署 YApi 視覺化介面管理平臺LinuxAPI視覺化