日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于WebGL架构的3D可视化平台—城市地下管线3D可视化

發布時間:2024/3/12 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于WebGL架构的3D可视化平台—城市地下管线3D可视化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言
城市管網是城市最重要的公共基礎設施之一,與城市的發展和居民日常生活息息相關。根據不同的市政建設,管網分供水、排污、供暖、通信、電力等多種類別,其廣泛分布遍及地下。隨著城市發展建設所衍生出空間分布復雜,變化大,種類繁多等問題,可視化管理是未來發展最好的解決方案。

Demo預覽



實現

第一步,加載場景

//加載場景代碼 var app = new THING.App({// 場景地址"url": "http://www.thingjs.com/./uploads/wechat/S2Vyd2lu/scene/Demo_地下管線",//背景設置"skyBox": "BlueSky" });

第二步,創建管線以及創建管線信息面板。這里PolygonLine這種類型我們在之前的Demo中使用過沒看過的同學可以點進去看一下,當然那篇比較糙還是沒有這篇好看的,可以兩篇對比一下效果,文章地址。這里這個renderOrder屬性劃重點,這里將line的visible屬性設置為false,當場景加載完成后我們的管線就已經創建好了為了能更好的配合我們的面板所以給他先隱藏掉了,等到開關觸發再對他進行展示。

function createLine(name, color, points) {var line = null;line = app.create({type: 'PolygonLine',name: name,points: points,style: {color: color,},});line.renderOrder = -10000;line.scrollUV = true;line.visible = false;return line; }function createInfo(obj, position) {var panel = new THING.widget.Panel({template: 'default2',width: '120px',cornerType: 'polyline'})var dataObj = {name: obj.name,color: obj.style.color}panel.addString(dataObj, 'name').caption('名稱');panel.addString(dataObj, 'color').caption('顏色');var uiAnchor = app.create({type: 'UIAnchor',parent: obj,element: panel.domElement,position: [position[0], -1, position[2]],pivot: [-0.2, 2.1]});return uiAnchor; }

第三步,創建功能面板以及創建各種類管線。

//管線的模擬數據 var dataJson = [{ 'id': 'BJ002', 'starId': '2TAG001', 'stopId': '2TAG002', 'starDeep': '-1.5', 'stopDeep': '-1.5', 'material': 'ASTNX01', 'pressure': '120' }, { 'id': 'BJ002', 'starId': '2TAG001', 'stopId': '2TAG002', 'starDeep': '-1.5', 'stopDeep': '-1.5', 'material': 'ASTNX01', 'pressure': '120' }, { 'id': 'BJ002', 'starId': '2TAG001', 'stopId': '2TAG002', 'starDeep': '-1.5', 'stopDeep': '-1.5', 'material': 'ASTNX01', 'pressure': '120' }]; app.on('load', function () {// init_camera app.camera.flyTo({'position': [-6.199233956799988, 49.47465259648085, 113.74453304853118],'target': [-4.002967317456267, 26.055382001258867, 37.65111202780902],'time': 2000,});//創建場景var controlPanel = new THING.widget.Panel({titleText: '地下管線Demo',hasTitle: true, // 是否有標題zIndex: 999, // 設置層級});var data = {totalOpen: false,viewOpen: false,waterOpen: false,blowOffOpen: false,heatOpen: false};//openTotal按鈕控制var totalOpen = controlPanel.addBoolean(data, 'totalOpen').caption('狀態切換');totalOpen.on('change', function (ev) {if (ev) {//將campus下所有的obj的opacity = 0.4,將name = Uncorrelated 的obj的visiable = falseapp.query('Campus')[0].style.opacity = 0.3;app.query('Uncorrelated')[0].visible = false;} else {//反之初始化app.query('Campus')[0].style.opacity = 1;app.query('Uncorrelated')[0].visible = true;}});//viewOpen視角控制var viewOpen = controlPanel.addBoolean(data, 'viewOpen').caption('2D/3D');viewOpen.on('change', function (ev) {if (ev) {app.camera.viewMode = THING.CameraView.TopView;} else {app.camera.viewMode = THING.CameraView.Normal;app.skyBox = 'BlueSky';}});//waterOpen供水管線 color #0000FFvar waterOpen = controlPanel.addBoolean(data, 'waterOpen').caption('供水管線');var waterLine = [];waterLine.push(createLine('供水管線', 'https://thingjs.com/static/images/poly_line_04.png', [[-61.736, -1.5, 10], [74.408, -1.5, 10]]));waterLine.push(createLine('供水管線', 'https://thingjs.com/static/images/poly_line_04.png', [[-61.736, -1.50, 8], [-16.126, -1.50, 8], [-16.126, -1.50, -20], [-10.126, -1.50, -20], [-10.126, -1.50, 8], [74.408, -1.5, 8]]));waterLine.push(createLine('供水管線', 'https://thingjs.com/static/images/poly_line_04.png', [[-61.736, -1.50, 12], [-45.001, -1.5, 15.755], [-20.736, -1.5, 12], [74.408, -1.5, 12]]));waterLine.push(createLine('供水管線', 'https://thingjs.com/static/images/poly_line_04.png', [[4, -1.5, 46], [4, -1.50, 13.809], [4, -2, 13.809], [4, -2, 6], [4, -1.50, 6], [4, -1.5, -34]]));waterLine.push(createLine('供水管線', 'https://thingjs.com/static/images/poly_line_04.png', [[6, -1.50, 46], [6, -1.50, 13.809], [6, -2, 13.809], [6, -2, 6], [6, -1.50, 6], [6, -1.5, -34]]));waterLine.push(createLine('供水管線', 'https://thingjs.com/static/images/poly_line_04.png', [[8, -1.50, 46], [8, -1.50, 13.809], [8, -2, 13.809], [8, -2, 6], [8, -1.50, 6], [8, -1.5, -34]]));createInfo(waterLine[0], dataJson[0],[-28.847, -1.5, 7.957]);waterOpen.on('change', function (ev) {waterLine.forEach(function (obj) {obj.visible = ev;})});//blowOffLine排污管線 color #FFEC8Bvar blowOffOpen = controlPanel.addBoolean(data, 'blowOffOpen').caption('排污管線');var blowOffLine = [];blowOffLine.push(createLine('排污管線', 'https://thingjs.com/static/images/poly_line_03.png', [[-2, -3, 46], [-2, -3, -34]]));blowOffLine.push(createLine('排污管線', 'https://thingjs.com/static/images/poly_line_03.png', [[0, -3, 46], [0, -3, -34]]));blowOffLine.push(createLine('排污管線', 'https://thingjs.com/static/images/poly_line_03.png', [[-61.736, -3, 4], [74.408, -3, 4]]));blowOffLine.push(createLine('排污管線', 'https://thingjs.com/static/images/poly_line_03.png', [[-61.736, -3, 2], [74.408, -3, 2]]));createInfo(blowOffLine[0], dataJson[1],[15.299, -1.5, 1.87]);blowOffOpen.on('change', function (ev) {blowOffLine.forEach(function (obj) {obj.visible = ev;})});//heatLine供熱管線 color #FF7F24var heatOpen = controlPanel.addBoolean(data, 'heatOpen').caption('供熱管線');var heatLine = [];heatLine.push(createLine('供熱管線', 'https://thingjs.com/static/images/poly_line_02.png', [[-61.736, -2, 0], [65.736, -2, 0], [74.408, -2, -8]]));heatLine.push(createLine('供熱管線', 'https://thingjs.com/static/images/poly_line_02.png', [[-61.736, -2, -2], [65.736, -2, -2], [74.408, -2, -10]]));heatLine.push(createLine('供熱管線', 'https://thingjs.com/static/images/poly_line_02.png', [[-4, -2, 46], [-4, -2, -34]]));heatLine.push(createLine('供熱管線', 'https://thingjs.com/static/images/poly_line_02.png', [[-6, -2, 46], [-6, -2, -34]]));createInfo(heatLine[0], dataJson[2],[-6.041, -1.817, 8.865]);heatOpen.on('change', function (ev) {heatLine.forEach(function (obj) {obj.visible = ev;})});

小結
這個取點坐標的方法在上文中沒有告訴大家,只是因為我原來用的方法就比較傻了,我是自己寫了一個全局的singleclick事件,觸發之后打印出當前鼠標的pickedPosistion記錄下來再寫進數組中,這無疑的是很麻煩的操作。
其實ThingJS已經給我們寫好了一個工具叫做拾取場景坐標,他的使用方式下面我會給大家貼幾張圖。整個代碼100+行還是比較簡潔了(作者能力有限,已經努力精簡了下文可以給作者多提意見,虛心接受)。最后附上完整代碼!



完整代碼

//加載場景代碼 var app = new THING.App({// 場景地址"url": "http://www.thingjs.com/./uploads/wechat/S2Vyd2lu/scene/Demo_地下管線",//背景設置"skyBox": "BlueSky" });app.on('load', function () {// init_camera app.camera.flyTo({'position': [-6.199233956799988, 49.47465259648085, 113.74453304853118],'target': [-4.002967317456267, 26.055382001258867, 37.65111202780902],'time': 2000,});//創建場景var controlPanel = new THING.widget.Panel({titleText: '地下管線Demo',hasTitle: true, // 是否有標題zIndex: 999, // 設置層級});var data = {totalOpen: false,viewOpen: false,waterOpen: false,blowOffOpen: false,heatOpen: false};//openTotal按鈕控制var totalOpen = controlPanel.addBoolean(data, 'totalOpen').caption('狀態切換');totalOpen.on('change', function (ev) {if (ev) {//將campus下所有的obj的opacity = 0.4,將name = Uncorrelated 的obj的visiable = falseapp.query('Campus')[0].style.opacity = 0.3;app.query('Uncorrelated')[0].visible = false;} else {//反之初始化app.query('Campus')[0].style.opacity = 1;app.query('Uncorrelated')[0].visible = true;}});//viewOpen視角控制var viewOpen = controlPanel.addBoolean(data, 'viewOpen').caption('2D/3D');viewOpen.on('change', function (ev) {if (ev) {app.camera.viewMode = THING.CameraView.TopView;} else {app.camera.viewMode = THING.CameraView.Normal;app.skyBox = 'BlueSky';}});//waterOpen供水管線 color #0000FFvar waterOpen = controlPanel.addBoolean(data, 'waterOpen').caption('供水管線');var waterLine = [];waterLine.push(createLine('供水管線', 'https://thingjs.com/static/images/poly_line_04.png', [[-61.736, -1.5, 10], [74.408, -1.5, 10]]));waterLine.push(createLine('供水管線', 'https://thingjs.com/static/images/poly_line_04.png', [[-61.736, -1.50, 8], [-16.126, -1.50, 8], [-16.126, -1.50, -20], [-10.126, -1.50, -20], [-10.126, -1.50, 8], [74.408, -1.5, 8]]));waterLine.push(createLine('供水管線', 'https://thingjs.com/static/images/poly_line_04.png', [[-61.736, -1.50, 12], [-45.001, -1.5, 15.755], [-20.736, -1.5, 12], [74.408, -1.5, 12]]));waterLine.push(createLine('供水管線', 'https://thingjs.com/static/images/poly_line_04.png', [[4, -1.5, 46], [4, -1.50, 13.809], [4, -2, 13.809], [4, -2, 6], [4, -1.50, 6], [4, -1.5, -34]]));waterLine.push(createLine('供水管線', 'https://thingjs.com/static/images/poly_line_04.png', [[6, -1.50, 46], [6, -1.50, 13.809], [6, -2, 13.809], [6, -2, 6], [6, -1.50, 6], [6, -1.5, -34]]));waterLine.push(createLine('供水管線', 'https://thingjs.com/static/images/poly_line_04.png', [[8, -1.50, 46], [8, -1.50, 13.809], [8, -2, 13.809], [8, -2, 6], [8, -1.50, 6], [8, -1.5, -34]]));createInfo(waterLine[0], dataJson[0],[-28.847, 0, 7.957]);waterOpen.on('change', function (ev) {waterLine.forEach(function (obj) {obj.visible = ev;})});//blowOffLine排污管線 color #FFEC8Bvar blowOffOpen = controlPanel.addBoolean(data, 'blowOffOpen').caption('排污管線');var blowOffLine = [];blowOffLine.push(createLine('排污管線', 'https://thingjs.com/static/images/poly_line_03.png', [[-2, -3, 46], [-2, -3, -34]]));blowOffLine.push(createLine('排污管線', 'https://thingjs.com/static/images/poly_line_03.png', [[0, -3, 46], [0, -3, -34]]));blowOffLine.push(createLine('排污管線', 'https://thingjs.com/static/images/poly_line_03.png', [[-61.736, -3, 4], [74.408, -3, 4]]));blowOffLine.push(createLine('排污管線', 'https://thingjs.com/static/images/poly_line_03.png', [[-61.736, -3, 2], [74.408, -3, 2]]));createInfo(blowOffLine[0], dataJson[1],[15.299, 0, 1.87]);blowOffOpen.on('change', function (ev) {blowOffLine.forEach(function (obj) {obj.visible = ev;})});//heatLine供熱管線 color #FF7F24var heatOpen = controlPanel.addBoolean(data, 'heatOpen').caption('供熱管線');var heatLine = [];heatLine.push(createLine('供熱管線', 'https://thingjs.com/static/images/poly_line_02.png', [[-61.736, -2, 0], [65.736, -2, 0], [74.408, -2, -8]]));heatLine.push(createLine('供熱管線', 'https://thingjs.com/static/images/poly_line_02.png', [[-61.736, -2, -2], [65.736, -2, -2], [74.408, -2, -10]]));heatLine.push(createLine('供熱管線', 'https://thingjs.com/static/images/poly_line_02.png', [[-4, -2, 46], [-4, -2, -34]]));heatLine.push(createLine('供熱管線', 'https://thingjs.com/static/images/poly_line_02.png', [[-6, -2, 46], [-6, -2, -34]]));createInfo(heatLine[0], dataJson[2],[-6.041, 0, 8.865]);heatOpen.on('change', function (ev) {heatLine.forEach(function (obj) {obj.visible = ev;})});});function createLine(name, image, points) {var line = null;line = app.create({type: 'PolygonLine',name: name,points: points,image: image});line.renderOrder = -10000;line.scrollUV = true;line.visible = false;return line; }function createInfo(obj,json, position) {var panel = new THING.widget.Panel({template: 'default2',width: '200px',cornerType: 'polyline'})// panel.zIndex = -10000;panel.renderOrder = -1000;var dataObj = {name: ' ',id: json.id,starId: json.starId,stopId: json.stopId,starDeep: json.starDeep,stopDeep: json.stopDeep,material: json.material,pressure: json.pressure,}panel.addString(dataObj, 'name').caption(obj.name);panel.addString(dataObj, 'id').caption('管線編號');panel.addString(dataObj, 'starId').caption('起點編號');panel.addString(dataObj, 'stopId').caption('終點編號');panel.addString(dataObj, 'starDeep').caption('起點深度');panel.addString(dataObj, 'stopDeep').caption('終點深度');panel.addString(dataObj, 'material').caption('材料');panel.addString(dataObj, 'pressure').caption('壓力');var uiAnchor = app.create({type: 'UIAnchor',parent: obj,element: panel.domElement,position: [position[0], 0, position[2]],pivot: [-0.2, 2.1]});return uiAnchor; }var dataJson = [{ 'id': 'BJ002', 'starId': '2TAG001', 'stopId': '2TAG002', 'starDeep': '-1.5', 'stopDeep': '-1.5', 'material': 'ASTNX01', 'pressure': '120' }, { 'id': 'BJ002', 'starId': '2TAG001', 'stopId': '2TAG002', 'starDeep': '-1.5', 'stopDeep': '-1.5', 'material': 'ASTNX01', 'pressure': '120' }, { 'id': 'BJ002', 'starId': '2TAG001', 'stopId': '2TAG002', 'starDeep': '-1.5', 'stopDeep': '-1.5', 'material': 'ASTNX01', 'pressure': '120' }];

總結

以上是生活随笔為你收集整理的基于WebGL架构的3D可视化平台—城市地下管线3D可视化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美大片免费播放器 | 色女孩综合网 | 国产高清一二三区 | 91婷婷在线 | 婷婷久久久久久 | 久草视频在线免费 | 国产高清在线视频 | 黄色大片免费的 | 91精品国产综合久久精品 | 久久久噜噜噜久久 | 性生活视频网站 | 午夜精品久久久久久久99 | 精品国产91久久久久久 | 日本精品免费视频 | fc2ppv在线播放 | 日剧大尺度床戏做爰 | 国产高清第一页 | 成人免费视频观看视频 | 国产特级毛片aaaaaa | 亚洲偷偷自拍 | 男人的天堂在线视频 | 欧美色老头 | c逼视频 | 九九热视频在线免费观看 | 国产精品国产三级国产aⅴ下载 | 男人天堂一区 | 一本色道久久综合精品婷婷 | 日产精品久久久久 | 亚洲精品久久久久avwww潮水 | 精品人妻一区二区色欲产成人 | 久久成人网18网站 | 欧美精品乱码久久久久久 | 日日摸日日碰 | 日本特级片| av在线不卡免费看 | 亚洲欧美日韩久久精品 | 中文字幕大全 | 日本黄色大片网站 | 成人精品免费看 | 亚洲美女网站 | 亚洲香蕉av | 欧美日本一区 | 国产91精品欧美 | 老司机一区 | 国产女主播av | 日韩视频网址 | 99精品一区二区三区无码吞精 | 内射中出日韩无国产剧情 | 日本少妇裸体做爰高潮片 | 97黄色片| www.麻豆av.com| 91视频区| 久久精品999| 欧美亚洲视频一区 | 男人操女人的软件 | 超碰97久久 | 久久免费福利 | 在线一级| xxxx18日本| 中文在线观看高清视频 | 刘亦菲一区二区三区免费看 | 日韩激情综合 | 长腿校花无力呻吟娇喘的视频 | 国产欧美中文字幕 | 亚洲午夜久久久 | 亚洲精品乱码久久久久久写真 | 69久久久| 亚洲激情成人网 | 日本三级精品 | 91久久国语露脸精品国产高跟 | 日本国产一区二区三区 | 卡一卡二在线视频 | 日本老年老熟无码 | 激情欧美一区二区三区 | 成了校长的性脔h文 | 日韩在线精品视频 | 亚洲成av人在线观看 | 免费成人av | 黄色小说图片视频 | 免费成人深夜夜视频 | 9l视频自拍蝌蚪9l视频 | 国产乱人对白 | 国产中文字幕在线播放 | 日本性爱动漫 | 天天狠天天插 | 国产一区网站 | 日韩精品一区二区三 | 亚洲国产成人精品女人久久 | 国产 欧美 日韩 一区 | 亚洲国产日韩精品 | 美女隐私无遮挡网站 | 国产美女被草 | 五月丁香综合激情六月久久 | 亚洲第一成年网 | 色亭亭| 操校花视频 | 久久久久国产精品午夜一区 | 精品欧美国产 | 国产精品一区二区在线免费观看 |