前言

得益于 HTML5 WebGL 技术的成熟,从技术上对工控管理的可视化,数据可视化变得简单易行!完成对工控设备的管理效率,资源管理,风险管理等的大幅度提高,同时也对国家工业4.0计划作出有力响应!

如本案例所示,是一个基于 HTML5 WebGL 技术实现的计量站三维可视化监控系统,在本案例中,具体宏观的展示一个油田站点的整体场景,然后点击可以进入内景看到油田计量站内景的具体情况,同时可以看到各个设备的参数的当前状态。

同样的其中功能组件具有很高的复用性,所以也会非常方便的应用到其他场景中!

如下所示,便是本案例运行动态图:

此项目链接:基于 HTML5 WebGL 的计量站三维可视化监控系统 Web 组态工控应用

(http://www.hightopo.com/demo/metering-station/ )

在这个场景中主要有如下几个功能:

1、点击来回切换场景;

2、管线流动效果;

3、数据面板动态显示;

代码实现

确认功能需求后就可以开始实施实现,动手实现之前要先确认场景有哪些,如下所示主要有油田外景和内景。

外景:

内景:

技能储备

本 demo 需要掌握 HT for Web 的 2d 和 3d 相关 技术,具体技术参考资料可以去 HT for Web 官网图扑软件了解。

实现功能

1、 默认视角
在三维场景中,需要先设置一个默认视角,当重新打开页面时候直接回到默认视角,通过 setFar, setEye 和 setCenter 方法实现。

gv.setFar(100000);
gv.setEye([1247, 600, 1972]);
gv.setCenter([0, 0, 0]);

2、 视角限制
由于三维场景的特性,如果不作出视角限制,就会出现穿模,翻底等现象,尤其本案例有天空球效果,如果不作出视角限制当用户无限拉远后会出现视角跑到天空球外,场景消失问题,这将会非常尴尬!

具体实现是通过 setEye 方法和 setCenter 方法控制场景的 eye 和 center 变量实现,放置到 mp 函数内。

mp(listener, scope, ahead); // 增加自身属性变化事件监听器
// 限制 eye
gv.mp(function (e) {if (e.property === 'eye') {if (gv.getEye()[1] < 90) {gv.getEye()[1] = 90;}if (gv.getEye()[1] > 1500) {gv.getEye()[1] = 1500;}if (gv.getEye()[0] > 2400) {gv.getEye()[0] = 2400;}if (gv.getEye()[0] < -2400) {gv.getEye()[0] = -2400;}if (gv.getEye()[2] > 2500) {gv.getEye()[2] = 2500;}if (gv.getEye()[2] < -2400) {gv.getEye()[2] = -2400;}}
})

3、 点击切换场景
通过 mi 添加交互事件监听器为要点机交互模型绑定事件,通过 e.kind 判断点击事件,然后通过 tag 标签名获取要点击交互的模型对象。

首先在点击时候有个拉近效果和周围模型透明化效果,则是通过 flyTo 实现拉近效果和 setStyle 方法实现拉近后其他模型透明化。

具体代码如下:

gv.mi(function (e) {if (e.kind === 'clickData') {for (var i = 1; i <= 2; i++) {if (e.data.getTag() === 'engineRoom' + i) {// 点击拉近场景gv.flyTo(e.data, {animation: true,distance: 500});// 选中模型实化e.data.setStyle('shape3d.transparent', false);e.data.setStyle('shape3d.opacity', 1);// 其他模型透明化dm.each(data => {if (data.getTag() != 'engineRoom' + i) {data.setStyle('shape3d.transparent', true);data.setStyle('shape3d.opacity', 0.3);data.setStyle('all.transparent', true);data.setStyle('all.opacity', 0.5);}})}}}
})

实现效果如下:

然后在完成拉近场景和透明化其他模型后,开始实现场景切换效果。

场景切换的核心是通过 gv.deserialize() 反序列化显示路径对应场景,通过输入场景路径参数,在回调函数内完成场景渲染显示,代码如下:

gv.deserialize('scenes/油田.json', function (json, dm, gv, datas) {if (json.title) document.title = json.title;if (json.a['json.background']) {var bgJSON = json.a['json.background'];if (bgJSON.indexOf('displays') === 0) {var bgGv = new ht.graph.GraphView();bgGv.deserialize(bgJSON);bgGv.addToDOM();graphView.addToDOM(bgGv.getView());}else if (bgJSON.indexOf('scenes') === 0) {var bgG3d = new ht.graph3d.Graph3dView();bgG3d.deserialize(bgJSON);bgG3d.addToDOM();graphView.addToDOM(bgG3d.getView());}graphView.handleScroll = function () { };}
})

但在这之前有一个问题,就是如何处理当前场景和通过反序列化渲染显示场景的关系,如果不作处理,就会出现当前场景和要切换显示的场景重合问题,所以在点击切换场景过程中,要先清空当前场景,为后来要切换的场景腾出地方。

所以在前面要先加一行代码:

dm.clear();

做完处理后,现在是完成了切换过去效果,但还有要切换回来的功能,这个实现非常简单,取了个巧,直接 window.location.reload(); 刷新页面就好。

最终这部分完整代码如下:

function jump(position3d) {var timer = setInterval(function () {clearInterval(timer)var distance = ht.Default.getDistance(gv.getEye(), position3d);if (distance <= 501) {var home = g2d.dm().getDataByTag('home');home.s('2d.visible', true);var line = g2d.dm().getDataByTag('line');line.s('2d.visible', true);dm.clear();gv.deserialize('scenes/油田.json', function (json, dm, gv, datas) {if (json.title) document.title = json.title;if (json.a['json.background']) {var bgJSON = json.a['json.background'];if (bgJSON.indexOf('displays') === 0) {var bgGv = new ht.graph.GraphView();bgGv.deserialize(bgJSON);bgGv.addToDOM();graphView.addToDOM(bgGv.getView());}else if (bgJSON.indexOf('scenes') === 0) {var bgG3d = new ht.graph3d.Graph3dView();bgG3d.deserialize(bgJSON);bgG3d.addToDOM();graphView.addToDOM(bgG3d.getView());}graphView.handleScroll = function () { };}})}}, 500)
}

我将它放置到 jump 函数内,然后将 jump 函数放到前面点击事件中调用,让代码整体简洁一些。

实现效果如下图:

4、 管线流动效果和动态数据面板
最后两个功能实现非常简单,我就放到一块来说。

首先效果如下图所示:

管线流动效果的实现核心就是控制 UV 贴图偏移,所以通过动画控制器 startAnim 控制 UV 贴图偏移量就可以实现,在动画结束时,在 finishFunc 内回调函数即可实现动画循环。

pipelineAnim(0.1)
function pipelineAnim(offset1) {var anim1 = ht.Default.startAnim({duration: 2000,action: function () {offset1 += 0.015;var pipelines = gv.dm().getDataByTag('pipeline');pipelines.setStyle('shape3d.uv.offset', [-offset1, 0]);},finishFunc: function () {pipelineAnim(offset1);}})
}

数据面板则是通过定时器在固定间隔时间循环执行赋予随机数即可,在这里通过随机数模拟真实数据,在实际当中是通过和后台对接实现真实数据动态变化,代码如下:

setInterval(function () {for (var i = 1; i <= 4; i++) {var panels = gv.dm().getDataByTag('panel' + i);for (var j = 1; j <= 3; j++) {if (panels.a('text' + j) != undefined) {var num = parseFloat(Math.random() * (100 - 10 + 1) + 10, 10).toFixed(2);var textJson = { "参数名": "出口温度", "参数值": num, "参数单位": panels.a('text' + j)['参数单位'] };panels.a('text' + j, textJson);}}}
}, 1000)

结束语

以上便是我今天给大家带来的工控案例,希望各位看官能够喜欢本 demo,在本案例中能够得到一些启发。

基于 HTML5 WebGL 的计量站三维可视化监控系统 Web 组态工控应用相关推荐

  1. 基于 HTML5 的计量站三维可视化监控系统 Web 组态工控应用

    得益于 HTML5 WebGL 技术的成熟,从技术上对工控管理的可视化,数据可视化变得简单易行!完成对工控设备的管理效率,资源管理,风险管理等的大幅度提高,同时也对国家工业4.0计划作出有力响应! 如 ...

  2. 基于 HTML5 WebGL 的高炉炉体三维热力图监控,展示“智慧工厂”十八般武艺

    前言 我国的钢铁产业一直致力于炼铁传感器.物联网.工业模型软件.专家系统.企业级炼铁大数据平台以及行业级工业互联网平台整体解决方案的研发和推广.目前已完成国内260座高炉的数字化和智能化落地,并推动炼 ...

  3. 加油站三维可视化监控系统,安全管理智慧运营

    前言 加油站是指为汽车和其它机动车辆服务的.零售汽油和机油的补充站,一般为添加燃料油.润滑油等.由于加油站所销售的石油商品具有易燃爆.易挥发.易渗漏.易集聚静电荷的特性,故加油站以"安全&q ...

  4. Web三维可视化监控系统搭建(1)——Web三维/ VR交互技术初探

    文章目录 1. 文章背景 2.文章脉络 3.三维展示技术介绍 3.1 基于3D模型的展示 3.2 基于VR/全景图的展示 4.三维可视化展示的实现方案 4.三维可视化展示的基本知识 4.1 坐标系 4 ...

  5. 基于 HTML5 WebGL 的 CPU 仿真 3D 可视化

    前言 科技改变生活,科技的发展带来了生活方式的巨大改变.随着通信技术的不断演进,5G 技术应运而生,随时随地万物互联的时代已经来临.5G 技术不仅带来了更快的连接速度和前所未有的用户体验,也为制造业, ...

  6. Web三维可视化监控系统搭建(2)——VR场景显示和交互

    文章目录 1.本文主要内容 2.VR/全景图场景的基本原理 2.1 VR场景是个球 2.2 VR图到球的映射关系 3.VR/全景图场景的获取 4.Three.js内展示全景图 4.1 改变视野大小 5 ...

  7. 基于 HTML5 WebGL 的发动机 3D 可视化系统

    前言 工业机械产品大多体积庞大.运输成本高,在参加行业展会或向海外客户销售时,如果没有实物展示,仅凭静态.简单的图片说明书介绍,无法让客户全面了解产品,不仅工作人员制作麻烦,客户看得也费力.如果能在 ...

  8. 基于 HTML5 WebGL 的加油站 3D 可视化监控

    前言 随着数字化,工业互联网,物联网的发展,我国加油站正向有人值守,无人操作,远程控制的方向发展,传统的人工巡查方式逐渐转变为以自动化控制为主的在线监控方式,即采用数据采集与监控系统 SCADA.SC ...

  9. html5 3d场景设计,基于 HTML5 WebGL 的加油站 3D 可视化监控

    前言 随着数字化,工业互联网,物联网的发展,我国加油站正向有人值守,无人操作,远程控制的方向发展,传统的人工巡查方式逐渐转变为以自动化控制为主的在线监控方式,即采用数据采集与监控系统 SCADA.SC ...

最新文章

  1. Django中的Form
  2. Fiddler抓取https的设置
  3. Unix/Linux环境C编程入门教程(39) shell命令之系统管理
  4. Android OpenCV Manager简介
  5. 《学得少考得好》读书笔记
  6. nginx 日志配置log_format用法
  7. ftp安装和虚拟用户创建(终于搞清楚了)
  8. 斑马技术发布《2022年中国医院愿景研究》:未来5年,超过90%的临床医生将采用移动技术...
  9. boost::hana::detail::decay用法的测试程序
  10. 2017 《Java技术预备作业 》1501 乔 赫
  11. 基于react的简单TODOList
  12. Struts2-01-配置文件
  13. ImageAI (四) 使用Python快速简单实现自定义预测模型的训练 Custom Model Training
  14. 两组数据的偏差率_析数据 察得失 明对策 促提高 —记东升一中2021级月考二成绩分析会...
  15. 为何现在只剩下 风吹乱我的发
  16. 渗透测试常见弱口令汇总
  17. 【操作系统】王道考研 笔记总结目录(完结)
  18. Redis生成自增流水号,每日清零
  19. 数学建模常用模型04:灰色关联分析法
  20. 针对大学城的二手书市场

热门文章

  1. idea配置jdk环境
  2. JS实现alert中显示换行的方法
  3. 恒源云(GPUSHARE)_人工智能行业 | AI+教育,虚实之间
  4. 除视频水印的软件 md5修改
  5. tomcat和servlet快速入门教程!!!
  6. Romberg积分法计算定积分(Matlab程序)
  7. 牛客网 2017年校招全国统一模拟笔试(第五场)编程题集合- 彩色瓷砖
  8. 简单的CSS在页面中点击超链接跳转新的页面
  9. Nginx如何使用.PFX证书
  10. ML模型部署-工具箱