博客
关于我
基于 HTML5 + WebGL 实现 3D 可视化地铁系统
阅读量:430 次
发布时间:2019-03-06

本文共 4306 字,大约阅读时间需要 14 分钟。

工业互联网、物联网、可视化等概念在当今信息化时代已深入人心,几乎贯穿于我们生活的方方面面。无论是交通出行,还是日常的衣食住行,都能通过信息化手段得到便利。在可视化监控领域,传统的Web SCADA技术主要依靠2D可视化实现,但随着技术的进步,我们采用Hightopo的HT for Web产品构建了一个轻量化的3D可视化场景,该场景从正面展现了地铁站的实时运行情况,包含地铁运行、上下行情况、视频监控、烟雾报警、电梯运行等多个方面,帮助用户直观了解地铁运营状况。

为让用户更直观地浏览地铁站,系统提供了三种交互模式:

  • 第一人称模式:操作类似行人或列车行进效果,可通过键盘鼠标控制前进后退。
  • 自动巡检模式:无需用户操作,场景自动前后移动,实现对地铁站的全面巡查。
  • 鼠标操作模式:左键旋转场景,右键平移场景。

本文通过搭建地铁站可视化场景、实现动画代码、分析交互模式以及功能点的实现,阐述如何使用Hightopo HT for Web产品构建一个简单的地铁站可视化系统。

界面简介及效果展示

地铁运行效果

地铁从站外进入站内时,场景中会显示出透明度逐渐增强、速度逐渐减慢的效果,模拟真实列车进站过程。

漫游效果

系统支持自动巡检功能,场景会自动旋转和平移,展现地铁站的全貌。

监控设备交互效果

点击场景中的监控设备,可查看实时运行数据和设备状态,例如视频监控画面或烟雾报警信息。

场景搭建与模型优化

系统中大部分模型采用3dMax建模生成,并导出obj与mtl文件。HT for Web通过解析这些文件生成3D场景中的复杂模型。对于简单模型,直接使用HT进行轻量化HTML5/WebGL建模更为高效。以下是HT加载obj模型的示例代码:

ht.Default.loadObj('obj/metro.obj', 'obj/metro.mtl', {    center: true,    r3: [0, -Math.PI / 2, 0],    s3: [0.15, 0.15, 0.15],    finishFunc: function(modelMap, array, rawS3) {      ht.Default.setShape3dModel('metro', array);    }  });

上述代码通过加载地铁模型并注册为名称为'metro'的3D模型。若需在场景中使用该模型,可通过以下代码实现:

var node = new ht.Node();  node.s({    shape3d: 'metro'  });

动画代码实现分析

地铁动画主要通过修改X轴位置实现行进效果。以下是关键动画代码:

let metroTask = {    interval: 50,    action: (data) => {      if (data === currentMetro) {        const currentX = data.getX();        const speed = this.getSpeedByX(currentX);        const opacity = this.getOpacityByX(currentX);        if (Math.abs(currentX) ≤ 5000) {          opacity !== 1 ? currentMetro.s({            shape3d: {              transparent: true,              opacity: opacity            }          }) : currentMetro.s({            shape3d: {              transparent: false            }          });          data.setX(currentX + direction * speed);          if (speed === 0) this.doorAnimation(currentMetro, direction);        }        if (currentX > 5000 && direction === 1) {          currentMetro = leftMetro;          currentMetro.setX(5000);        }        if (currentX < -5000 && direction === -1) {          currentMetro = rightMetro;          currentMetro.setX(-5000);        }      }    }  };  dm3d.addScheduleTask(metroTask);

该代码实现了地铁的行进动画,通过不断修改X轴位置并获取速度和透明度,模拟列车的前进效果。地铁在达到终点后会自动切换到另一列车继续运行。

自动巡检功能实现

系统通过调整视角的位置实现自动巡检功能。HT提供的walk方法同时修改eye和center的位置,实现视角的平移。以下是自定义旋转函数的实现:

rotateStep() {    const fromCenter = this.fromCenter;    const toCenter = this.toCenter;    const rotateValue = this.rotateFrame || Math.PI / 180;    const centerVector = new ht.Math.Vector2(toCenter.x - fromCenter.x, toCenter.y - fromCenter.y);    const centerVectorLength = centerVector.length();    const rotatePercent = rotateValue * this.stepNum / this.curRotateVal;    if (rotatePercent ≥ 1) {      rotatePercent = 1;      this.stepNum = -2;    }    const newLength = rotatePercent * centerVectorLength;    centerVector.setLength(newLength);    const newCenterVector = centerVector.add(fromCenter);    const newCenterPosition = [newCenterVector.x, this.personHeight, newCenterVector.y];    this.g3d.setCenter(newCenterPosition);  }

该函数通过计算矢量方向上的比例,逐步调整视角的中心位置,实现了平滑的视角旋转效果。

电梯动画实现

电梯模型由多个三角形面拼接而成,通过平移顶点坐标实现运行动画。以下是电梯动画的实现伪代码:

setInterval(() => {    for (let i = 0, l = vs.length; i < l; i += 3) {      const nextX = vs[i];      const nextY = vs[i + 1];      vs[i] = nextX - xStep;      vs[i + 1] = nextY + yStep;      // 调整坐标范围      vs[i] = nextX < -0.5 ? 0.5 - (Math.abs(nextX) - 0.5) : nextX;      vs[i + 1] = nextY > 0.5 ? -0.5 + (Math.abs(nextY) - 0.5) : nextY;    }  }, 200);

上述代码通过循环调整顶点坐标,模拟电梯沿着X和Y轴平移的运行效果。

监控功能展示

视频监控

点击场景中的摄像头,可查看实时监控画面。以下为实现效果图:

烟雾报警

烟雾报警模型根据后台状态变换颜色,红色表示报警状态。以下为实现效果图:

电视到站时间

系统模拟电视显示下一班地铁到站时间。以下为效果图:

场景交互

3D场景中交互主要通过点击操作实现,例如点击摄像头可查看监控画面。以下是交互注册代码:

g3d.mi((e) => {    let { g2d, dm2d } = this;    if (e.kind === 'clickData') {      const data = e.data;      const shape3d = data.s('shape3d');      if (shape3d && shape3d.indexOf('摄像头') > 0) {        const cameraPanel = dm2d.getDataByTag('cameraPanel');        g2d.isVisible(cameraPanel) ? cameraPanel.s('2d.visible', false) : cameraPanel.s('2d.visible', true);      }    }    if (e.kind === 'clickBackground') {      const cameraPanel = dm2d.getDataByTag('cameraPanel');      g2d.isVisible(cameraPanel) && cameraPanel.s('2d.visible', false);    }  });

总结

工业互联网通过连接人、数据和机器,为地铁站3D可视化系统提供了强大支持。HT for Web的轻量化技术、数据可视化能力以及机器可视化能力,使得监控和管理更加便捷高效。未来,通过结合VR技术,可以实现身临其境的交互体验。系统同样适合在移动端运行,以下是移动端运行的截图:

程序运行截图:

转载地址:http://rpluz.baihongyu.com/

你可能感兴趣的文章
Netty工作笔记0070---Protobuf使用案例Codec使用
查看>>
Netty工作笔记0077---handler链调用机制实例4
查看>>
Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
查看>>
Netty工作笔记0085---TCP粘包拆包内容梳理
查看>>
Netty常用组件一
查看>>
Netty常见组件二
查看>>
netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
查看>>
Netty心跳检测机制
查看>>
Netty核心模块组件
查看>>
Netty框架内的宝藏:ByteBuf
查看>>
Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
查看>>
Netty源码—2.Reactor线程模型一
查看>>
Netty源码—3.Reactor线程模型三
查看>>
Netty源码—4.客户端接入流程一
查看>>
Netty源码—4.客户端接入流程二
查看>>
Netty源码—5.Pipeline和Handler一
查看>>
Netty源码—5.Pipeline和Handler二
查看>>
Netty源码—6.ByteBuf原理一
查看>>
Netty源码—6.ByteBuf原理二
查看>>
Netty源码—7.ByteBuf原理三
查看>>