就是说,今天这篇文章给大家说说怎么用HTML5和WebGL来3D打印机房,还得提醒下大家做这个时要注意哪些东西。如果你喜欢这个或者正想试试看,那就别错过!我会通过一个真实的例子来详细解释整个过程,希望能给你点灵感。
HTML5和WebGL的基础知识
先来说说啥是HTML5跟WebGL。HTML5就是用来做网页的,WebGL,就是个画3D图的协议,能让你在网页上看3D模型。把它们俩搞到一块儿,就能做出各种炫酷的3D模型了。
ht.Default.def('Editor.Server', Object, {//第一个参数为类名,如果为字符串,自动注册到HT的classMap中;第二个参数为此类要继承的父类;第三个参数为方法和变量的声明 addToDataModel: function(dm) { //将节点添加进数据容器 dm.add(this._node);// ht 中的预定义函数,将节点通过 add 方法添加进数据容器中 }, setHost: function() { //设置吸附 this._node.setHost.apply(this._node, arguments); }, s3: function() {//设置节点的大小 this._node.s3.apply(this._node, arguments); }, setElevation: function() {//控制Node图元中心位置所在3D坐标系的y轴位置 this._node.setElevation.apply(this._node, arguments); } });
创建机房模型的准备工作
要开始做3D机房模型,咱们得先搞好准备工作!比如选个好用的建模软件,弄清楚机房啥样子,再找齐材料和资源啥的。这个过程虽然有点琐碎,但是特别重要,直接关系到咱们能不能顺利完成任务
编写HTML和JavaScript代码
var S = E.Server = function(obj) {//服务器组件 var color = obj.color, frontImg = obj.frontImg; var node = this._node = new ht.Node();//创建节点 node.s({//设置节点的样式 s 为 setStyle 的缩写 'all.color': color,//设置节点六面的颜色 'front.image': frontImg //设置节点正面的图片 }); };
下面,咱们得开始弄HTML和Javascript代码了,这样才能把3D机房弄出来。首先要做的就是搞个HTML文件,再加上Javascript的库就行了。当然,这中间还得注意代码的结构和逻辑,别到时候出什么差错!
定义和创建机房组件
搞完了代码,我们就得开始把机房给搭起来了。这就包括服务器啊、机柜啊还有其他必须要用到的东西。每样东西都得用专门的类来描述,然后再用这些类创建出实际的物体出来。
ht.Default.def('Editor.Cabinet', Object, { addToDataModel: function(dm) { dm.add(this._door); dm.add(this._node); this._serverList.forEach(function(s) { s.addToDataModel(dm); }); }, p3: function() { this._node.p3.apply(this._node, arguments);//设置节点的 3d 坐标 } });
设置和调整3D场景
搞定机房组件后,咱们得把3D场景整好,那就得调调视角、光影,还得让渲染更给力点儿。说起来复杂,可做了这些,3D机房就能大变样,看着特舒服。
var C = E.Cabinet = function(obj) { var color = obj.color, doorFrontImg = obj.doorFrontImg, doorBackImg = obj.doorBackImg, s3 = obj.s3; var node = this._node = new ht.Node(); // 柜身 node.s3(s3);//设置节点的大小 为 setSize3d node.a('cabinet', this);//自定义 cabinet 属性 node.s({//设置节点的样式 为 setStyle 'all.color': color,//设置节点六面的颜色 'front.visible': false//设置节点前面是否可见 }); if (Math.random() > 0.5) { node.addStyleIcon('alarm', {//向节点上添加 icon 图标 names: ['icon 温度计'],//包含多个字符串的数组,每个字符串对应一张图片或矢量(通过ht.Default.setImage注册) face: 'top',//默认值为front,图标在3D下的朝向,可取值left|right|top|bottom|front|back|center position: 17,//指定icons的位置 autorotate: 'y',//默认值为false,图标在3D下是否自动朝向眼睛的方向 t3: [0, 16, 0],//默认值为undefined,图标在3D下的偏移,格式为[x,y,z] width: 37,//指定每个icon的宽度,默认根据注册图片时的宽度 height: 32,//指定每个icon的高度,默认根据注册图片时的高度 textureScale: 4,//默认值为2,该值代表内存实际生成贴图的倍数,不宜设置过大否则影响性能 visible: { func: function() { return !!E.alarmVisible; }}//表示该组图片是否显示 }); } var door = this._door = new ht.DoorWindow();//柜门 door.setWidth(s3[0]);//置图元在3D拓扑中的x轴方向的长度 door.setHeight(1);//设置图元在3D拓扑中的z轴长度 door.setTall(s3[1]);//控制Node图元在y轴的长度 door.setElevation(0);//设置图元中心在3D坐标系中的y坐标 door.setY(s3[2] * 0.5);//设置节点在 y 轴的位置 door.setHost(node);//设置吸附 door.s({//设置节点样式 setStyle 'all.color': color,//设置节点六面颜色 'front.image': doorFrontImg,//设置节点正面图片 'front.transparent': true,//设置节点正面是否透明 'back.image': doorBackImg,//设置节点背面的图片 'back.uv': [1,0, 1,1, 0,1, 0,0],//自定义节点后面uv贴图,为空采用默认值[0,0, 0,1, 1,1, 1,0] 'dw.axis': 'right'//设置DoorWindow图元展开和关闭操作的旋转轴,可取值left|right|top|bottom|v|h }); var serverList = this._serverList = []; var max = 6, list = E.randomList(max, Math.floor(Math.random() * (max - 2)) + 2); //global.js 中声明的获取随机数的函数 var server, h = s3[0] / 4; list.forEach(function(r) { var server = new E.Server({ //服务器组件 color: 'rgb(51,49,49)', frontImg: '服务器 组件精细' }); server.s3(s3[0] - 2, h, s3[2] - 4);//设置节点大小 server.setElevation((r - max * 0.5) * (h + 2));//设置节点中心点在 y 轴的坐标 server.setHost(node);//设置节点的吸附 serverList.push(server);//向 serverList 中添加 server 节点 }); };
处理交互事件
让3D机房更生动?来处理各种交互事件!鼠标点击、键盘输入、窗口大小变化啥都有。要是能监听这些事儿,然后做出反应,那就更对得起用户的操作习惯!
var E = window.Editor = { leftWidth: 0, topHeight: 40, randomList: function(max, size) { var list = [], ran; while (list.length = 0) continue; list.push(ran); } return list; } };
将3D场景添加到网页中
搞定了3D造型,就得让它跑在网页上,让大家都能看到。这个过程涉及把3D元素插进HTML的body里,还有就是怎样保证画面大小也能跟着屏幕变化而不失真。虽然看似简单,但绝对是整个项目的重要环节!
实战案例分析
var g3d = E.main = new ht.graph3d.Graph3dView(); //3d 场景
现在马上我们就来详细看下怎么做!首先,你得从零开始,慢慢摸索着建出一个完整的3D电脑室模型。然后再把它放到网页上,让大家都能看到。这样子的话,咱们就能更深入地了解每个环节的重要性了。
注意事项总结
搞定这个大工程,还要操心点小事情,比如优化代码、提高速度、解决兼容性啥的。别看都是些微不足道的事,可都能决定咱们这个项目的生死存亡。所以,咱们得把每个环节都盯紧了,保证最后的3D机房能顺利跑起来。
// 设置眼睛位置 var setEye = function(eye, finish) { if (!eye) return; var e = g3d.getEye().slice(0),//获取当前 eye 的值 dx = eye[0] - e[0], dy = eye[1] - e[1], dz = eye[2] - e[2]; // 启动 500 毫秒的动画过度 ht.Default.startAnim({ duration: 500, easing: easing,//动画缓动函数 finishFunc: finish || function() {}, //动画结束后调用的函数 action: function(v, t) {//设置动画v代表通过easing(t)函数运算后的值,t代表当前动画进行的进度[0~1],一般属性变化根据v参数进行 g3d.setEye([ //设置 3D 场景中的 eye 眼睛的值,为一个数组,分别对应 x,y,z 轴的值 e[0] + dx * v, e[1] + dy * v, e[2] + dz * v ]); } }); };
结尾和互动
今天我们要聊的话题就是用HTML5和WebGL来打印3D版的机房,还会告诉大家一些小技巧~希望这个分享对你有帮助。最后,我想问问你,你觉得做3D机房最难的部分在哪儿?快来评论区跟大家分享,别忘了给这篇文章点个赞和分享出去!
g3d.mi(function(e) {//addInteractorListener 事件监听函数 if (e.kind !== 'doubleClickData') //判断事件类型为双击节点 return; var data = e.data, p3; if (data.a('cabinet')) //机身 p3 = data.p3(); else { host = data.getHost(); //获取点击节点的吸附对象 if (host && host.a('cabinet')) {//如果吸附对象为 cabinet p3 = host.p3(); } } if (!p3) return; setCenter(p3); //设置 center 目标的要移向位置为 cabinet 的位置 setEye([p3[0], 211, p3[2] + 247]); //设置 eye 眼睛要移向的位置 });
评论0