`
xhload3d
  • 浏览: 208508 次
社区版块
存档分类
最新评论

基于HTML5和WebGL的3D网络拓扑结构图

阅读更多

现在,3D模型已经用于各种不同的领域。在医疗行业使用它们制作器官的精确模型;电影行业将它们用于活动的人物、物体以及现实电影;视频游戏产业将它们作为计算机与视频游戏中的资源;在科学领域将它们作为化合物的精确模型;建筑业将它们用来展示提议的建筑物或者风景表现;工程界将它们用于设计新设备、交通工具、结构以及其它应用领域;在最近几十年,地球科学领域开始构建三维地质模型,而且3D模型经常做成动画,例如,在故事片电影以及计算机与视频游戏中大量地应用三维模型。它们可以在三维建模工具中使用或者单独使用。为了容易形成动画,通常在模型中加入一些额外的数据,例如,一些人类或者动物的三维模型中有完整的骨骼系统,这样运动时看起来会更加真实,并且可以通过关节与骨骼控制运动。

这些种种都让我们前端开发者觉得如果我们可以不用学习unity3d或者其他游戏开发工具就能实现3D效果,而且能够精准的靠代码来控制移动或者方向就好了。。。于是我利用HT For Web中的3D组件来实现了一个小例子,用了HT3D组件的大部分功能,做这个例子就是想把3D组件好好的掌握,尽量放进一个例子中,到时候别人有需要就可以参考了,但是因为之前从来没有实现过3D的效果,再加上现在手册没有很完整,所以这个例子对我来说还是有点难度的。

本例位置:http://www.hightopo.com/demo/3DTopology/index.html

先来看看整体实现的效果图:

HT for Web,现有的3d模板创建三层底板不是问题,问题是要如何将图中第一层的“电脑”和“机柜组件”放上去?我是在网上down下来的obj格式的文件,然后我利用HT中的ht.Default.loadObj(objUrl, mtlUrl, params)函数将模型加载进去,其中的params部分可以参考http://www.hightopo.com/guide/guide/plugin/obj/ht-obj-guide.html,代码如下: 

ht.Default.loadObj('obj/机柜组件1.obj', 'obj/机柜组件1.mtl', {
    cube: true,
    center: true,
    shape3d: 'box',
    finishFunc: function(modelMap, array, rawS3){
        window.rawS3 = rawS3;
      if(modelMap){
        device2 = createNode('box', floor1);
    device2.p3([x1-120, y1+13, z1+60]);
    device2.s3(rawS3);
    createEdge(device1, device2);
    device3 = createNode('box', floor1);
    device3.s3(rawS3);
    device3.p3([x1+120, y1+13, z1+60]);
    createEdge(device1, device3);
      }
    }
});

“电脑”上方有个红色的立体能旋转的“警告”,是依靠ht.Default.setShape3dModel函数(HT for Web 建模手册)注册的一个3d模型,在ht中,封装好的建模函数有很多,比较基础的就是球体,圆柱,立方体等等,这边我用的是构造环形的方法createRingModel来生成“警告”最外面的环,感叹号的上部分就是用的createSmoothSphereModel构造的球体,感叹号的下部分就是用createSmoothCylinderModel来构造的圆柱。我一开始直接使用了3d模型中封装好的函数,导致后来根本不知道函数中使用的参数是做什么用的,而且也不明白3d模型是怎么构成的,然后自己又重新看了前面的“模型基础”,才知道原来3d模型采用的一个面,最基础的是三角面,之后复杂的面也是由多个三角面来形成的,然后绕着一根特定的轴旋转之后形成的,当然,这个轴是你来决定的,不同的轴可以生成不同的形状,对于颜色等风格方面的设置可以参考HT for Web 风格手册。至于如何让这个3d模型旋转起来,ht中封装了addScheduleTask(Task)方法,我在第三层Task中调用了ht封装的一个旋转函数setRotation来设置旋转的顺序和方向,并且指定了旋转的对象。以下是自定义“警告”的3d模型的方法(注意:因为本例的模型是自定义组合的,如果要设置整体模型的颜色要用“all.blend”style属性):

var ringModel = ht.Default.createRingModel([8, 1, 10, 1, 10, -1, 8, -1, 8, 1], null, null, false, false, 100);
var sphereModel = ht.Default.createSmoothSphereModel(8, 8, 0, Math.PI*2, 0, Math.PI, 2);
var cylinderModel = ht.Default.createSmoothCylinderModel(8, true, true, 1, 2, 0, Math.PI*2, 8);
var arr = [
    {
        r3: [Math.PI/2, 0, 0],
        color: 'red'
    },{
        shape3d: sphereModel,
        t3: [0, 4, 0],
        color: 'red'
    },{
        shape3d: cylinderModel,
        t3: [0, -3, 0],
        color: 'red'
    }
];
ht.Default.setShape3dModel('alarm', {
    shape3d: arr
});    

要实现3D界面上展现2d图片,只要按照平常的路走就行,因为ht中的Graph3dView和其他的组件的根部都是div,在div上生成图片用的就是原生js,new Image(),再将image的src和大小赋值,并且加到3d面板上就行了,注意这里是加到3d的底层div上,要用g3d.getView().appendChild来添加,我们还可以看到管线上有虚线流动的痕迹,这是通过不断改变“shape3d.uv.offset”参数实现管道流动的特殊效果,详情请参考HT for Web 形状手册

想让2d图片在3d管线上移动则是使用g3d.toViewPosition(position)来获取3d模型的二维坐标,这个函数中的参数就是三维模型的3d坐标,我们可以直接将polyline管线上的点传入toViewPosition函数中,这边获取管线上的点在ht中已经封装好三个函数getLineCacheInfo、getLineLength、getLineOffset,这样就可以直接获取到二维坐标,然后将img的坐标设置上去即可,以下是img图片在管道上移动的代码:

var delta = 10;
params = {
    frames: Infinity,
    interval: 50,
    action: function(v, t){
        var length = (polyline.a('total') || 0) % polyline.a('length') + delta;
        var cache = ht.Default.getLineCacheInfo(polyline.getPoints(), polyline.getSegments());
        var lineLength = ht.Default.getLineLength(cache);
        var offset = ht.Default.getLineOffset(cache, length);
        arr = [offset.point.x, offset.point.y, offset.point.z];
        var position = g3d.toViewPosition(arr);
            img.style.left = (position.x - 5) + 'px';
            img.style.top = (position.y - 5) + 'px';
            polyline.a('total', length);
    }
};
anim = ht.Default.startAnim(params); 

可以看到图中第二层中的立方体上有“SDH”的字样,我是通过设置shape3d.top.img: imgURL来实现的,这边的imgURL可以是图片的相对路径,也可以是ht中用ht.Default.setImage声明的img的名称,还可以是json格式构造的图片。在ht中,2D文字显现在3D上,则字体周围会出现“锯齿”,这个时候只要设置“label.transparent: true”即可。

我们还可以看到第二层上有两个特殊的多边形“平行四边形”和“梯形”,因为之前有客户说不知道如何使用createExtrusionModel这个模型函数(HT for Web 建模手册),我索性就写了一下,平行四边形是靠createParallelogramModel模型函数,这个函数比较简单,createExtrusionModel(array, segments, top, bottom, resolution, repeatUVLength, tall, elevation),array是你要形成的图形的坐标点,这边只是针对于xz轴上画的平面图形,segments指的是如何连接这几个坐标点,可参考HT for Web 形状手册,top和bottom就是让你选择是否有顶部或者底部,resolution微分段数,我们描绘一段曲线的时候可能只要确认几个个别的点然后在每两个点之间的连线上把它分成多个段,这样这条线段就会变得平滑,ht为了用户能够轻松操作这些线段,就封装了这一个参数,repeatUVLength默认为空,设置值后顶部和底部的贴图将根据制定长度值进行重复,tall模型的高度,默认为5,elevation模型中心的y轴位置,默认值为0,设置这个值可以使xz上的平面绕着y轴旋转。

底层的一个环形的效果是通过一个算法来实现的,环形得确认这个环形上有多少个元素,然后算每两个之间的角度,在通过sin、cos来计算每一个元素的位置,得出了如下代码:

names = ['设备2', '设备3', '设备4', '设备5', '设备6', '设备7', '设备8', '设备9'];
names.forEach(function(name, index) {
    x = 400, y = 200, angle = 45, r = 120;
    x = x3 + Math.sin((2 * Math.PI / 360) * angle * index) * r;
    y = z3 + Math.cos((2 * Math.PI / 360) * angle * index) * r;
    device = createRect([x, y3 + 15, y], [w * 0.1, 15, h * 0.1], '', '', floor3);
    createEdge(device5, device);
});
  • 大小: 1.8 MB
分享到:
评论

相关推荐

    快速开发基于 HTML5 网络拓扑图应用之 DataBinding 数据绑定篇

    在我们的网络拓扑图应用中,可以使用JSON来存储和传递节点、边以及其他拓扑结构信息。通过JavaScript,我们可以轻松地解析JSON数据,将其转化为应用程序可操作的对象,进而驱动拓扑图的显示。 为了实现数据的动态...

    计算机网络拓扑工具glNetViz.zip

    计算机网络拓扑工具glNetViz是一个基于WebGL技术的开源项目,专为可视化网络拓扑结构设计。这个工具能够帮助网络管理员和IT专业人士实时监控和管理复杂的网络环境,通过直观的图形界面呈现网络设备、链接和流量信息...

    网络游戏-大规模网络拓扑图形化显示的方法.zip

    1. **数据结构与算法**:在处理大规模网络时,需要选择合适的数据结构(如图、树或矩阵)来存储网络拓扑信息,并使用高效的算法(如Dijkstra或A*算法)进行路径搜索和优化显示。 2. **图形库和API**:使用图形库...

    three.js. 3D机房项目

    3D机房项目"是一个基于three.js库开发的三维可视化应用,主要用于模拟和展示数据中心的机房环境。这个项目利用WebGL技术在浏览器中渲染出逼真的3D场景,让操作者能够以第一人称视角或者上帝视角观察和互动。 ...

    D3静态拓扑图

    5. 拓扑布局:D3包含各种布局算法,如力导向布局,帮助自动计算节点的位置,形成美观的拓扑结构。 掌握这些知识点后,开发者可以利用D3创建出功能丰富、交互性强的静态拓扑图,用于展示和分析复杂的数据网络。

    ElGrapho高性能WebGL图数据可视化引擎

    3. **网络监控**:实时展示网络拓扑结构,监控流量和状态。 4. **生物学研究**:表示生物分子间的相互作用,如蛋白质相互作用网络。 5. **软件工程**:绘制代码依赖关系图,辅助代码管理和重构。 **总结** ...

    处理3D拓扑视图中网元对象信息的方法及设备.zip

    2. **拓扑结构表示**:在3D环境中,如何表示网络中的节点(如路由器、交换机)和连接线(如光纤、电缆)是关键。这涉及到拓扑布局算法,如力导向布局、树状布局等,以确保图形清晰、层次分明。 3. **网元对象信息**...

    flex制作拓扑拓扑

    在本场景中,“flex制作拓扑拓扑”指的是使用Flex技术来开发一个用于展示网络拓扑结构的应用程序。这样的应用通常被电信、移动和联通等行业用于可视化网络设备、线路布局以及监控网络状态。 首先,让我们深入了解...

    3D电信机房源代码

    "3D电信机房源代码"提供了一个基于HTML5的解决方案,通过WebGL技术实现3D漫游功能,使用户能够实时查看和操控电信机房的网络设备布局。本文将深入探讨这一系统的实现原理及其关键技术。 首先,我们要理解WebGL(Web...

    WebGL之绘制三维地球.docx

    其中,顶点坐标用来确定三维模型的形状,法线用来确定模型的朝向,贴图坐标用来确定模型的纹理,顶点索引用来确定模型的拓扑结构。 在构建网格时,我们可以从 xy 平面构建圆形,然后从 xz 平面将圆形转化为圆球。这...

    3D-axial3d.zip

    这样的3D效果通常需要结合前端开发技术,如HTML5的WebGL库Three.js,来在网页上实时渲染3D模型,为用户带来交互式的3D体验。 WebGL是一种基于OpenGL标准的JavaScript API,允许在浏览器中直接处理3D图形,无需插件...

    html5 web流程图绘制.rar

    这个技术基于HTML5的Canvas、SVG(可缩放矢量图形)或者WebGL等元素,提供了一种高效、交互性强的方式来进行图形化表达。 1. **Canvas API**: HTML5的Canvas是一个二维绘图板,通过JavaScript来绘制图形。开发者...

    基于C#开发的STEP文件解析器完整源码+项目说明(毕设项目).zip

    建立特定的数据结构,保存文件的拓扑结构。 编写一个转换器,将中性的STEP文件转换成通用的STL格式的3D图形文件。 加载并显示转换而来的3D图形文件。 基于以上技术,在windows平台上开发一个STEP解析软件的demo。 ...

    max2011 to Alternativa3D_8

    这包括理解并应用模型的拓扑结构、贴图坐标、动画帧率等信息。在32位和64位系统上都能运行的Alternativa3D_8,提供了一套完善的API和编辑器,使得开发者可以灵活地处理导入的3D资源,进行场景搭建、光照设置、物理...

    JS插件绘制树状图

    5. 网络拓扑:网络设备和线路的布局可以借助树状图清晰展现。 三、插件选择与使用 JS绘制树状图的插件有许多,如D3.js、Vis.js、Graphviz.js、GoJS等。这些插件通常提供丰富的配置选项,允许自定义节点样式、连接线...

    ThreeJS实现3D可视化机房

    Three.js是WebGL的一个强大框架,它简化了在浏览器中创建和展示3D图形的过程。该项目旨在模拟真实世界的机房环境,提供一种沉浸式的浏览体验,用户可以以第一人称视角在虚拟机房中移动,查看设备布局。 关键技术点...

    水边小厅3D模型

    2. **建模过程**:3D建模通常包含几个步骤:基础几何体创建、细节雕刻、拓扑优化和UV展开。设计师可能首先使用基本形状构建出小厅的框架,然后通过添加细节来完善模型,例如家具、装饰品和结构元素。 3. **纹理贴图...

    ht-for-web

    例如,你可以用它来创建网络拓扑图、流程图、组织结构图等,通过拖拽、缩放、旋转等操作,用户可以方便地查看和理解这些图形信息。 在页面布局方面,ht-for-web 提供了多种布局算法,如网格布局、树形布局、环形...

    Three.js点线几何空间图形特效

    4. **动画(Animation)**:Three.js提供了多种方法来创建动画,包括基于时间的动画控制和基于事件的动画。对于描述中的特效,可以利用动画更新点的位置或线的长度,从而创造出流动或脉冲的视觉效果。 5. **HTML5 ...

Global site tag (gtag.js) - Google Analytics