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,或留下邮箱,我会尽力回复。谢谢!

 

 

 

 

 

相关推荐

打造最美HTML5 3D机房(第四季:大型园区、地球仪效果,及其他扩展)

前言初次见面的朋友们大家好,这篇文章是“打造最美3D机房”系列的第四季,感兴趣的朋友可从头开始观看。 这篇文章,主要介绍了如何实现从“地球(地图)”— “园区”— “楼宇”— “机房”的炫酷效果,以及一些其他3D应用的开发思路。欢迎大家一起探讨。

TWaver可视化 9255

打造最美HTML5 3D机房(MONO哥强势归来,第四季惊艳发布)

前言 初次见面的朋友们大家好,简单自我介绍一下:我是Mono哥,性别男,爱好。。。编程,自从一年多前入了HTML5和WebGL的坑,就再也没有爬出来过,目前正在钻研3D机房以及相关的3D应用。这篇文章是“打造最美3D机房”系列的第四季,感兴趣的朋友可从头开始观看,以下是正确的阅读顺序: HTML5,不只是看上去很美 (第一弹:彩虹爆炸图)...

weixin_33971130的博客 1030

3d机房开源示例

基于vizi框架的3d机房程序,附详细源代码。 使用文档参见相关博客。 初学者,欢迎指正。

Web 3D机房,智能数字机房HTML5+Threejs(WebGL) 项目实战四

针对webgl的库threejs框架的Web 3D智能数字机房项目实战详细的讲解,随着IT信息技术和移动端的发展,Html5+3D(Webgl)技术已经悄然崛起,3D机房数据中心可视化应用越来越广泛,主要包括3D机房搭建,机柜、服务器、机房功能效果、温度检测(动力环境监控)、机柜利用率(可用空间)、烟雾监控(粒子效果)、巡航导航(巡更路径)、设备报警。threejs 98版本开发环境(IDE) WebStorm 2019.2 版本

3D机房环境监控系统源码

3D机房环境监控系统源码,最流行的3D交互控制技术,代码完整,参考的好资料

基于TWaver实现的3D机房Demo

TWaver是基于WebGL3D一个框架,可以使用其框架进行web3d的开发,这里贴上官方的一个小案例,可以参照使用。

【开源项目】智慧机房~国企某大数据中心机房数字孪生可视化项目——开源工程及源码

通过使用专业的三维建模工具和最新的渲染技术,可以将机房周围的景观和建筑物精细地呈现出来,使得机房环境更加真实、美观、可感知。数字孪生技术整合机房数据和场景,加载机房的3维数据,打造出具有高度真实感的机房模拟环境,辅助管理决策。将机房内的供水、供电、内部网络线路结构一网打尽,供给管理者全方位展现机房资源的情况,实现智能化管理。可视化机房内部的承重、电力以及U位容量大小,实现设备空间使用的最大化,确保机房资源的高效利用。数字孪生技术的应用使得机房在供线管路、云图、机房容量和告警等方面都取得了显著的进步。

u011134727的博客 2243

用three.js构建的一个3D机房(源码+项目说明).zip

【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 用three.js构建的一个3D机房(源码+项目说明).zip

探索虚拟与现实:基于HTML5的WebGL技术电信3D机房漫游源代码

探索虚拟与现实:基于HTML5的WebGL技术电信3D机房漫游源代码 去发现同类优质开源项目:https://gitcode.com/ 在当今数字化时代,虚拟现实技术已经渗透到各个行业。本文将为您介绍一个开源项目——基于HTML5的WebGL技术电信3D机房漫游源代码,该项目不仅能够为您提供沉浸式的三维机房体验,还具备丰富的二次开发潜力。 项目介绍 基于HTML5的WebGL技术电信3D机房漫游源...

gitblog_06758的博客 1102

一个基于three.js的3D web项目源代码,欢迎学习.zip

一个基于three.js的3D web项目源代码,欢迎学习.zip

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

前言 用 WebGL 渲染的 3D 机房现在也不是什么新鲜事儿了,这篇文章的主要目的是说明一下,3D 机房中的 eye 和 center 的问题,刚好在项目中用上了,好生思考了一番,最终觉得这个例子最符合我的要求,就拿来作为记录。 效果图 这个 3D 机房的 Demo 做的还不错,比较美观,基础的交互也都满足,接下来看看怎么实现。 代码生成 定义类 首先从 index.html 中调用的 js 路径顺序一个一个打开对应的 js,server.js 中自定义了一个 Editor.Server 类由 HT 封装的 ht.Default.def 函数创建的(注意,创建的类名 Editor.Serv

Web 3D机房,智能数字机房HTML5+Threejs(WebGL) 项目实战二

Web 3D机房,智能数字机房HTML5+Threejs(WebGL) 项目实战二 去发现同类优质开源项目:https://gitcode.com/ 本资源详细讲解了基于WebGL的库Threejs框架的Web 3D智能数字机房项目实战。随着我国IT信息技术和移动端技术的飞速发展,HTML5+3D(WebGL)技术日益崛起,3D机房数据中心可视化应用在各个领域得到了广泛的应用。本项目主要涵盖3D机...

gitblog_06795的博客 492

基于HTML5WebGL的3D仓储管理系统

仓储管理系统(WMS)是一个实时的计算机软件系统,它能够按照运作的业务规则和运算法则,对信息、资源、行为、存货和分销运作进行更完美地管理,使其最大化满足有效产出和精确性的要求。从财务软件、进销存软件CIMS,从MRP、MRPII到ERP,代表了中国企业从粗放型管理走向集约管理的要求,竞争的激烈和对成本的要求使得管理对象表现为:整和上游、企业本身、下游一体化供应链的信息和资源。而仓库,尤其是制造业中的仓库,作为链上的节点,不同链节上的库存观不同,在物流供应链的管理中,不再把库存作为维持生产和销售的措施,而将其作为一种供应链的平衡机制,其作用主要是协调整个供应链。但现代企业同时又面临着许多不确定因

基于HTML5的WebGL技术电信3D机房漫游源代码

基于HTML5的WebGL技术电信3D机房漫游源代码 去发现同类优质开源项目:https://gitcode.com/ 此项目是一个基于HTML5和WebGL技术的电信3D机房漫游系统的源代码。通过这个源代码,您可以创建一个三维的机房环境,实现在机房内部的虚拟漫游。 特性 基于HTML5技术,支持主流浏览器。 使用WebGL技术,提供流畅的三维渲染效果。 仿真机房环境,漫游体验真实。 源代码开源...

gitblog_06722的博客 332

数字IC后端实战:OCC电路时钟树综合的5个关键技巧(附Synopsys工具配置)

本文深入探讨了数字IC后端设计中OCC电路时钟树综合的实战技巧。针对工具自动平衡导致的绕线拥塞和时序问题,文章提出了分段处理的核心思路,并详细阐述了通过物理隔离、分段长树策略以及Synopsys工具链(如ICC2、PrimeTime)的精准配置来优化function clk与occ clk路径的关键方法,旨在提升时序收敛性和可制造性。

jwt8token的博客 854

自监督预训练(三)wav2vec 2.0原理剖析

一、整体流程 二、feature encoder 理解Conv1d nn.Conv1d(in_channels=5, out_channels=20, kernel_size=3, stride=2) 假设输入input=(batch, in_channels, in_len) batch=1 in_channels=5,对应向量大小,比如word embedding in_len=10,对应word的个数 cnn内部kernel=(in_channels, kernel_size)=(5,3),相当

xmdxcsj的专栏 2万+

3D机房初级Demo资源下载

3D机房初级Demo资源下载 去发现同类优质开源项目:https://gitcode.com/ 这里是关于Three.js的机房3D展示初级Demo的资源文件。该资源文件包含了本项目所有的源代码和素材,旨在为初学者提供一个学习Three.js的基础示例。 文件描述 文件名:ThreeJsTest-3D机房.zip 内容:一个使用Three.js框架制作的机房3D展示的初级demo。 目的:作为学...

gitblog_06773的博客 343

高效打卡系统设计:从行为心理学到实践工具

打卡系统作为现代时间管理的重要工具,其核心原理植根于行为心理学中的即时反馈机制和习惯养成理论。通过科学设计的打卡周期和可视化反馈,能有效提升个人自律性和目标达成率。在技术实现上,从纸质记录到数字化工具(如Notion、Excel自动化模板)的演进,为不同场景提供了灵活解决方案。特别在习惯追踪和进度管理领域,结合热力图生成、数据统计等技巧,打卡系统能转化为强大的自我监督工具。本文通过实践案例,详解如何构建兼顾弹性和约束力的个性化打卡方案,帮助读者突破'三天打鱼两天晒网'的常见困境。

weixin_30047059的博客 335

视频教程-Web 3D机房,智能数字机房HTML5+Threejs(WebGL) 项目实战二-JavaScript

Web 3D机房,智能数字机房HTML5+Threejs(WebGL) 项目实战二 ...

weixin_33666267的博客 691

国产安路FPGA(二)-TD软件时序约束与硬件调试实战

本文深入探讨了国产安路FPGA开发中TD软件时序约束的实战应用。文章详细解析了SDC文件的核心语法,包括基础时钟、生成时钟及输入输出延迟约束的编写方法,并针对硬件调试中常见的时序问题提供了解决方案。通过一个图像处理流水线的优化案例,阐述了如何结合代码修改与约束设置,实现设计从“能跑”到“跑得稳”的关键提升,是掌握FPGA可靠设计的实用指南。

weixin_29183637的博客 376

STM32开发 -- GPS模块开发详解

一、了解硬件 我使用的GPS模块型号为UBX-M8030 参看:UBX-M8030 系列 查看一下它的特性: 多用途 GNSS 芯片,提供三种产品等级 最多可并发接收 3 个 GNSS(GPS、伽利略、GLONASS、北斗) 行业领先的 -167 dBm 导航灵敏度 业界最低电流消耗 在城市峡谷中具有绝佳的定位精度 安全性和完整性保护 支持所有的卫星增强系统 车载级芯片的工作...

不积跬步,无以至千里 3万+

视频教程-Web 3D机房,智能数字机房HTML5+Threejs(WebGL) 项目实战三-JavaScript

Web 3D机房,智能数字机房HTML5+Threejs(WebGL) 项目实战三 ...

weixin_33683084的博客 594

用群辉NAS打造影视墙(Jellyfin篇)

之前的文章提到过,用群辉NAS组建影视播放系统可以采用官方提供的Video Station套件,不过影视信息配比较差,响应速度也欠佳,今天我们就聊聊别的套件。在影音媒体方面,常见的还有Emby、Plex、Jellyfin。本文主讲Jellfin的原因是它胜在免费,而且功能比较齐全,完全够用。详细信息可以参考Jellyfin的官网:https://jellyfin.org/

dgnankai的专栏 7321
上一篇: HTML5 3D水源监控系统
下一篇: 一款最新的Web 3D开发工具—TWaver Make
subnetwork
博客等级 码龄17年 17粉丝 84原创
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值