基于 HTML5 结合互联网+ 的 3D 隧道

姓名:王玉刚       学号:17021211232

【嵌牛导读】:目前,物资采购和人力成本是隧道业发展的两大瓶颈。比如依靠民间借贷,融资成本很高;采购价格不透明,没有增值税发票;还有项目管控和供应链管理的问题。成本在不断上升,利润在不断下降,隧道产业的“互联网+”迫在眉睫。隧道业的机械化程度高,机械制造和采购成本非常大,此外,隧道业的发展还面临建筑市场的严峻考验。“互联网+”提供大数据、信息流,为传统隧道企业由机械化向数字化挺进提供了机遇,隧道产业的建设工程需要持续的技术支持,也需要经验分享,如果可以借助互联网整理和分享相关经验,将为隧道产业发展带来智慧动力。

【嵌牛鼻子】:HTML5   3D 隧道

【嵌牛提问】:利用HTML5 怎么样进行3D 隧道搭建?

【嵌牛正文】:首先创建 3D 场景,HT有 3D 组件,可以直接通过 new ht.graph3d.Graph3dView 3D 组件来创建一个实例,然后通过 getView() 函数获取组件的底层 div,既然是 div,那位置显示控制就容易得多了:

dm =newht.DataModel();// 数据容器,可以将显示在界面上的所有数据通过 dataModel.add 存储在数据容器中g3d =newht.graph3d.Graph3dView(dm);// 3D 组件g3d.addToDOM();// 将 3D 组件的底层 div 添加到 body 中

HT 的组件一般都会嵌入 BorderPane、SplitView 和 TabView 等容器中使用,而最外层的 HT 组件则需要用户手工将 getView() 返回的底层 div元素添加到页面的 DOM 元素中,这里需要注意的是,当父容器大小变化时,如果父容器是 BorderPane 和 SplitView 等这些HT预定义的容器组件,则HT的容器会自动递归调用孩子组件 invalidate 函数通知更新。但如果父容器是原生的 html 元素, 则HT组件无法获知需要更新,因此最外层的 HT 组件一般需要监听 window 的窗口大小变化事件,调用最外层组件 invalidate 函数进行更新。

为了最外层组件加载填充满窗口的方便性,HT 的所有组件都有 addToDOM 函数,其实现逻辑如下,其中 iv 是 invalidate 的简写:

addToDOM =function(){varself =this,        view = self.getView(),// 获取组件的底层 divstyle = view.style;document.body.appendChild(view);// 将组件的底层 div 添加进 body 中          style.left ='0';// HT 组件默认设置 position 样式属性为 absolute 绝对定位方式style.right ='0';    style.top ='0';    style.bottom ='0';window.addEventListener('resize',function(){ self.iv(); },false);            }

场景序列化

最让我开心的应该是我的开发基本上跟设计部分完全分离了,因为 HT 可以通过 ht.Default.xhrLoad 函数直接加载 json 文件的场景,这样我跟设计师就是双进程了,非常开心呢~加载场景有三个步骤,如下:

ht.Default.xhrLoad('scenes/隧道.json',function(text){// 加载 json 场景varjson = ht.Default.parse(text);// 转义 json 文件dm.deserialize(json);// 将 json 内容反序列化到场景中// 可以在这个里面任意操作 datamodel 数据容器中的数据了}

动画

我在场景中添加了一些功能,包括前面提到过的一些动画操作,HT 封装好的 dataModel.addScheduleTask(task) 通过操作数据容器 dataModel 来控制加载动画,动画部分在参数 task 中声明,task 为 json 对象,可指定如下属性:

interval:间隔毫秒数,默认值为 10

enabled:是否启用开关,默认为 true

action:间隔动作函数,该函数必须设置

我的动画一共三个,两个隧道中各有一个风扇、一个风向仪以及一个卷闸门。设置这三个图元变化即可,我在 json 中分别将这三个图元的 tag 设置为 feng、feng2 以及 door,在代码中我就可以直接调用这三个图元的 tag 属性:

vartask = {    action: function(data){if(!data.getTag())return;vartag =data.getTag();// 获取图元的 tag 属性if(tag ==='feng'){data.r3(0, (data.r3()[1]+Math.PI/12),0);// r3 为 3d 中的旋转,这里 y 轴在原来的基础上再旋转 Math.PI/12 角度}elseif(tag ==='feng2'){data.r3(0,0,data.r3()[2]+Math.PI/12);    }elseif(tag ==='door'){if(data.getTall() >0){// 获取图元的 tall 属性,高度data.setTall(data.getTall()-20);// 设置高度为当前高度减去20}        }    }}dm.addScheduleTask(task);// 在数据容器 dataModel 中添加调度任务

接着是创建 form 表单,在表单上添加一些信息,比如交通灯的切换等等,场景默认显示的右上角的 form 表单我们这里不做解释,内容跟点击交通灯出现的 form 表单差不多,所以我们主要说明一下点击交通灯时出现的表单:

表单中重复的部分比较多,我挑出三个部分来解释一下:文本部分、“当前状态”显示的图标以及下面“修改状态”中的图标点击选择部分:

form.addRow([// addRow 添加一行 我这个部分是添加一个标题{element:'交通灯控制',// 这一行第一部分的显示文本align:'center',// 文本对齐方式color:'rgb(0,210,187)',// 文本颜色font:'bold 16px arial, sans-serif'// 文本字体}],[0.1]);// 记得要设置这行的宽度form.addRow([// 这行中有两个部分,一个“设备描述”,一个 文本“0”,所以要设置两个宽度,宽度要放在一个数组中      '设备描述:',// 第一部分{// 第二部分element:'0',color:'rgb(0,210,187)'}],[80, 0.1],34);// addRow 函数第二个参数为宽度设置,将上面内容的宽度依次放进这个数组中。第三个参数为高度form.addRow(['当前状态:',    {// 也可以将数组中的某个部分设置为空字符串,占据一些宽度,这样比例比较好调element:''},    {id:'105',// id唯一标示属性,可通过formPane.getItemById(id)获取添加到对应的item对象button: {/ /按钮,设置了该属性后HT将根据属性值自动构建ht.widget.Button对象,并保存在element属性上icon:'symbols/隧道用图标/light.json',// 按钮上的显示图标background:'rgba(0,7,26,0.60)',// 按钮背景borderColor:'rgb(0, 7, 26)',// 按钮边框颜色clickable: false// 是否可点击}    }],[80,0.1,84],30);form.addRow([// 如果和上面一行的距离差别与其它行间距不同,可以通过增加一行空行,设置高度即可                    '',    {element:''}],[200, 0.1],10);form.addRow(['修改状态:',    {element:''},    {button: {icon:'symbols/隧道用图标/light.json',// 设置按钮的图标background:'rgba(0,7,26,0.60)',borderColor:'rgb(0, 7, 26)',groupId:'btn',// 通过getGroupId和setGroupId获取和设置组编号,属于同组的togglable按钮具有互斥功能。后面的三个按钮也是设置了同一个 groupIdonClicked: function(e){// 点击后的回调函数btnClick('light');            }        }    }],[80,0.1,84],30);

这个 form 表单的背景只是设置了一张图片而已:

background: url('assets/控制.png') no-repeat;

上面还有一个部分没有提及,就是点击按钮后调用的 btnClick 函数:

functionbtnClick(imageName){if(flag ===1){// 做的判断是根据3d的事件来处理的,等下会提dm.getDataByTag('light').s({// 通过getDataByTag获取节点,设置节点的style样式'back.image':'symbols/隧道用图标/'+imageName+'.json',// 设置图元的背面图片'front.image':'symbols/隧道用图标/'+imageName+'.json'// 设置图元你的前面图片});    }elseif(flag ===2){        dm.getDataByTag('light1').s({'back.image':'symbols/隧道用图标/'+imageName+'.json','front.image':'symbols/隧道用图标/'+imageName+'.json'});    }else{}    form.getViewById(105).setIcon('symbols/隧道用图标/'+imageName+'.json');// 设置id为105的item内容显示的图标为form表单上点击的交通灯的按钮的图标}

最后就是点击事件了,点击交通灯会直接切换交通灯的颜色(实际上是切换模型的贴图):

g3d.mi(function(e){// addInteractorListener 函数 监听场景中的事件if(e.kind ==='clickData') {if(e.data.getTag() ==='jam') { createDialog(e.data); }elseif(e.data.getTag() ==='light') {// 如果图元是背面的隧道的灯varfrontImage = e.data.s('front.image');varimageName = frontImage.slice(frontImage.lastIndexOf('/')+1, frontImage.lastIndexOf('.'));            btnClick('light', imageName);        }elseif(e.data.getTag() ==='light1'){// 正面的隧道的灯varfrontImage = e.data.s('front.image');varimageName = frontImage.slice(frontImage.lastIndexOf('/')+1, frontImage.lastIndexOf('.'));            btnClick('light1', imageName);        }    }});

互联网+的概念在新兴产业上能够很好地运营,同时在传统行业中利用得当同样能够产生非常大的效益,比如智慧城市建设,智慧能源管理,智慧工厂,甚至是地铁监管等等都可以结合互联网+的模式来运作,在一定程度上节省了非常多的人力和时间成本。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_x阅读 15,968评论 3 119
  • 1.一家子美人 卫庄公娶于齐东宫得臣之妹,曰庄姜,美而无子,卫人所为赋《硕人》也。——《左传》 齐国的开国之君是姜...
    漪禾渡江阅读 3,780评论 61 78
  • 高考对于我来说,还是比较沉重。 高考对于农村出生的孩子来说,无意是很好的跳跃板,至少我比较认同这句话。 第一次高考...
    冯仑痕迹阅读 335评论 4 2
  • 前端7班 陆恩泽在网页布局中,我们经常需要对div区块,文本和图片进行垂直居中,以便达到美观的效果。上一次直播课中...
    饥人谷_陆恩泽阅读 215评论 0 2
  • 之前,有位小伙伴对我说: 现实对我很残酷,我越努力失去越多。 为什么会这样? 不是说好的有付出就会有回报, 投资越...
    过千亿阅读 375评论 0 0