翼度科技»论坛 编程开发 JavaScript 查看内容

如何基于three.js(webgl)引擎架构,研发一套通过配置就能自动生成的3D机房

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
序:
  这几年观察下来,大部分做物联网三维可视化解决方案的企业或个人, 基本都绕不开3D机房。包括前面也讲过这样的案例《使用webgl(three.js)创建自动化抽象化3D机房,3D机房模块详细介绍(抽象版一)》  《 使用webgl(three.js)创建科技版3D机房,3D机房微模块详细介绍(升级版三)—— 1》
  随着技术的快速发展,机房的数量和规模也在不断扩大。然而,传统的数据中心管理方式已经无法满足现代社会的需求。在这种情况下,3D机房数据中心应运而生。
  顾名思义,三维机房数据中心是指利用三维仿真技术,将数据中心的空间信息、设备信息、人员流动信息等各类信息集成在三维模型中,实现数据中心的全面可视化。这种新型的数据中心管理方式,能够提高管理效率,降低运营成本,提升数据中心的可靠性。
  但是,三维机房解决方案已经发展了好多年,逃不开建模,数据连接,个性化定制。一个机房项目,开发周期长,研发成本高。不说如何颠覆一下这部分行业应用,也得想想如何提升一下效率。
  综述,低代码模式的三维机房解决方案呼之欲出。当然还是基于three.js(webgl)引擎架构
  我们还是闲话少叙,切入正题。
前言:
  首先,我们要确定目标与需求。
  目标:低代码生成三维机房系统。
     全套完备的三维数据中心系统,目标任务过于繁重,所以先得将目标切割,先完成低代码模式下的单个机房或者是微模块的前端三维方案。这就符合了自我效能理论,分割事务,及时得到正向反馈,不断完成小目标,看到成效,最终才能做出结果。
  需求:通过上面的目标分割,我们可以简单概述出需求。简单一句话,通过配置,快速生成3D机房,包括其常用的业务逻辑。
  这里我们明确了包含常用业务逻辑,而个性化特殊化的业务需求我们可以在完成这部分后,基于现有系统做叠加与拓展。为了方便拓展,先用简易系统要考虑到合理性与延续性。
   综上所述,我们要做一个通过简单配置即可自动生成一个3D机房前端系统。后续我们再通过做一个工具,通过工具拖拉拽来代替写配置这一步。
技术交流 1203193731@qq.com
交流微信:
    

如果你有什么要交流的心得 可邮件我
一、效果展示
1.1、机房效果
通过简单配置生成一个带有微模块、单排柜以及动环设备的机房模型
 

 
根据数据自动生成机柜内部设备

 
 
1.2、json配置
  分析行业需求,提炼配置信息
  房间建筑:长宽高属性,以及门窗属性。这里必须且必要省掉墙的皮肤属性、不规则房间特性等等
  设备:类型、位置,尺寸、关联数据id、这里要放弃设备细节。考虑的越多,越不容易完成目标
  通过上面分析,我们可以基本得出一个简单的配置信息
  1.2.1、建筑房间配置:
 

 
 
  1.   {
  2.         "type": "wall",
  3.         "name": "wall_4", //名称
  4.         "size": {
  5.           "x": 8000, //墙长度
  6.           "z": 100, //墙厚度
  7.           "y": 1000 //墙体高度
  8.         }, //墙的起始点位置
  9.         "startPosition": { //墙体的起始位置 默认是墙体的左下角
  10.           "x": -4000,
  11.           "y": 0,
  12.           "z": 2700
  13.         },
  14.         "doorHoles": [ //门
  15.           {
  16.             "id": "door_001",//门禁设备id
  17.             "type": 2, //0 x方向单门 1 x反方向单门 2 双门 3表示窗户洞
  18.             "start": 400, //相对于尺寸参数的x 离0多长 比如400 表示门洞离x 0点400
  19.             "width": 600, //门洞宽
  20.             "height": 700, //门洞高
  21.             "thickness": 40 //门厚度
  22.           },
  23.           {
  24.             "type": 3,
  25.             "start": 2600,
  26.             "width": 2000,
  27.             "height": 700,
  28.             "rideHeight": 100, //窗户离墙的底边高度
  29.             "thickness": 10 //窗的厚度
  30.           }
  31.         ],
  32.       },
复制代码
  1.2.2、机柜配置
  a、冷通道配置

 
  1. {
  2.         "id": "101", //冷通道id 唯一
  3.         "type": "minRoom", //冷通道类型
  4.         "dataId": "101", //数据id 唯一
  5.         "position": { //冷通道位置 是指冷通道中心点在场景中的位置
  6.           "x": -2000,
  7.           "y": 0,
  8.           "z": 0
  9.         },
  10.         "rotationDir": "Z", //冷通道门对准的方向 X 表示坐标系x轴方向 Z表示坐标系z方向
  11.         "rackLength": 9, //冷通道单边机柜的个数
  12.         "children": [//冷通道内设备
  13.           {
  14.             "id": "1_1", //设备id
  15.             "type": "ljkt", //设备类型 取值范围:ljkt ltg rack 分别表示列间空调  列头柜  机柜
  16.             "dataId": "1_1", //数据id
  17.             "row": "1", //表示在冷通道哪一排 取值1或者2 在第一排 或者第二排
  18.             "col": "1", //表示在某排第几个
  19.             "width": 0.5//占用宽度比例
  20.           },
  21.          ]
  22.         ..........
  23.       },
复制代码
  b、单排柜配置

 
  1.   {
  2.         "id": "1_1", //机柜id 自定义 唯一性 建议跟数据库资产id保持一致
  3.         "type": "rack", //类型
  4.         "name": "rack_1_1", //机柜模型名称 唯一性
  5.         "dataId": "1_1", //机柜数据id 这里是指数据库存储的机柜资产id
  6.         "position": { //机柜位置 是指机柜中心点在场景中的位置
  7.           "x": -2550,
  8.           "y": 450,
  9.           "z": 1315
  10.         },
  11.       }
复制代码
  1.2.3、设备配置
 

 
 
  1. { //温湿度传感器
  2.         "type": "wdcgq",//设备类型
  3.         "id": "2",//id 保持全局唯一
  4.         "dataId": "wd1",//数据id
  5.         "position": {//模型中心点在场景中的位置
  6.           "x": 0,
  7.           "y": 1200,
  8.           "z": 0
  9.         },"scale": {//缩放 所有值不可为0
  10.           "x": 1,
  11.           "y": 1,
  12.           "z": 1
  13.         }
  14.       }
复制代码
1.3、业务逻辑
上面的配置,机房模型已经生成,接下来就是基于模型与数据,生成功能逻辑
例如、利用率、温度云图、承重、告警等等
 

 温度云图

 承重、功耗

 
二、代码解析
2.1、合理封装
 封装分为两部分
第一部分是模型封装,更加不同类型 以及属性生成模型/

例如:
  1. <em id="__mceDel">  * 创建普通地板
  2.   * @param {any} name  名称  floor
  3.   * @param {any} size  尺寸 {x:8000,z:5000,y:100} 长 宽 厚
  4.   * @param {any} CenterPosition 中心点位置  {x:0,z:-60,y:0}
  5.   * @param {any} rotation 旋转  {x:0,y:0,z:0} 角度用
  6.   */
  7. function createFloor(name, size, CenterPosition, rotation) {
  8.    ......
  9.     return model;
  10. }
  11. /**
  12.   * 创建机房空气地板
  13.   * @param {any} name  名称  floor
  14.   * @param {any} size  尺寸 {x:8000,z:5000,y:100} 长 宽 厚
  15.   * @param {any} CenterPosition 中心点位置  {x:0,z:-60,y:0}
  16.   * @param {any} rotation 旋转  {x:0,y:0,z:0} 角度用
  17.   */
  18. function createDataCenterFloor(name, size, CenterPosition, rotation) {
  19.     ......
  20.     return model;
  21. }
  22. /**
  23. * 创建墙体
  24. * @param {any} name 名称 wall_4
  25. * @param {any} size 尺寸{x:8000,z:100,y:1000} 长 厚 高
  26. * @param {any} startPosition 起始点位置 { "x": -4858.313, "y": 0, "z": 1264.35 }
  27. * @param {any} doorHoles 门洞  [
  28.                                     {
  29.                                         type:2 ,//0 x方向单门 1 x反方向单门 2 双门 3窗户
  30.                                         start: 400,//相对于尺寸参数的x 离0多长 比如400 表示门洞离x 0点400
  31.                                         width:600,//门洞宽
  32.                                         height:700,//门洞高
  33.                                         thickness:40,//门洞厚度
  34.                                         rideHeight:100//离地高度
  35.                                     }
  36.                                 ]
  37. * @param {any} rotation 旋转  {x:0,y:0,z:0}
  38. */
  39. function createWall(name,type, size, startPosition, doorHoles, rotation) {
  40. ......
  41.     return buildwall;
  42. }</em>
复制代码
第二部分是封装业务逻辑
将每部分业务逻辑单独封装到方法类中
例如:温度云图
  1. //=======================================================温度=======================================================
  2. function Tempture() {
  3. }
  4. Tempture.prototype.temptureSpaceState = 0;
  5. //温度显示
  6. Tempture.prototype.showTemptureMap = function (callBack) {
  7.     var _this = this;
  8.     if (_this.temptureSpaceState == 0) {
  9.         $("#backBtn").fadeIn();
  10.         layer.closeAll();
  11.         $("#toolbar").fadeOut();
  12.         _this.temptureSpaceState = 1;
  13.         _this.createHeatMapModels("temptureObj", callBack);
  14.         _this.hideAllMsg();
  15.     } else {
  16.         _this.temptureSpaceState = 0;
  17.         _this.hideAllTemptureMapObjs();
  18.     }
  19. }
  20. Tempture.prototype.hideAllTemptureMapObjs = function () {
  21.     WT3DObj.destoryObj("temptureObj");
  22.     for (var i = 0; i < 20; i++) {
  23.         WT3DObj.destoryObj("temptureObj_" + i);
  24.     }
  25. }
  26. //创建热力图
  27. Tempture.prototype.createHeatMapModels = function (name, callBack) {
  28.     var _this = this;
  29.     var scaleRate = 1;
  30.     if (roomConfig.buildData.baseConfig && roomConfig.buildData.baseConfig.normRackSize) {
  31.         scaleRate = roomConfig.buildData.baseConfig.normRackSize.width / 350;
  32.     }
  33.     _this.getHeatMapDataValue(function (_data) {
  34.         var modeljson =  ...;
  35.         WT3DObj.InitAddObject(modeljson);
  36.         for (var i = 0; i < 10; i++) {
  37.             modeljson.position.y += (roomConfig.maxheight / 10) / scaleRate;
  38.             modeljson.name = name + "_" + i;
  39.             modeljson.values = _data.data;
  40.             WT3DObj.InitAddObject(modeljson);
  41.         }
  42.     }, callBack);
  43. };
  44. Tempture.prototype.getHeatMapDataValue = function (suc, callBack) {
  45.     webapi.getTemptureValue(function (result) {
  46.         var heatMapData = {};
  47.         $.each(result, function (_reindex, _reobj) {
  48.             heatMapData["d_" + _reobj.id] = _reobj;
  49.         });
  50.          ...
  51.         var rdata = {
  52.             max: 100,
  53.             data: datas
  54.         };
  55.         if (suc) {
  56.             suc(rdata);
  57.         }
  58.         if (callBack) {
  59.             callBack(mtemp);
  60.         }
  61.     });
  62. }
复制代码
 
 
2.2、业务隔离
  1. switch (id) {
  2.             case "div_btn_1"://异常设备
  3.                 {
  4.                     clearInterval(_this.alarmSetintervalIndex);
  5.                     $("#btn_1").fadeTo(100, 1);
  6.                     if ($("#btn_1").attr("title") == "告警监控") {
  7.                         $("#btn_1").attr("title", "关闭告警闪动");
  8.                         $("#btn_1").attr("src", "../img/pageimg2/ycsbclose.png");
  9.                         modelBussiness.closeAlarm();
  10.                     } else {
  11.                         _this.flashAlarmBtn();
  12.                         modelBussiness.startAlarm();
  13.                         $("#btn_1").attr("src", "../img/pageimg2/ycsb.png");
  14.                         $("#btn_1").attr("title", "告警监控");
  15.                     }
  16.                 }
  17.                 break;
  18.             case "div_btn_2"://空间
  19.                 {
  20.                     modelBussiness.currentState = 22;
  21.                     modelBussiness.showSpaceRate();
  22.                 }
  23.                 break;
  24.             case "div_btn_3"://U位
  25.                 {
  26.                     modelBussiness.currentState = 23;
  27.                     modelBussiness.showUsageMap();
  28.                 }
  29.             
  30.                 break;
  31.             case "div_btn_4":
  32.                 {
  33.                     modelBussiness.currentState = 24;
  34.                     modelBussiness.showTemptureMap();
  35.                 }//温度
  36.                
  37.                 break;
  38.             case "div_btn_5"://承重
  39.                 {
  40.                     modelBussiness.currentState = 25;
  41.                     modelBussiness.showBearing();
  42.                 }
  43.                 break;
  44.             case "div_btn_6"://功率
  45.                 {
  46.                     modelBussiness.currentState = 26;
  47.                     modelBussiness.showEnergyRate();
  48.                 }
  49.                 break;
  50.         }
  51.     });
复制代码
 
三、主要难点
3.1、如何封装模型、提炼参数

  • 选择关键参数:在模型中可能有很多参数,需要选择出一些关键的参数。例如,一些对模型性能影响较大的参数,或者一些表示模型复杂度的参数等。
  • 定义计算方法:对于每个关键参数,需要定义一个计算方法。
  • 提取参数:在模型预测时,需要提取出这些关键参数的值。
  • 可视化参数:对于一些关键参数,可能还需要进行可视化,以便于理解和优化模型。
3.2、如何在生成的不同房间模型下,还能展现业务功能

  • 定义业务功能:首先需要明确每个房间所需展现的业务功能
  • 集成业务功能:将所定义的各项业务功能集成到三维房间模型中
  • 交互式展示:将三维房间模型与业务功能进行交互式展示。
  • 场景模拟:根据实际使用场景,模拟不同场景下的业务功能展示。
3.3、如何做数据分离
   统一webapi数据文件,这里主要处理获取数据,数据过滤
  
  1. /*
  2. 数据接口
  3. */
  4. function WebAPI() {
  5.     this.serverHead = "";//idc/
  6.     this.roomid = getQueryString("room") ? getQueryString("room") : "1";
  7.     this.CabInfosCache = null;//机柜数据缓存
  8.     this.OtherDevsCache = null;//所有设备缓存
  9.     this.ServerDevsCache = {};//所有设备缓存
  10.     this.AllDevsCache = null;//所有设备缓存
  11.     this.alarmCache = [];//告警缓存
  12.     this.modelAlarmCache = {};//模型对应告警缓存
  13.     this.wsSocket = null;
  14.     //告警闪动对应的颜色
  15.     this.alarmColors = {
  16.         "L1": 0xff0000,
  17.         "L2": 0xff6600,
  18.         "L3": 0xffff00,
  19.         "L4": 0x0096ff,
  20.     }
  21.     this.urls = {
  22.         enables: "/dataDemo/enable.json",//功能开启关闭接口
  23.         buildData: "/dataDemo/buildData.json",//创建模型接口
  24.         racks: "/dataDemo/racks.json",//机柜信息
  25.         useRates:"/dataDemo/useRates.json",//机柜利用率
  26.         temperatures: "/dataDemo/tempTureData.json",//温度数据
  27.         bearing: "/dataDemo/beringRate.json",//承重
  28.         euRate: "/dataDemo/euRate.json",//功耗
  29.         uvInfos: "/dataDemo/uDetail.json",//u位信息
  30.         otherDevs: "/dataDemo/otherDev.json",//其它动环设备
  31.         DevData: "/dataDemo/otherDevValue.json",//动环设备实时数据
  32.         queryInfos: "/dataDemo/search.json",//查询接口
  33.         alarms: "/dataDemo/alarm.json",//告警
  34.         wsurl: "xxxx",//websocket地址
  35.     }
  36. }
  37. WebAPI.prototype.getEnables = function () {
  38.     var _this = this;
  39.     var url = this.serverHead + this.urls.enables + "?roomId=" + this.roomid;
  40.     url += "&r=" + Math.random();
  41.     var enables = null;
  42.     httpGetSyn(url, function (response) {
  43.         if (response && response.data) {
  44.             enables = response.data;
  45.         }
  46.     }, function (err) {
  47.         console.log(err);
  48.     });
  49.     return enables;
  50. }
  51. .......
复制代码
 
 由于篇幅原因,我们本节课先到这里,后面我们更新如何创建一个可编辑工具完成配置
 
技术交流 1203193731@qq.com
交流微信:
    

如果你有什么要交流的心得 可邮件我
其它相关文章:
如何使用webgl(three.js)实现煤矿隧道、井下人员定位、掘进面、纵采面可视化解决方案——第十九课(一)
如何使用webgl(three.js)实现3D消防、3D建筑消防大楼、消防数字孪生、消防可视化解决方案——第十八课(一)
webgl(three.js)3D光伏,3D太阳能能源,3D智慧光伏、光伏发电、清洁能源三维可视化解决方案——第十六课
如何用webgl(three.js)搭建一个3D库房,3D仓库3D码头,3D集装箱,车辆定位,叉车定位可视化孪生系统——第十五课
webgl(three.js)实现室内三维定位,3D定位,3D楼宇bim、实时定位三维可视化解决方案——第十四课(定位升级版)
使用three.js(webgl)搭建智慧楼宇、设备检测、数字孪生——第十三课
如何用three.js(webgl)搭建3D粮仓、3D仓库、3D物联网设备监控-第十二课
如何用webgl(three.js)搭建处理3D隧道、3D桥梁、3D物联网设备、3D高速公路、三维隧道桥梁设备监控-第十一课
如何用three.js实现数字孪生、3D工厂、3D工业园区、智慧制造、智慧工业、智慧工厂-第十课
使用webgl(three.js)创建3D机房,3D机房微模块详细介绍(升级版二)
如何用webgl(three.js)搭建一个3D库房-第一课
如何用webgl(three.js)搭建一个3D库房,3D密集架,3D档案室,-第二课
使用webgl(three.js)搭建一个3D建筑,3D消防模拟——第三课
使用webgl(three.js)搭建一个3D智慧园区、3D建筑,3D消防模拟,web版3D,bim管理系统——第四课
如何用webgl(three.js)搭建不规则建筑模型,客流量热力图模拟
 使用webgl(three.js)搭建一个3D智慧园区、3D建筑,3D消防模拟,web版3D,bim管理系统——第四课(炫酷版一)
使用webgl(three.js)搭建3D智慧园区、3D大屏,3D楼宇,智慧灯杆三维展示,3D灯杆,web版3D,bim管理系统——第六课

如何用webgl(three.js)搭建处理3D园区、3D楼层、3D机房管线问题(机房升级版)-第九课(一)
 

来源:https://www.cnblogs.com/yeyunfei/p/17756557.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具