返回顶部
首页 > 资讯 > 精选 >HTML5中WebGL怎么实现民航客机飞行监控系统
  • 318
分享到

HTML5中WebGL怎么实现民航客机飞行监控系统

2023-06-09 21:06:15 318人浏览 八月长安
摘要

这篇文章给大家分享的是有关HTML5中webGL怎么实现民航客机飞行监控系统的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前些日子出差,在飞机上看到头顶的监控面板,除了播放电视剧和广告之外,还会时不时的切换到一个

这篇文章给大家分享的是有关HTML5webGL怎么实现民航客机飞行监控系统的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

前些日子出差,在飞机上看到头顶的监控面板,除了播放电视剧和广告之外,还会时不时的切换到一个飞机航行的监控系统,不过整个监控系统让人感到有一点点的简陋,所以我就突发奇想制作了一个采用 HT for WEB 的升级版监控系统,demo 的效果还行,发出来大家相互学习下。

HTML5中WebGL怎么实现民航客机飞行监控系统
 

demo

实现过程

云中穿行效果

为了达到飞机云中穿行的效果,最开始我遇到的问题是飞机飞行的层次感,也就通常所说的透视效果,这里我采用的是云通道和云背景以不同的速度流动,制造一种飞行的透视效果。

云我采用的是贴图的方式呈现的,但是仅仅是贴图会遮挡天空和飞机,非常影响飞机飞行的观感,所以我开启了相应图元的 transparent 和 opacity ,云背景和云通道设置不同的透明度,不仅增加了层次感,还会让人产生云朵从眼前飘过的错觉。

云通道采用的是 ht.Polyline 类型,通道缩放拉大了 Y 轴的比例,使云通道有更大的纵向空间,设置 reverse.flip 背拷贝使云通道内部也显示出贴图,仿佛让飞机置身于云海中穿梭;云背景采用 ht.node 类型,只设置一个面显示充当云背景。

整体的云流动效果采用 offset 偏移实现,改变相应图元或相应图元面的贴图偏移量来达到飞机云中穿行的效果, 代码如下:
 

var i = 1,     p = 0;setInterval(() => {    i -= 0.1; p += 0.005;    clouds.s('shape3D.uv.offset', [i, 0]);    cloudBackground.s('all.uv.offset', [p, 0]);}, 100);

升降颠簸效果

虽然达到了飞机云中穿行的效果,但是如果飞机只是直直的飞行,那也会降低飞行的实感,相信坐过飞机的朋友肯定都遇到过因气流产生的颠簸,也经常感受到飞机飞行途中的爬升和下降,这其实是因为飞机的航线并不是一直固定在一个高度上,有时会爬升有时会下降,所以我就用 ht-animation.js HT 动画扩展插件去实现飞机颠簸效果,代码如下:

dm.enableAnimation(20);plane.setAnimation({    back1: {        from: 0,        to: 160,        easing: 'Cubic.easeInOut',        duration: 8000,        next: "up1",        onUpdate: function (value) {            value = parseInt(value);            var p3 = this.p3();            this.p3(value, p3[1], p3[2]);        }    },    //...省略相似    start: ["back1"]});

球扇形视角限制

飞行效果完善之后,这时我就遇到了一个比较棘手的问题,因为实际上虽然看着飞机是在云海中穿梭,但是仅仅是在通道中飞行,背景其实也只是平面贴图,所以当视角到达某种程度的时候就会有强烈的违和感和不真实感,就需要一个视角限制,使视角的调整刚刚好在一个范围内。

视角限制的话一般是限制 g3d 的 eye 和 center ,不太了解的朋友可以去看 hightopo 官网中的 3d 手册,里面有详细的说明,这里我就不再赘述了;因为视角范围的关系,所以我决定固定 center 的位置,代码如下:
 

g3d.addPropertyChangeListener(e => {    // 固定中心点    if (e.property === 'center') {        e.newValue[0] = center[0];        e.newValue[1] = center[1];        e.newValue[2] = center[2];    }}

然后再把 eye 限制在某一个范围内就大功告成了,然而这里却并不是那么简单,最开始我把 eye 限制在一个立方体的空间内,但交互效果很不理想,考虑到 g3d 默认交互中,鼠标拖拽平移视角变换时,实际上 eye 是在一个以 center 为球心的球面上运动的,所以我决定从这个球中挖出来一块作为 eye 的限制空间,也就是球扇形,不太理解的朋友可以参考这个图:

HTML5中WebGL怎么实现民航客机飞行监控系统
 

球扇形视角限制,一共需要三个参数,分别是中心参考轴、中心轴和外边所成角度、所在球限制半径,其中中心参考轴可根据初始 eye 和 center 的连接延长线确定,所在球限制半径又分最大限制和最小限制,代码如下:

function limitEye(g3d, eye, center, options) {    var limitMaxL   = options.limitMaxL,        limitMinL   = options.limitMinL,        limitA      = options.limitA;    g3d.addPropertyChangeListener(e => {        // 固定中心点        if (e.property === 'center') {            e.newValue[0] = center[0];            e.newValue[1] = center[1];            e.newValue[2] = center[2];        }        // 限制视角        if (e.property === 'eye') {            var newEyeV = new ht.Math.Vector3(e.newValue),                centerV = new ht.Math.Vector3(center),                refEyeV = new ht.Math.Vector3(eye),                refVector = refEyeV.clone().sub(centerV),                newVector = newEyeV.clone().sub(centerV);            if (centerV.distanceTo(newEyeV) > limitMaxL) {                newVector.setLength(limitMaxL);                e.newValue[0] = newVector.x;                e.newValue[1] = newVector.y;                e.newValue[2] = newVector.z;            }            if (centerV.distanceTo(newEyeV) < limitMinL) {                newVector.setLength(limitMinL);                e.newValue[0] = newVector.x;                e.newValue[1] = newVector.y;                e.newValue[2] = newVector.z;            }            if (newVector.angleTo(refVector) > limitA) {                var oldLength = newVector.length(),                    oldAngle  = newVector.angleTo(refVector),                    refLength = oldLength * Math.cos(oldAngle),                    vertVector,                    realVector,                    realEye;                refVector.setLength(refLength);                newEyeV = newVector.clone().add(centerV);                refEyeV = refVector.clone().add(centerV);                vertVector = newEyeV.clone().sub(refEyeV);                vertLength = refLength * Math.tan(limitA);                vertVector.setLength(vertLength);                realVector = vertVector.clone().add(refEyeV).sub(centerV);                realVector.setLength(oldLength);                realEye = realVector.clone().add(centerV);                // 防止移动角度大于 180 度,视角反转                if (oldAngle > Math.PI / 2) {                    realEye.negate();                }                e.newValue[0] = realEye.x;                e.newValue[1] = realEye.y;                e.newValue[2] = realEye.z;            }          }    })}

HTML5中WebGL怎么实现民航客机飞行监控系统

飞机监控系统

当然作为监控系统,自然要有监控了,增加右下角的小地图,并提供三种模式,分别是聚焦飞机,聚焦飞行轨迹和聚焦地图,并根据飞机的飞行方向控制飞行轨迹的流动效果,其中聚焦飞机会跟随飞机移动进行 fitData ,使飞机一直处于小地图的中心,代码如下:

var fitFlowP = function (e) {    if (e.property === 'position' && e.data === plane) {        mapGV.fitData(plane, false);    }};buttonP.s({    'interactive': true,    'onClick': function (event, data, view, point, width, height) {        map.a('fitDataTag', 'plane2D');        mapGV.fitData(plane, false);        mapDM.md(fitFlowP);    }});buttonL.s({    'interactive': true,    'onClick': function (event, data, view, point, width, height) {        mapDM.umd(fitFlowP);        map.a('fitDataTag', 'flyLine');        mapGV.fitData(flyLine, false);    }});// ...省略

HTML5中WebGL怎么实现民航客机飞行监控系统

增加鼠标移到飞机相应位置进行名称的提示、双击后显示飞机相应位置的信息面板并将视角聚焦到面板上、点击飞机任意地方切换回飞机飞行模式等效果。

HTML5中WebGL怎么实现民航客机飞行监控系统
 

左侧增加监控面板替代上面提到的双击相应位置这步操作直接聚焦到相应位置的信息面板上,这里按钮开启了交互并添加了相应的交互逻辑,代码如下:

button_JC.s({    'interactive': true,    'onClick': function (event, data, view, point, width, height) {        event.preventDefault();        let g3d = G.g3d,            g3dDM = G.g3d.dm();        g3d.fireInteractorEvent({            kind: 'doubleClickData',            data: g3dDM.getDataByTag(data.getTag())        })    }});//...省略

HTML5中WebGL怎么实现民航客机飞行监控系统

天空渲染效果

既然是监控系统肯定是 24 小时无差别的监控,这就涉及到一个问题,我总不可能半夜的时候飞机也从瓦蓝瓦蓝的天空上飞过,这就很欠缺真实性了,所以要有一个天空从亮到暗再从暗到亮的过程,这个过程我暂定到 06:00-06:30 和19:00-19:30 这两个时间段。

天空采用的是 shape3d : 'sphere' 球形,包裹整个场景,然后使用 reverse.flip 背拷贝 和 blend 染色,之后天空就可以渲染成我想要的颜色,如果按照时间改变天空明暗只要改变染色值就可以了。

但是由于白天和晚上光照情况的不同,云反射光的强度也不同,就导致了白天和晚上云的差异,所以也要调整云道和云背景的贴图的 opacity 透明度,晚间更为透明度,代码如下:

if ((hour > 6 && hour < 19) || (hour == 6 && minutes >= 30)) {    timePane && timePane.a({        'morning.visible': false,        'day.visible': true,        'dusk.visible': false,        'night.visible': false,        'day.opacity': 1    })    skyBox.s({        "shape3d.blend": 'rgb(127, 200, 240)',    })    cloudBackground.s({        "back.opacity": 0.7,    })    clouds.s({        "shape3d.opacity": 0.7,    })} else if ((hour < 6 || hour > 19) || (hour == 19 && minutes >= 30)) {//...省略} else if (hour == 6 && minutes < 15 ) {//...省略} else if (hour == 6 && minutes >= 15 && minutes < 30) {//...省略} else if (hour == 19 && minutes < 15) {//...省略} else if (hour == 19 && minutes >= 15 && minutes < 30) {//...省略}

HTML5中WebGL怎么实现民航客机飞行监控系统

这里我还增加了对右上角时间面板时间状态图标的支持,并增加了图标切换时的渐隐渐显效果,同时给时间面板状态图标位置增加了点击切换到下一时间状态的功能。

为了演示效果我增加了时间倍速按钮,下图是 500 倍时间流速下的变化情况:

HTML5中WebGL怎么实现民航客机飞行监控系统

感谢各位的阅读!关于“html5中WebGL怎么实现民航客机飞行监控系统”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: HTML5中WebGL怎么实现民航客机飞行监控系统

本文链接: https://lsjlt.com/news/257863.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • HTML5中WebGL怎么实现民航客机飞行监控系统
    这篇文章给大家分享的是有关HTML5中WebGL怎么实现民航客机飞行监控系统的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前些日子出差,在飞机上看到头顶的监控面板,除了播放电视剧和广告之外,还会时不时的切换到一个...
    99+
    2023-06-09
  • HTML5 WebGL怎么实现的医疗物流系统
    小编给大家分享一下HTML5 WebGL怎么实现的医疗物流系统,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言物联网( IoT ),简单的理解就是物体之间通过互...
    99+
    2023-06-09
  • 怎么在HTML5中使用WebGL实现一个垃圾分类系统
    怎么在HTML5中使用WebGL实现一个垃圾分类系统?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。gv.setMovableFunc(() => {&...
    99+
    2023-06-09
  • 怎么实现一个前端监控回放系统
    本篇内容主要讲解“怎么实现一个前端监控回放系统”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么实现一个前端监控回放系统”吧!1 / 实现方案思路要想给用户的访...
    99+
    2024-04-02
  • SpringBoot怎么配置Actuator组件实现系统监控
    这篇文章主要介绍“SpringBoot怎么配置Actuator组件实现系统监控”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot怎么配置Actuator组件实现系统监控”文章能帮助大...
    99+
    2023-06-08
  • 怎么实现Linux系统性能测试和监控
    本篇文章给大家分享的是有关怎么实现Linux系统性能测试和监控,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。性能测试([Unixbench]) [root@local...
    99+
    2023-06-28
  • 在Linux系统中怎么使用iptraf进行网络监控
    这篇文章主要讲解了“在Linux系统中怎么使用iptraf进行网络监控”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在Linux系统中怎么使用iptraf进行网络监控”吧!iptraf是一个...
    99+
    2023-06-12
  • CentOS7中怎么对系统进行基本的性能监控和优化
    在CentOS7中,可以使用以下工具来进行基本的系统性能监控和优化: 使用top命令监控系统性能:top命令可以实时查看系统的C...
    99+
    2024-03-04
    CentOS7
  • java中怎么实现一个航空用户管理系统
    这期内容当中小编将会给大家带来有关java中怎么实现一个航空用户管理系统,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。用户模块: 用户添加2. 密码修改3. 个人信息查看4. 账号状态修改(禁用0、启用1...
    99+
    2023-06-20
  • 怎么利用Shell脚本实现邮件监控Linux系统的内存
    这篇文章给大家介绍怎么利用Shell脚本实现邮件监控Linux系统的内存,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、安装Linux下面的一个邮件客户端Msmtp软件(类似于一个Foxmail的工具)**1、下载安...
    99+
    2023-06-28
  • python监控日志中的报错并进行邮件报警怎么实现
    今天小编给大家分享一下python监控日志中的报错并进行邮件报警怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实现思...
    99+
    2023-07-02
  • JAVA中怎么进行图书管理系统的实现
    今天给大家介绍一下JAVA中怎么进行图书管理系统的实现。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。一、简介在学习了Java语法的类、接口、继承、多态、接口等...
    99+
    2023-06-28
  • 使用java怎么在控制台中实现一个学生信息管理系统
    使用java怎么在控制台中实现一个学生信息管理系统?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作