`

HTML5+WebGL 3D机房开发实例

阅读更多

前阵子写了一篇HMTL5 3D机房开发的例子http://twaver.iteye.com/blog/2215863,介绍了如何用html5在网页上创建无插件的精美3d机房场景,收到很多朋友的鼓励,深表感谢。对于索要源代码的朋友,已经尽力邮件回复。由于精力所限,如未能收到的朋友请留言或给我发送邮件:tw-service@servasoft.com。最近项目第二期又要紧锣密鼓地开始了,所以想抓紧把一些新增的内容补充上,进一步完善这个html5 3d机房的呈现效果。

 

上一篇中主要介绍的是如何从最基础的webgl封装到创建3d物体对象,再通过3d物体对象“搭积木”式的组建整个3d机房场景。这一篇主要介绍一些如何在这个场景上进一步丰富更多的功能和呈现效果,以及实现这些功能在技术上的思路。

 

首先我们来看看上一期已经实现的纯天然无添加无PS的HTML5 3D机房效果:


 

已经拿到过代码的朋友应该知道,这一场景可通过一个json文件进行组装和加载,可以很方便地进行修改和维护。在此基础上,这一次我又增加了”机柜标签、机柜门、复杂设备、机房走线、人员轨迹“等效果,下面我就把第二季的干货一一为大家奉上。

 

机柜标签

 

机房中最重要的物理资源——机柜——是机房管理、规划、监控人员最关注的对象之一。对于规模在几十个、上百个甚至上千个机柜的机房,每个机柜必然会进行资产编号,方便检索和管理。这个在多数资产管理系统中,都是最基本的。但是在3d场景中,如何显示这些机柜编号,才能让用户更直观的看到每个机柜的位置呢?

 

传统的方式是用标签显示资产编号,例如可以用“告警冒泡”那样的方式显示一个文字气泡。不过当机柜产生告警时,两个气泡会有所冲突。而且过多的气泡会产生相互遮挡覆盖,有点混乱,比如像这样:



 

因此我尝试了一种不同的思路:把文字渲染到一个内存图片,“溶解”到机柜的上方贴图中。

 

想要生成一个内存的图片文字,可以通过下面的函数实现:

generateAssetImage: function(text){         
var width=512, height=256;

var canvas = document.createElement('canvas');
canvas.width  = width;
canvas.height = height;

var ctx = canvas.getContext('2d');
ctx.fillStyle='white';
ctx.fillRect(0,0,width,height);
ctx.font = 150+'px "Microsoft Yahei" bold';
ctx.fillStyle = 'black';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(text, width/2,height/2);
ctx.strokeStyle='black';
ctx.lineWidth=15;
ctx.strokeText(text, width/2,height/2);

return canvas;   
}

 

需要留意的是:

1. 生成的图片宽高数值最好是2的幂,例如128、256、512等,这样在3d中渲染不容易出现闪烁和锯齿。相关原理请查阅google。

2. 文字绘制尽量居中、充满整个图,不要太小,否则看上去比较奇怪。

3. 空白处保持透明,不必填充色,方便和机柜本身贴图的“溶解”。

4. 直接返回canvas对象即可,不必生成图片点阵数组。

 

生成canvas后,可以这样直接贴图使用:

 

var labelCanvas=demo.Default.generateAssetImage(label);
rack.setStyle('top.m.texture.image', labelCanvas);
rack.setStyle('top.m.specularmap.image', labelCanvas);

 

通过上面代码,把贴图作为机柜立方体top面的贴图和反射映射图。这样出来的效果如下:



 

这样,既不用增加3d对象,也不影响机柜的美观度,关键是看得非常清晰,在大场景中也不干扰用户的视线:



 

机柜门

 

上一篇里,由于时间紧迫,也考虑到呈现效率,机柜采用了“双击机柜出现设备”的方案。一个立方体的机柜虽然简单直接,但是没有机柜门,总觉得假了一点,客户也提到了这一点,因此按照机房门的思路,增加一个机柜门,增加双击开门的效果,这个比较简单:

 

var rackDoor = new mono.Cube(width, height, 2);
rackDoor.s({
'm.type':'phong',
'm.color': '#A5F1B5',
'm.ambient': '#A4F4EC',
'front.m.texture.image': 'images/rack_front_door.png',
'back.m.texture.image': 'images/rack_door_back.png',
'm.envmap.image': demo.Default.getEnvmap('envmap1'),
});
rackDoor.setParent(rack);
rackDoor.setPosition(0, 0, depth/2+1); 
rackDoor.setClient('animation','rotate.right.120');

 

上面代码创建了一个薄薄的立方体作为机柜门。设置贴图、颜色等,再设置其parent是机柜。这样,如果拖拽机柜位置,机柜也会跟着移动,简单方便。最后,在设置一下机柜门的动画。通过一个字符串进行定义:rotate.right.120表示动画是“向右侧旋转120度”,在双击的时候触发。



 

复杂电信设备

 

第一季里,机柜内的设备,主要用乐服务器来表现,加入了设备弹出、告警等效果。后期根据现场和用户的交流,用户进一步提出要显示机架上需要安装更加复杂的电信设备,包括板卡、板卡的插拔动作、呈现方法等,也就是在机柜上显示一个有多个板卡的设备,双击板卡可以弹出。

 

要做这个,需要把原来的一个立方体的服务器设备做一个“挖空”处理,变成一个空的设备框的样子。然后再生成一系列的板卡对象,插入这个空框。每个板卡应该由面板+电路板组成,可以用两个立方体进行拼接,添加适当的贴图完成。代码如下:

var parts=[{
//card panel
type: 'cube',
width: width,
height: height,
depth: 1,
translate: [x, y, z+1],
rotate: rotate,
op: '+',
style:{
'm.color': color,
'm.ambient': color,
'm.texture.image': 'images/gray.png',
'front.m.texture.image': pic,
'back.m.texture.image': pic,
}
},{
//card body
type: 'cube',
width: 1,
height: height*0.95,
depth: depth,
translate: [x, y, z-depth/2+1],
rotate: rotate,
op: '+',
style:{
'm.color': color,
'm.ambient': color,
'm.texture.image': 'images/gray.png',
'left.m.texture.image': 'images/card_body.png',
'right.m.texture.image': 'images/card_body.png',
'left.m.texture.flipX': true,
'm.transparent': true,
}
}];
var card=demo.Default.createCombo(parts);
card.setClient('animation', 'pullOut.z');
box.add(card);

 

上面代码可以生成一个板卡对象。循环重复,设置位置,即可生成整个设备。通过设置animation属性,定义板卡动画为“双击拉出”,再次双击推回。效果如下图:



 



 

当然,实际项目中,各种结构的电信设备千奇百怪,要通过代码定义是不现实的。所以我们还开发了一个设备编辑器,可以通过拖拽方式快速生成设备结构图。



 

 

机房线缆和走线架

 

除了机柜之外,线缆的连接走向和连接关系是管理员关注的另外一个焦点。机架中的电信设备或服务器设备会通过端口和线缆进行连接,组成一定结构的网络。而线缆的走向在物理上通过肉眼是很难看清晰的。更多线缆会从机柜连出,延伸到屋顶上方或地板下方的隐蔽工程中(例如走线架)固定和布线,用肉眼更无法观察。此时,需要3d机房界面能清晰的显示电缆从端口到走线架再到端口的“端到端”的物理走线,方便管理员了解网络情况和管理。

 

线缆

 

线缆,可以用一个空间的`path`来定义,并设置其贴图:

var path = demo.Default.create3DPath(json.data);
var cable=new mono.PathNode(path, 100, 1);
cable.s({
'm.type': 'phong',
'm.specularStrength': 30,
'm.color': json.color,
'm.ambient': json.color,
'm.texture.image': 'images/flow.jpg',
'm.texture.repeat': new mono.Vec2(200, 1),
});
box.add(cable);

 

通过json定义的[x, y, z]数组来生成一个path对象,然后用它来生成一个空间的“管子”对象。流动效果可以通过一个动画来修改贴图纹理的offset,让眼睛产生贴图不断“移动”的效果。



 

走线架

 

走线架可以通过简单的镂空贴图来模拟,不需要建一个复杂的框架模型,减少对GPU的压力。实际的走线架有很多种,例如下图是一种典型的走线架:



 

我们通过程序模拟一下:

var rail=demo.Default.createPathObject(railInfo);
rail.s({
'm.texture.image': 'images/rail.png',
'm.type': 'phong',
'm.transparent': true,
'm.color': '#CEECF5',
'm.ambient': '#CEECF5',
'aside.m.visible': false,
'zside.m.visible': false,
'm.specularStrength': 50,
});
rail.setPositionY(263);
box.add(rail);

 

最终走线架+线缆的效果如下:


 

路径规划

 

在3d场景中,经常需要计算规划并显示一个最优的空间或平面路径,用来指示如何最快、最合理的到达目标,或通过路径显示一个移动物体的轨迹,方便进行监控和分析。例如,客户提出一个实际需求:**现场检修人员手持平板进入机房,输入设备id后,直接给出前方走动路径,并进行实时导航引导**。

 

我们可以把这个需求分解为导航路径显示和人员模拟两步。导航路径

 

导航线可以通过一个浮在地板上方的path路径来定义。做一个简单的颜色渲染和弯角处理,就可以比较清晰的展示底面的走动路径。

 

var path=new mono.Path();
path.moveTo(object.getPositionX(), object.getPositionZ());
for(var i=0;i<points.length; i++){
path.lineTo(points[i][0], points[i][13]);
}
path = mono.PathNode.prototype.adjustPath(path, 20);

var trail=new mono.PathCube(path, 10, 3);
trail.s({
'm.type': 'phong',
'm.specularStrength': 30,
'm.color': '#298A08',
'm.ambient': '#298A08',
'm.texture.image': 'images/flow.jpg',
'm.texture.repeat': new mono.Vec2(150, 1),
});
trail.setRotationX(Math.PI);
//trail.setStartCap('plain');
//trail.setEndCap('plain');
trail.setPositionY(5);
trail.setClient('type', 'trail');
box.add(trail);

 


 

拉近后看下细节:



 

 

移动轨迹的显示也有很多变化,形状、颜色的变化,空间坐标的变化,都可以产生一些不同的效果。例如下图是另外一个3d车库导航系统的场景:



 

加载人物模型

 

接下来,要加载一个人的模型进来,放在路径上。可以在网上找一些3d max做的模型,并转成obj格式的文件,这样就可以方便的导入场景中。Obj通过对应的mtl文件进行定义材质,需要的贴图也需要一并涵盖进来。通过下面几行代码即可完成obj模型的导入:

 

var obj='images/worker.obj';
var mtl='images/worker.mtl';               
var loader = new mono.OBJMTLLoader();
loader.load(obj, mtl, {'worker': 'images/worker.png',}, function (object) {                    
box.addByDescendant(object);
});

 

 

效果如下图:



 

 

需要留意的是,人的模型不要太大,能把人物轮廓大概渲染清晰即可。例如上面的模型也就几百k,加载和显示几乎瞬间完成,不会产生卡顿。如果加载几十兆上百兆的高清模型,则可能出现卡顿,也会拖慢场景的渲染速度。毕竟我们的主要场景对象是3d机房,对模型选择要有所取舍,千万不要喧宾夺主。

 

让任务沿着路径移动,可以通过动画进行控制,对path中每一段路线进行平移,连续、反复的播放,即可实现人物的移动效果。



 

 

当然这里有一个缺点,人物的移动是僵硬不动的,不能像真实人物一样迈腿一步一步的走路进行移动。如果要做,需要用到骨骼动画等技术,相对复杂一些,目前项目紧急,就留给以后找时间研究了。当然对于3d机房这样的企业应用来说,必要性不一定很大,毕竟不是游戏。

 

通过这些技术,大家可以轻松构建一个比较完整的3d机房系统啦。

 

篇幅有限,这一篇就介绍这么多,后续找时间会继续给大家介绍如何拖拽移动机柜、显示机房中的温度云图、风向监控、摄像头及视频监控,如何创建一个大的园区和楼宇等内容。需要相关代码的同学可以发邮件到tw-service@servasoft.com,或留下邮箱,我会尽力回复。谢谢!

 

 

 

 

 

  • 大小: 185.7 KB
  • 大小: 142.5 KB
  • 大小: 292.3 KB
  • 大小: 322.4 KB
  • 大小: 281.1 KB
  • 大小: 156.3 KB
  • 大小: 253 KB
  • 大小: 223 KB
  • 大小: 358.2 KB
  • 大小: 450 KB
  • 大小: 528.8 KB
  • 大小: 119.9 KB
  • 大小: 193.7 KB
  • 大小: 223.7 KB
  • 大小: 298.3 KB
  • 大小: 273.4 KB
3
1
分享到:
评论
1 楼 luoaz 2015-10-01  
楼主能不能传个源码的附件上来, 分享学习下呢?

相关推荐

    HTML5+WebGL酷炫粒子爆炸动画特效.rar

    HTML5+WebGL酷炫粒子爆炸动画特效.rar HTML5+WebGL酷炫粒子爆炸动画特效.rar HTML5+WebGL酷炫粒子爆炸动画特效.rar HTML5+WebGL酷炫粒子爆炸动画特效.rar HTML5+WebGL酷炫粒子爆炸动画特效.rar HTML5+WebGL酷炫粒子...

    HTML5+CSS+WEBGL网页3D游戏开发

    HTML5、CSS和WebGL是现代网页开发中的关键技术,它们共同为创建互动性强、视觉效果丰富的3D网页游戏提供了强大的支持。在这个经典教程中,我们将深入探讨这些技术如何结合,以构建引人入胜的网页游戏。 HTML5是超...

    HTML5+WebGL 3D雪花飘落动画特效

    HTML5和WebGL是现代网页开发中的核心技术,它们一起为创建动态、交互式的3D图形提供了强大的支持。在这个“HTML5+WebGL 3D雪花飘落动画特效”项目中,开发者利用这两种技术构建了一个逼真的3D下雪场景,为网页增添了...

    HTML5+WebGL 3D雪花飘落动画特效.zip

    总之,"HTML5+WebGL 3D雪花飘落动画特效.zip"是一个展示HTML5和WebGL强大功能的实例,对于想要学习或提升3D网页编程技能的人来说,这是一个极好的实践项目。通过深入研究和修改这个项目,你可以更深入地理解WebGL的...

    非常逼真的html5+WebGL 3D雪花飘落动画特效源码.zip

    总的来说,HTML5+WebGL 3D雪花飘落动画特效源码展示了前端开发中高级的3D图形处理技术,结合了数学、物理和艺术,为网页带来动态的视觉体验。掌握并运用这种技术,可以提升网页的互动性和吸引力,让用户体验更上一层...

    基于HTML5 WebGL的3D机房的示例

    用 WebGL 渲染的 3D 机房现在也不是什么新鲜事儿了,这篇文章的主要目的是说明一下,3D 机房中的 eye 和 center 的问题,刚好在项目中用上了,好生思考了一番,最终觉得这个例子最符合我的要求,就拿来作为记录。...

    html5+webgl海上3D大波浪动画特效.zip

    这个“html5+webgl海上3D大波浪动画特效.zip”压缩包就是一个基于HTML5和WebGL技术实现的海洋3D波浪动画效果的实例。 首先,让我们详细了解一下HTML5。HTML5不仅仅是HTML4的简单升级,它引入了许多新的元素、属性和...

    HTML5+WebGL实现可拖拽的3D透明杯子效果源码.zip

    这个"HTML5+WebGL实现可拖拽的3D透明杯子效果源码.zip"文件,显然包含了一个使用这两种技术制作的互动3D模型示例,特别是一个可以被用户拖动的透明3D杯子。 首先,我们需要了解HTML5中的拖放(Drag and Drop)API。...

    基于javaScript+vue+webGL实现的3d效果机械手臂+源码+demo演示+项目文档(毕业设计&课程设计&项目开发)

    基于javaScript+vue+webGL实现的3d效果机械手臂+源码+demo演示+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于javaScript+vue+webGL...

    一个基于 neo4j 和 flask+webgl 的豆瓣图书数据采集分析及可视化平台(python源码+项目说明).zip

    一个基于 neo4j 和 flask+webgl 的豆瓣图书数据采集分析及可视化平台(python源码+项目说明)(基于python bs4的豆瓣图书数据爬取,使用neo4j图数据库进行储存分析,并使用flask + webgl 进行可视化展示).zip

    webGL3D机房模型

    在“webGL3D机房模型”这个项目中,开发人员利用WebGL的强大功能,创建了一个交互式的3D机房演示。这个Demo不仅展示了机房的三维视图,还融入了多项实用功能,如模拟烟雾效果、虚拟巡检、漏水检测以及机柜容量管理等...

    HTML5+Webgl仿PS羽化笔刷跟随鼠标绘画特效

    HTML5和WebGL是现代网页开发中的核心技术,它们一起为创建动态、交互式的图形和视觉效果提供了强大的平台。本项目“HTML5+Webgl仿PS羽化笔刷跟随鼠标绘画特效”利用这两项技术,实现了类似Photoshop(PS)中的羽化...

    基于vue3.0+esmap+springboot+WebGL的智慧楼宇三维监控系统源码(毕设项目).zip

    基于vue3.0+esmap+springboot+WebGL的智慧楼宇三维监控系统源码(毕设项目).zip 基于vue3.0+esmap+springboot+WebGL的智慧楼宇三维监控系统源码(毕设项目).zip 基于vue3.0+esmap+springboot+WebGL的智慧楼宇三维监控...

    HTML5+Webgl仿PS羽化笔刷跟随鼠标绘画特效.zip

    总的来说,"HTML5+Webgl仿PS羽化笔刷跟随鼠标绘画特效.zip"是一个结合了HTML5、WebGL和JavaScript技术的实例,对于想要提升前端开发技能,特别是对图形编程感兴趣的开发者来说,是一个很好的学习资源。通过研究和...

    HTML5+WebGL实现的3D水母体Medusa变形动画效果源码.zip

    这个“HTML5+WebGL实现的3D水母体Medusa变形动画效果源码.zip”文件,显然是一个基于HTML5和WebGL技术的项目,用于展示3D水母Medusa的动态变形动画。 首先,我们要了解HTML5中的Canvas元素。Canvas是HTML5的一个...

    cuon-matrix.js+cuon-utils.js+webgl-debug.js+webgl-utils.js

    webgl相关 cuon-matrix.js+cuon-utils.js+webgl-debug.js+webgl-utils.js

    HTML5+WebGL+Three.js实现的3D彩色毛刺球动画特效源码.zip

    在本项目中,"HTML5+WebGL+Three.js实现的3D彩色毛刺球动画特效源码"是利用HTML5的Canvas元素以及WebGL图形库Three.js来创建3D动画效果。WebGL是一种基于OpenGL标准的JavaScript API,它允许在浏览器中进行硬件加速...

    HTML5+WebGL实现暗夜云雾缭绕和月亮水面倒影模糊动画特效源码.zip

    总之,"HTML5+WebGL实现暗夜云雾缭绕和月亮水面倒影模糊动画特效源码"是一个展示HTML5和WebGL强大功能的实例,它结合了图形编程、物理模拟和用户交互,为网页带来了电影级别的视觉体验。对于想要学习3D网页图形开发...

    HTML5+WebGL实现带3D视觉效果的国际象棋棋盘棋子和光照动画源码.zip

    这个项目不仅展示了HTML5和WebGL在3D图形渲染方面的强大能力,也体现了前端开发的创新性。通过学习和理解这个源码,开发者可以进一步提升在网页3D图形编程方面的技能,为创建更多互动性强、视觉效果出色的Web应用...

Global site tag (gtag.js) - Google Analytics