前言

在目前大数据时代背景之下,数据可视化的需求也变得越来越庞大,在数据可视化的背景之下,通过智能机器间的链接并最终将人机链接,结合软件和大数据分析的工业互联网也将变得越来越容易实现!

国家也敏锐意识到时代特性并及时把握时机,培育新的经济增长点,推动“中国制造”升级,实现工业大国到工业强国的质变,而诸多的业内人士也正在努力完成对自己的“升级”与“改造”,而大数据的数据可视化与工业的结合,实现了工控的可视化,大大地提高工控管理效率,风险把控能力,产业流程有效监督等等。

如今得益于基于 HTML5 WebGL 的出现,从技术上实现工控数字化管理模式变得简单易行,核心提高对工控设备信息的可视化与管理效率,可以实时掌握设备每个参数的状态,对资源的实时管理,对整体运行稳定性风险度有极高的可控性。

如下所示,便是一个基于 HTML5 WebGL 的 3D 风机 Web 组态工业互联网应用中的风机项目:

此项目链接:基于 HTML5 WebGL 的 3D 风机 Web 组态工业互联网应用(http://www.hightopo.com/demo/FanDevice/)

从上面设计图中可以看到页面布局主要四部分组成:table 表格,表盘,echarts 图表,3d 风机模型。

在这个页面中非常具体而又全面的展示了风机设备的相关设备信息,比如风机设备名称,风机参数,发电量数据,机舱温度以及功率风速折线图表等等,这对于管理员而言是一种享受!

在 3d 风机模型出可以对风机进行拉近拉远等交互,实现风机外壳透明化、隐藏、显示效果,如图所示:

在拉近风机隐藏风机外壳显示内部部件时候可以点击部件获取点击部件详细信息:

在如上整个风机项目中技术核心同时也是难点的是对 3d 风机模型的交互操作实现上,在此我把 3d 风机模型单独拿出来做讲解,其完整风机交互效果如下动图所示:

在如上的项目中使用的风机模型是通过 MAYA 和 MODO 建模制作而成,这两个工具导出的 obj 和 mtl 文件。

在开始操作之前先确认需求,从上面效果图中分析可以看到主要有三个功能需求:

1、滚轮滚动时风机外壳透明化到隐藏再到显示效果;

2、点击风机内部部件时有对应的弹窗出现以及点击弹窗隐藏;

3、风机叶片旋转效果;

在明确所需要的交互功能需求后,我们就可以一步一步来实现它。

实现功能

1,滚轮滚动时风机外壳透明化到隐藏效果

由于该风机场景是由多个子模型拼装形成,所以在加载场景时候存在子模型加载的异步问题,存在的异步问题会导致在获取子模型并对其绑定事件时候发生错误,比如提示该子模型 undefined,所以要先解决这个问题。

ht.Default.handleModelLoaded = function (data) {//模型加载完成时回调
}

通过 handleModelLoaded 解决模型加载异步问题后,就可以在函数内针对模型进行事件绑定操作。

首先声明一个数组,是三个模型的 tag 名,通过后面的 for 循环获取这三个模型:

//风机三个外壳
var fanArr = ['风机_叶片', '风机_机箱外壳2', '风机_轮毂外壳'];

然后在 handleModelLoaded 方法的函数内对风机外壳模型进行操作:

for (var i = 0; i < fanArr.length; i++) { //滚轮控制拉远拉近时风机部件透明化if (data == 'models/机械设备/风力发电机/' + fanArr[i] + '.json') {var model = ht.Default.getShape3dModel('models/机械设备/风力发电机/' + fanArr[i] + '.json');//通过tag标签名获取模型var tags = g3d.dm().getDataByTag(fanArr[i]);//绑定滚轮事件g3d.getView().addEventListener('mousewheel', function (e) {//获取eye到center距离//通过distance判断显示隐藏的滚轮距离var distance = ht.Default.getDistance(g3d.getEye(), [0, 9500, 0]);if (distance < 2700 && distance > 2100) {//拉近机箱外壳透明化tags.setStyle('shape3d.transparent', true);tags.setStyle('shape3d.opacity', 0.5);tags.setStyle('shape3d.visible', true);//拉远隐藏显示框for (var j2 = 0; j2 < eightArr.length; j2++) {var textViews = g3d.dm().getDataByTag(eightArr[j2] + 'show');textViews.setStyle('3d.visible', false);}}else if (distance > 2700) {//拉远恢复原状tags.setStyle('shape3d.transparent', false);tags.setStyle('shape3d.opacity', 1);}else if (distance < 2100) {//拉近隐藏机箱外壳tags.setStyle('shape3d.visible', false);}})}
}

如此就实现了第一个目标,成功实现滚轮滚动时风机外壳透明化到隐藏效果。

然后接着第二个目标。

2,点击风机内部部件时有对应的弹窗出现

实现该效果无非就是两步走,获取部件模型,然后给模型绑定点击事件(点击显示弹窗,点击弹窗隐藏弹窗)

首先声明一个部件数组:

//风机内部九大部件
var parts = ['风机_控制柜', '风机_发电机', '风机_风冷装置', '风机_制动联结装置', '风机_油冷装置', '风机_齿轮箱', '风机_主轴', '风机_转子齿轮', '风机_变桨系统'];

然后代码实现,也是放在 handleModelLoaded 方法的函数内:

//九大部件与弹窗绑定点击事件
g3d.mi(function (e) { //交互事件监听器//绑定点击事件if (e.kind === 'clickData') {for (var j = 0; j < parts.length; j++) {if (e.data.getTag() === parts[j]) {for (var j2 = 0; j2 < parts.length; j2++) {//通过tag标签名获取模型图元var textViews = g3d.dm().getDataByTag(eightArr[j2] + 'show');textViews.setStyle('3d.visible', false);}//通过tag标签名获取弹窗图元var textView = g3d.dm().getDataByTag(eightArr[j] + 'show');textView.setStyle('3d.visible', true);}//弹窗点击事件if (e.data.getTag() === parts[j] + 'show') {var textView2 = g3d.dm().getDataByTag(parts[j] + 'show');textView2.setStyle('3d.visible', false);}}}
})

在实现部件点击显示弹窗和点击弹窗隐藏效果后,就差最后一步,完成风机叶片旋转效果。

3,风机叶片旋转效果

风机叶片旋转原理非常简单,本质就是控制 rotation 的参数,通过 startAnim 方法递增参数值实现叶片旋转动态效果。

还是老路子,先获取风机叶片模型,然后再修改和赋予 rotation 参数值,代码实现也是放在 handleModelLoaded 方法的函数内。

//风机叶片旋转
if (data == 'models/机械设备/风力发电机/风机_轮毂外壳.json') {var rotation = '';var deg = Math.PI / 180;var speed = 2;function animation() {//获取风机模型var modelWheel = g3d.dm().getDataByTag('风机_轮毂外壳');ht.Default.startAnim({duration: 5500, // 动画周期毫秒数,默认采用action: function (v, t) {rotation = [0, 0, deg * (speed--)];modelWheel.setRotation3d(rotation);},finishFunc: function () { //动画结束后调用animation();}})}animation();
}

4,完整代码

完成三个功能需求后完整核心代码如下所示:

//风机三个外壳
var fanArr = ['风机_叶片', '风机_机箱外壳2', '风机_轮毂外壳'];
//风机内部九大部件
var parts = ['风机_控制柜', '风机_发电机', '风机_风冷装置', '风机_制动联结装置', '风机_油冷装置', '风机_齿轮箱', '风机_主轴', '风机_转子齿轮', '风机_变桨系统'];
ht.Default.handleModelLoaded = function (data) {//模型加载完成的回调for (var i = 0; i < fanArr.length; i++) { //滚轮控制拉远拉近时风机部件透明化if (data == 'models/机械设备/风力发电机/' + fanArr[i] + '.json') {var model = ht.Default.getShape3dModel('models/机械设备/风力发电机/' + fanArr[i] + '.json');// console.log(model);var tags = g3d.dm().getDataByTag(fanArr[i]);g3d.getView().addEventListener('mousewheel', function (e) {//获取eye到center距离var distance = ht.Default.getDistance(g3d.getEye(), [0, 9500, 0]);if (distance < 2700 && distance > 2100) {//拉近机箱外壳透明化tags.setStyle('shape3d.transparent', true);tags.setStyle('shape3d.opacity', 0.5);tags.setStyle('shape3d.visible', true);//拉远隐藏显示框for (var j2 = 0; j2 < eightArr.length; j2++) {var textViews = g3d.dm().getDataByTag(eightArr[j2] + 'show');textViews.setStyle('3d.visible', false);}}else if (distance > 2700) {//拉远恢复原状tags.setStyle('shape3d.transparent', false);tags.setStyle('shape3d.opacity', 1);}else if (distance < 2100) {//拉近隐藏机箱外壳tags.setStyle('shape3d.visible', false);}})}}//九大部件与弹窗绑定点击事件g3d.mi(function (e) { //交互事件监听器if (e.kind === 'clickData') {for (var j = 0; j < parts.length; j++) {if (e.data.getTag() === parts[j]) {for (var j2 = 0; j2 < parts.length; j2++) {var textViews = g3d.dm().getDataByTag(eightArr[j2] + 'show');textViews.setStyle('3d.visible', false);}var textView = g3d.dm().getDataByTag(eightArr[j] + 'show');textView.setStyle('3d.visible', true);}//弹窗点击事件if (e.data.getTag() === eightArr[j] + 'show') {var textView2 = g3d.dm().getDataByTag(eightArr[j] + 'show');textView2.setStyle('3d.visible', false);}}}})//风机叶片旋转if (data == 'models/机械设备/风力发电机/风机_轮毂外壳.json') {var rotation = '';var deg = Math.PI / 180;var speed = 2;function animation() {//获取风机模型var modelWheel = g3d.dm().getDataByTag('风机_轮毂外壳');ht.Default.startAnim({duration: 5500, // 动画周期毫秒数,默认采用action: function (v, t) {rotation = [0, 0, deg * (speed--)];modelWheel.setRotation3d(rotation);},finishFunc: function () { //动画结束后调用animation();}})}animation();}
}

结束语

这个风机 demo 功能的实现整体原理很简单,万变不离其宗,最终都是获取对象然后绑定事件实现效果。再复杂的功能通过解析后发现最终也不过是一个又一个简单小功能组合到一起最后实现大的功能。

所以在学习过程中基础最重要,再大的项目解析到最小也还是要通过基础代码一步一步实现。

c#web页面显示弹窗_基于 HTML5 WebGL 的 3D 风机 Web 组态工业互联网应用相关推荐

  1. html5 光影效果,基于 HTML5 WebGL 的 3D 场景中的灯光效果

    原标题:基于 HTML5 WebGL 的 3D 场景中的灯光效果 构建 3D 的场景除了创建模型,对模型设置颜色和贴图外,还需要有灯光的效果才能更逼真的反映真实世界的场景.这个例子我觉得既美观又代表性 ...

  2. bim 模型web页面展示_基于HTML5/WebGL技术的BIM模型轻量化Web浏览解决方案

    互联网技术的兴起极大得改变了我们的娱乐.生活和生产方式.尤其是HTML5/WebGL技术的发展更是在各个行业内引起颠覆性的变化,大家感受最深刻的可能是游戏.电商.O2O等和我们生活息息相关的行业,但这 ...

  3. 基于 HTML5 WebGL 的 3D 服务器与客户端的通信

    这个例子的初衷是模拟服务器与客户端的通信,我把整个需求简化变成了今天的这个例子.3D 机房方面的模拟一般都是需要鹰眼来辅助的,这样找产品以及整个空间的概括会比较明确,在这个例子中我也加了,这篇文章就算 ...

  4. 基于 HTML5 WebGL 的 3D 智慧隧道漫游巡检

    前言 这次为大家展示的是通过 HT for Web 灵活的图型化编辑工具打造的智慧隧道监控系统.通过 HTML5 技术实现了桌面和移动端的跨平台性,同时现实了可视化运维. 这次主要跟大家分享里面的漫游 ...

  5. c#web页面显示弹窗_web页面实现PDF读取显示

    什么是PDF.js PDF.js是一个用于构建在HTML5中Portable Document Format (PDF)浏览插件. 重点: 1)使用在HTML5中,那么一些比较老的不支持HTML5的浏 ...

  6. c#web页面显示弹窗_C#监听IE文档加载完成、弹窗、JS弹窗、页面跳转

    这个Demo在早段时间有个网友需要做一个相关方面的软件,我给做出来的.很方面,在JS弹窗监听上耗了不少时间.现在均已解决!请勿用作非法商业用途,该软件产生的后果与作者本人无关,特此声明. 由于需要对H ...

  7. c#web页面显示弹窗_C#中三种弹出信息窗口的方式

    弹出信息框,是浏览器客户端的事件.服务器没有弹出信息框的功能. 方法一: asp.net页面如果需要弹出信息框,则需要在前台页面上注册一个javascript脚本,使用alert方法.使用Client ...

  8. 基于 HTML5 WebGL 的 3D 仓储管理系统

    仓储管理系统(WMS)是一个实时的计算机软件系统,它能够按照运作的业务规则和运算法则,对信息.资源.行为.存货和分销运作进行更完美地管理,使其最大化满足有效产出和精确性的要求.从财务软件.进销存软件C ...

  9. 基于HTML5 WebGL实现3D飞机叶轮旋转

    在上一篇<基于HT for Web矢量实现2D叶轮旋转>中讲述了叶轮旋转在2D拓扑上的应用,今天我们就来讲讲叶轮旋转在3D上的应用. 在3D拓扑上可以创建各种各样的图元,在HT for W ...

最新文章

  1. 2013 Multi-University Training Contest 5 部分解题报告
  2. java提高篇(七)-----关键字static
  3. iPhone走马灯控件实现
  4. elasticsearch完全匹配
  5. 1024看到这篇文章的程序员,能不能把你的电脑桌面右下角截图回复
  6. hadoop的序列化与java的序列化区别
  7. springcloud 服务网关Zuul实战(一)基本路由配置
  8. VS2008 ~ VS2019下载地址
  9. 3D Max 渲染和渲染农场渲染经常会出现白点?网渲和本地通用解决~
  10. teamtalk mysql.h_TeamTalk安装测试
  11. Android 分贝测试仪功能
  12. 《嵌入式系统原理与应用》 | 嵌入式系统 重点知识梳理
  13. 华北电力大学控制与计算机工程学院怎么样,华北电力大学控制与计算机工程学院实践部10月25日动保劳动感想...
  14. 什么是软件第三方测试 ,靠谱的第三方测试检测公司推荐
  15. 记录一次服务器被植入挖矿脚本事件
  16. gitblit+jenkins本地服务
  17. 腾讯+字节+阿里面经真题汇总,总结到位
  18. python 参加某图像去噪比赛有感
  19. 申请微信公众号的一些流程和注意
  20. 期货柜台怎样进行配置?

热门文章

  1. C语言程序设计基础讲座之指针的慨念
  2. 黑客到底可以厉害到什么程度
  3. 再来一波不错的学习资源
  4. CSS裸奔节,一个被遗忘的前端节日!
  5. HTML5新特征、窍门和技术(11~15)
  6. 12月14日习题答案大剖析!html5基础测试来啦
  7. apk android lite,APKPure Lite
  8. m 文件 dll matlab 中调用_利用USO服务将特权文件写入武器化
  9. 《细胞》重磅成果!任兵课题组绘制迄今最大规模人类单细胞染色质可及性图谱...
  10. 七龙珠 |召唤一份单细胞数据库汇总