日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > HTML > 正文

HTML5 WebGL 實現民航客機飛行監控系統

2024-08-26 00:21:35
字體:
來源:轉載
供稿:網友

前言

前些日子出差,在飛機上看到頭頂的監控面板,除了播放電視劇和廣告之外,還會時不時的切換到一個飛機航行的監控系統,不過整個監控系統讓人感到有一點點的簡陋,所以我就突發奇想制作了一個采用 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,飛行監控系統
 

總結

通過這個 demo ,我發現生活中有很多沒有被人所注意到的細節都存在數據可視化的可能,在這個大數據的時代更多的可能性值得被人發掘出來,不要錯個身邊每一個值得數據可視化的細節,這樣不僅可以更好的挖掘 HT for Web 的潛力,也可以加強自身身為一個程序員的綜合素質。


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
欧美日韩亚洲国内综合网| 欧美高清一级片在线| 久久婷婷国产| 亚洲免费播放| 亚洲福利视频在线| 精品对白一区国产伦| 日韩欧美视频一区二区三区四区| 高清在线一区| 精品在线网站观看| 久久网站免费观看| 久久精品免费看| 91麻豆精品国产91久久久使用方法| 伊人永久在线| 快she精品国产999| 日韩在线视频免费观看高清中文| www.av中文字幕| 一区三区二区视频| 精品久久香蕉国产线看观看gif| 亚欧成人精品| 亚洲.国产.中文慕字在线| 精品久久蜜桃| 日本啊v在线| 快she精品国产999| 国产又粗又猛又爽又黄91精品| 日韩欧美中文| 欧美在线视频一区二区| 久久99精品久久久久子伦| 一区二区精品免费| 国产福利一区二区在线精品| 99色在线视频| 欧美日韩性视频| 黄色资源在线观看| 一区二区三区在线不卡| 久久精品人妻一区二区三区| 中文字幕在线中文字幕二区| 中文字幕亚洲国产| 欧美一卡2卡三卡4卡5免费| 欧美日韩亚洲天堂| 久久精品蜜桃| 中文字幕在线观看亚洲| 日韩精品在线免费观看| 久久婷婷国产| 中文字幕亚洲一区二区av在线| 国产久卡久卡久卡久卡视频精品| 高清1区2区| 精品日本视频| 久久香蕉av| 国产成人精品av久久| 欧美日韩91| 亚洲中文字幕在线一区| 91蜜桃在线视频| 亚洲成年人影院在线| 欧美日韩综合不卡| 色综合天天综合网天天狠天天| 久久精品久久精品亚洲人| 一区二区91| 精品999视频| 视频一区二区精品的福利| 内射国产内射夫妻免费频道| 日韩在线视频一区二区三区| 国产欧美日韩综合| 91精品国产色综合久久久蜜香臀| 免费看日韩精品| 国产成人精品999| 91久久视频| 丰满少妇一区| 国产免费一级| 亚洲国产欧美91| 国产 欧美 在线| 国产免费永久在线观看| 日韩欧美不卡在线| 久久99久久久久久久噜噜| 91精品久久久久久久久久| 老司机久久99久久精品播放免费| 91精品国产免费久久综合| 日韩久久不卡| 亚洲大片精品永久免费| 精品中文字幕在线| 日韩中文字幕精品视频| 91精品蜜臀在线一区尤物| 午夜视频在线观看一区| 精品色蜜蜜精品视频在线观看| 欧美日韩精品在线 | 日韩视频一区二区在线观看| 日本熟女一区二区| 日韩欧美一卡二卡| 国产日韩中文字幕在线| 中文字幕在线观看网址| 国产乱码在线观看| 日韩国产一区久久| 中文字幕在线官网| 欧美日韩精品三区| 国产在线拍偷自揄拍精品| 91精品久久久久| 亚洲精品欧美二区三区中文字幕| 国产成人日日夜夜| 日韩中文字幕在线播放| 中文字幕在线高清| 日韩一级在线视频| 欧美性生交大片免费| 久艹在线视频| 欧美日韩精品久久久| 日韩视频精品在线观看| 91欧美日韩| 91精品视频播放| 婷婷中文字幕综合| 欧美日韩在线播放一区| 成人一区二区不卡免费| 热久久精品国产| 久久91精品久久久久久秒播| 91色在线看| 亚洲视频 中文字幕| 日韩免费不卡avV| 欧美在线视频一区二区| 91精品国产色综合久久不卡蜜臀 | 国产高清在线视频| www.久久久精品| 欧美1234区| 色屁屁一区二区| 在线欧美日韩精品| 亚洲欧美中文字幕| 国产1区在线| 精品视频三区| 中文在线不卡视频| 欧美日韩亚洲91| 91日韩中文字幕| 国产精久久久久| 综合图区亚洲白拍在线| 欧美三级免费观看| 999精品在线| 精品极品三级久久久久| 国产欧美日韩在线看| 91精品国产91综合久久蜜臀| 日韩不卡一区二区| 亚洲中文字幕一区| 日韩视频一区在线观看| 欧美日韩中文国产| 久久精品日韩欧美| 精品成人久久久| 国产欧美日韩第一页| 欧美中文字幕在线视频| 成人一区二区不卡免费| 中文字幕一区二区三区精品| 中文字幕4区| 国产三级视频在线| av免费观看国产| 麻豆精品99| 精品久久人人做人人爽 | 久久中文精品| 免费高清特黄a大片| 日韩精品视频在线免费观看| 国产黄色片中文字幕| 欧美变态tickling挠脚心| 国产午夜精品视频免费不卡69堂| 91久久精品网| 日韩欧美在线网站| 国产免费久久| 欧美二区在线观看| 日韩国产91| 在线看的av| 欧美日韩激情一区| 日韩精品a在线观看91| 97久久精品| www日韩在线观看| 日韩中文欧美| 免费看黄资源大全高清| 欧美国产亚洲一区| 日韩精品丝袜在线| 久久91精品久久久久久秒播| 91精品在线观看入口| 欧美日韩国产免费观看| 日韩精品福利一区二区三区| 视频一区二区中文字幕| 精品三级久久| 在线观看免费国产成人软件 | 欧美日韩激情一区| 自拍日韩亚洲一区在线| 五月综合激情日本mⅴ| 免费高清视频日韩| 日韩专区视频网站| 久久精品蜜桃| 日韩专区视频网站| 亚洲免费在线视频一区 二区| 一区二区欧美国产| av中文天堂在线| 午夜一区二区三区| 免费在线视频一区二区| 欧美日韩亚洲国产综合| 国产黄在线播放| 一区二区三区四区五区视频在线观看| 91精品国产手机| 欧美日韩在线三级| 国产欧美日韩视频| 国产欧美日韩在线| 视频一区二区精品的福利| 欧美日韩在线不卡| 日韩亚洲欧美中文高清在线| 中文字幕久久精品| 久久99久久99精品中文字幕| 精品综合久久久久| 精品999视频| 亚洲三级网站| 欧美在线日韩精品| 国产专区中文字幕| av午夜在线| www在线视频| 国产黄色在线网站| 亚洲综合在线小说| 不卡在线一区二区| 视频一区二区精品的福利| 欧美片网站免费| 久久蜜桃一区二区| 日韩精品久久久| 日韩精品国产欧美| 77777_亚洲午夜久久多人| 不卡在线一区二区| 国产天堂素人系列在线视频| 欧美日韩国产亚洲一区| 另类专区欧美| 中文字幕在线观看国产| 香蕉人人精品| 欧美一级在线观看| 国产欧美一级| 国产亚洲二区| 欧美wwww| 成人ww免费完整版在线观看| 91精品国产调教在线观看 | 日韩欧美999| 国产偷久久久精品专区| 色综合婷婷久久| 亚洲男人在线| 国产亚洲视频中文字幕视频| 1024国产在线| 欧美日韩在线观看成人| а√天堂8资源中文在线| 亚洲一区视频在线观看视频| 精品国产1区2区3区| 日韩久久久精品| 国产91久久久久蜜臀青青天草二| 久久91精品久久久久久秒播| 国产激情在线视频| 国产欧美日韩久久| 久久久久久91| 免费国产成人看片在线| 欧美日韩精品不卡| 999精品视频在线观看播放| 日韩免费久久| 91久久久久| 久久精品久久久久| 黄色一级大片在线免费看国产一| 91精品国产经典在线观看| 日韩精品首页| 国产日韩精品视频| 中文字幕日韩免费视频| 欧美日韩综合色| 又黄又www的网站| 欧美日韩三级视频| 国产福利第一页| www.三级.com| 欧美日韩精品在线播放| a天堂中文在线官网在线| 欧美日韩在线观看成人| 日韩精品视频免费在线观看| 亚洲综合在线小说| 欧美二三四区| 日韩精品一区二区三区视频播放| 欧美中文字幕在线| 日韩欧美一级精品久久| 一区二区不卡视频在线观看| 日韩亚洲欧美中文高清在线| 精品三级久久| 在线中文字幕网站| 美女黄a一级视频| 精品一二三四| 亚洲第一视频在线观看| wwwav91com| 日韩午夜黄色| av免费在线播放| 日韩免费视频一区二区视频在线观看| 日韩在线观看a| 欧美日韩国产在线观看| 国产91久久久久| 国产区在线看| 一区二区在线看| 中文字幕 日韩 欧美| 精品欧美日韩| 内射国产内射夫妻免费频道| lutube成人福利在线观看| 亚洲中午字幕| 欧美国产综合视频| 国产一级久久久| 亚洲综合中文字幕在线| 亚洲综合日韩| 中文在线不卡视频| 亚洲三级免费看| 日韩在线中文视频| 亚洲大片免费看| 中文字幕 欧美 日韩| wwwwww在线观看| 精品999视频| 国产资源在线观看| 日韩在线观看一区| 国产91欧美| 日韩一级免费在线观看| 亚洲视频 中文字幕| 亚洲成av人片在线| 亚洲狠狠婷婷综合久久久久图片| 亚洲午夜久久| 韩国一区二区av| 欧美一级一级性生活免费录像| 欧美 日韩 国产 在线观看| 日韩免费久久| 亚洲a级在线播放观看| 香蕉精品久久| 欧美日韩高清一区二区不卡| www.91香蕉视频| 国产高清视频一区二区| 久久久久久自在自线| 日韩黄色在线播放| 国产资源在线观看| 亚洲免费精品视频| 最近中文字幕第一页| 日本中文字幕在线观看| 精品乱子伦一区二区| 免费高清特黄a大片| 婷婷久久综合网| 亚洲乱码在线观看| 成人a在线观看| 久久婷婷综合国产| 国产手机视频一区二区| 国产又粗又猛又爽又黄91精品| 日韩精品中文字幕第1页| 日韩精品大片| 亚洲一区中文字幕在线观看| 91欧美日韩| 日本黄色一区二区三区| 日韩欧美在线网站| 欧美日韩一二三| 91精品国产丝袜白色高跟鞋| 亚洲免费精品视频| 最新中文在线视频| 欧美日韩在线播放一区| 亚州福利视频| 影音先锋中文字幕在线观看| 欧美区高清在线| 亚洲а∨精品天堂在线| 亚洲综合在线小说| 日韩av二区| 国产亚洲人成a一在线v站| 国产一级在线播放| 日韩不卡一二三区| 久久精品在线免费观看| 中文字幕日韩欧美在线视频| 亚洲免费福利视频| 精品久久在线| 91精品国产高清| 一区精品在线播放| 欧美日韩国产免费观看| 影音先锋一区二区资源站| 国产免费电影网站入口| 亚洲综合三区| 亚洲三级中文字幕| 亚洲 欧美 中文字幕| 91欧美在线视频| 色综合婷婷久久| 精品国产免费视频| 丰满少妇一区| 国产字幕在线看| 国产福利一区二区| 深夜福利一区| 午夜精品一区二区三区免费视频| 国产乱码午夜在线视频| 欧洲精品二区| 日本亚洲欧美| 亚洲综合欧美在线| 视频一区日韩| 美日韩精品免费视频| 中文在线不卡视频| 日韩欧美中文字幕公布| 欧美日韩精品欧美日韩精品一| 欧美日韩三级一区| 精品一区二区三区中文字幕在线| a视频免费在线观看| 亚洲三级av| 91精品国产入口| 精品999在线| 精品日韩视频在线观看 | 国产中文在线| 亚洲高清视频在线| 中文字幕欧美日韩va免费视频 | 一区二区视频在线| 中文字幕日韩第一页| 日韩亚洲欧美中文字幕| 精品国产99久久久久久 | www.91香蕉视频| 日本视频久久久| 亚洲高清在线免费| 中文字幕国产欧美| 日本一欧美一欧美一亚洲视频| 日韩不卡一二区|