使用3D呈现拓扑的多层次结构

关于3D场景在现在网管中的应用的讨论一直没有停止过,应用场景有哪些,应用的意义有哪些,可以为产品开发、为系统使用带来多少利益点等等。今天给大家介绍一种应用情景,希望能借此机会,抛砖引玉,引出更多更具有实际意义的应用需求来,为大家应用系统的丰富性添砖加瓦。
在TWaver传统的2D应用中,近一年非常突出地出现了一种需求,那就是希望能够在同一个页面内显示多种层次的网络结构,这样做的好处在于:在同一个页面中可以清晰地描述一个网络从逻辑到物理上的结构,与此同时,如果做跨层次的交互的时候(例如说更改子网内外节点的连接关系),就不需要采用钻取/回退(drill down/up)或者群组合并/收缩等的复杂操作了。

TWaver过去提供了使用2D技术拼凑上述需求页面的示例代码,效果已经相当不错了,但是客户的需求也是随着技术的发展而不断水涨船高,对原来的方案提出了不足之处:一方面立体感不够,场景不具有三维交互;另一方面,如果层次多,铺展较为分散的时候,拼接这样的图纸较为麻烦。
层次,意味着在平面坐标之余,多出一维数据用来描述节点关系,常用的描述方式则是节点纵向位置的不同(高中低的位置偏差)。仔细一想,这不正是3D场景中,高程数据的一个用武之地吗,Z轴坐标不是恰恰可以描述出高中低位置的差异,不也就正好能凸显节点间的层次吗?ok,马上试试看:
首先组织子网数据,同一个子网的数据我们认为它们处于同一层次,固然也就是具有相同的z坐标。

private function createGroup1():void{
	var box:ElementBox = network.elementBox;
	var bus:Node = NodeUtils.buildBus(new Vector3D(startx,ly,b1z),
                                                        new Vector3D(b1xr,ly,b1z),12,0xa0a0a0);
	box.add(bus);
	box.add(NodeUtils.buildNodeWithCommon(gpg(0,0,0),
        serverSize,s1,null,null,null,"s"));
	box.add(NodeUtils.buildNodeWithCommon(gpg(2,0,0),
        serverSize,s1,null,null,null,"s"));
	box.add(NodeUtils.buildNodeWithCommon(gpg(4,0,0),
        serverSize,s3,null,null,null,"s"));
	box.add(NodeUtils.buildNodeWithCommon(gpg(0,0,0),
        serverSize,s2,null,null,null,"s"));
	box.add(NodeUtils.buildLink([gpg(0,ly,0),gpg(0,ly,8)],3,0x00AAA0));
	box.add(NodeUtils.buildLink([gpg(2,ly,0),gpg(2,ly,8)],3,0x00AAA0));
	box.add(NodeUtils.buildLink([gpg(4,ly,0),gpg(4,ly,8)],3,0x00AAA0));
	box.add(NodeUtils.buildLink([gpg(2,ly,8),gpg(2,ly,10),gpg(8,ly,10)],
        8,0x20AA20));

	box.add(NodeUtils.buildNodeWithCommon(gpg(8,0,10),
        srSize,csr,null,null,null,"s"));

	box.add(NodeUtils.buildBus(gpg(4,ly,14),gpg(8,ly,14),
        12,0xa0a0a0));
	box.add(NodeUtils.buildNodeWithCommon(gpg(5,0,17),
        serverSize,s1,null,null,null,"s"));
	box.add(NodeUtils.buildNodeWithCommon(gpg(7,sy,17),
        smallSize,s1,null,null,null,"s"));
	box.add(NodeUtils.buildLink([gpg(5,ly,17),gpg(5,ly,14)],
        3,0x00AAA0));
	box.add(NodeUtils.buildLink([gpg(7,ly,17),gpg(7,ly,14)],
        3,0x00AAA0));
	box.add(NodeUtils.buildLink([gpg(6,ly,14),gpg(6,ly,12),gpg(8,ly,12),gpg(8,ly,10)],
        8,0x20AA20));
	box.add(NodeUtils.buildBus(gpg(8,ly,10),gpg(10,ly,10),10,0x00a0a0));
	box.add(NodeUtils.buildBus(gpg(10,ly,8),gpg(10,ly,12),12,0xa0a0a0));
	box.add(NodeUtils.buildLink([gpg(10,ly,9),gpg(13,ly,9)],3,0x00AAA0));
	box.add(NodeUtils.buildLink([gpg(10,ly,11),gpg(13,ly,11)],3,0x00AAA0));
	box.add(NodeUtils.buildNodeWithCommon(gpg(13,sy,9),
        smallSize,s2,null,null,null,"s"));
	box.add(NodeUtils.buildNodeWithCommon(gpg(13,sy,11),
        smallSize,s2,null,null,null,"s"));

	box.add(NodeUtils.buildLink([gpg(13,ly,9),gpg(12,ly,5)],3,0x00AAA0));
	box.add(NodeUtils.buildLink([gpg(13,ly,9),gpg(16,ly,9)],3,0x00AAA0));
	box.add(NodeUtils.buildNodeWithCommon(gpg(12,0,5),
        serverSize,s3,null,null,null,"s"));
	box.add(NodeUtils.buildNodeWithCommon(gpg(16,0,9),
         serverSize,s1,null,null,null,"s"));

	box.add(NodeUtils.buildBillboard(gpg(22,ly,9),"cloud"));
	box.add(NodeUtils.buildLink([gpg(16,ly,9),gpg(22,ly,9)],3,0x00AAA0));

	box.add(NodeUtils.buildLink([gpg(13,ly,11),gpg(18,ly,11)],3,0xAA00A0));
	box.add(NodeUtils.buildLink([gpg(13,ly,11),gpg(17,ly,17)],3,0xAA00A0));
	box.add(NodeUtils.buildLink([gpg(13,ly,11),gpg(15,ly,19)],3,0xAA00A0));
	box.add(NodeUtils.buildLink([gpg(13,ly,11),gpg(10,ly,19)],3,0xAA00A0));
	box.add(NodeUtils.buildNodeWithCommon(gpg(18,sy,11),
        smallSize,s3,null,null,null,"s"));
	box.add(NodeUtils.buildNodeWithCommon(gpg(17,sy,17),
        smallSize,s1,null,null,null,"s"));
	box.add(NodeUtils.buildNodeWithCommon(gpg(15,sy,19),
        smallSize,s2,null,null,null,"s"));
	box.add(NodeUtils.buildNodeWithCommon(gpg(10,sy,19),
        smallSize,s2,null,null,null,"s"));

	var plane:Node = NodeUtils.buildPlane(new Vector3D(0,-42,0),
        new Vector3D(1000,1000,1000),0xE0E0E0,"floor");
	box.add(plane);
	plane.setStyle(Style3D.ZORDERING_LAYER,-100);
	box.add(NodeUtils.createText(new Vector3D(0,-35,-400),
        "Group A",0xFFA0A0));

}

 


我们再创造另外一个层次的子网内数据,为了与第一个子网分出层次的不同,我们把这个层次的子网内对象设置上和上个子网内对象不同的z坐标。

private function createGroup2():void{
        var box:ElementBox = network.elementBox;
	var bus:Node = NodeUtils.buildBus(new Vector3D(startx,ly,b1z),
        new Vector3D(b1xr,ly,b1z),12,0xa0a0a0);
	box.add(bus);
	box.add(NodeUtils.buildNodeWithCommon(gpg(-15,b2,0),
        serverSize,s1,null,null,null,"s"));
	box.add(NodeUtils.buildNodeWithCommon(gpg(-13,b2,0),
        serverSize,s1,null,null,null,"s"));
	box.add(NodeUtils.buildNodeWithCommon(gpg(-11,b2,0),
        serverSize,s1,null,null,null,"s"));
	box.add(NodeUtils.buildNodeWithCommon(gpg(-9,b2,0),
        serverSize,s1,null,null,null,"s"));
	box.add(NodeUtils.buildNodeWithCommon(gpg(-15,b2,7),
        serverSize,s1,null,null,null,"s"));
	box.add(NodeUtils.buildNodeWithCommon(gpg(-13,b2,7),
        serverSize,s1,null,null,null,"s"));
	box.add(NodeUtils.buildNodeWithCommon(gpg(-11,b2,7),
        serverSize,s1,null,null,null,"s"));
	box.add(NodeUtils.buildLink([gpg(-15,l2,0),gpg(-15,l2,4)],3,0x00AAA0));
	box.add(NodeUtils.buildLink([gpg(-13,l2,0),gpg(-13,l2,4)],3,0x00AAA0));
	box.add(NodeUtils.buildLink([gpg(-11,l2,0),gpg(-11,l2,4)],3,0x00AAA0));
	box.add(NodeUtils.buildLink([gpg(-9,l2,0),gpg(-9,l2,4)],3,0x00AAA0));
	box.add(NodeUtils.buildBus(gpg(-16,l2,4),gpg(-8,l2,4),12,0xa0a0a0));
	box.add(NodeUtils.buildLink([gpg(-15,l2,7),gpg(-15,l2,4)],3,0x00AAA0));
	box.add(NodeUtils.buildLink([gpg(-13,l2,7),gpg(-13,l2,4)],3,0x00AAA0));
	box.add(NodeUtils.buildLink([gpg(-11,l2,7),gpg(-11,l2,4)],3,0x00AAA0));
	box.add(NodeUtils.buildLink([gpg(-9,l2,0),gpg(-9,ly,0),gpg(0,ly,0)],
        3,0x20AA20));
	var plane:Node = NodeUtils.buildPlane(new Vector3D(-800,100,300),
        new Vector3D(400,400,400),0xA0EEA0,"floor");
	box.add(plane);
	plane.setStyle(Style3D.ZORDERING_LAYER,-50);
	plane.setStyle(Style3D.BOTH_SIDES_VISIBLE,true);
	box.add(NodeUtils.createText(new Vector3D(-700,l2+20,100),
        "Group B",0xFFA0A0));
}


于是我们就得出了如此的层次结果

由于我们使用了TWaver 3D的开发包,因此自然而然地就带上了必要的3D交互,例如整个场景的旋转,双击机柜节点切换场景中心,鼠标滚轮进行场景缩放等等。大家可以点击此处体验一下

Demo的简要介绍请参看论坛相关内容

关于demo的详细代码,请到此处下载
见原文最下方

 

基于threejs(webgl)的3D元宇宙云展厅 首先看看效果图: 基于 threejs 开发的 3D 展厅,展品可以自由摆放。支持 gltf/glb 格式在线演示:在线演示地址 加载厅模型 加载其他模型和动画 加载展品数据 导览 开启和关闭重力感应 阅读详情

相关推荐

Threejs实现3d地球记录(3)

国家Mash生成 鼠标悬浮高亮 显示标签

qq_41051239的博客 1927

基于Echarts的网桥拓扑结构可视化模拟

基于Echarts的网桥拓扑结构可视化模拟 一、项目背景及介绍 该项目为《高级计算机网络》第一次实践作业,作业目标: 网络初始化 网络初始化 支持运行前预设、运行时设置网络拓扑(输入:网桥数量、各网桥所管辖的网段及站点数量) 每个网桥维持一张转发表 模拟过程 每次发送一帧时,显示发送信息,如:网桥B1.网段1.站点A --> 网桥B3.网段2.站点G 按照网桥的自学习规则,进行相关转发表的更新、帧的转发 模拟方式 展示内容:拓扑图、网桥转发表、帧流向等 操作功能:“转发”、“后退”

优快云_0007的博客 2262

什么是拓扑(Topology) - 3D 角色 建模过程中的 中的术语:拓扑

文章目录目的3D 美术上的 拓扑Turbosquid 3d Resources - TopologyBlender 中为例 - 拓扑结构对 表面细分 修改器的影响数学上的 拓扑3D美术拓扑工具References 目的 因为最近需要往 TA 方向进阶 那么 光懂 T 方面还不行 A 方面得基础也得有所了解 下面将了解 建模过程中的 基础术语之一:拓扑 相信和 3D 美术同学打过交道得 T 们 都经常会听到美术同学说 XXX 拓扑 那么 拓扑 是个啥子意思? 3D 美术上的 拓扑 3D 美术的 “理解”

Jave.Lin 的学习笔记 2万+

MATLAB拓扑优化代码-Top3d

MATLAB拓扑优化代码-Top3d 【下载地址】MATLAB拓扑优化代码-Top3d Top3d 是一款高效简洁的 MATLAB 三维拓扑优化程序,仅需 169 行代码即可实现有限元分析、灵敏度分析、密度过滤器和优化等功能。它为用户提供了快速解决三维拓扑优化问题的工具,支持轻松修改支撑和外部载荷定义,操作简单,启动迅速...

gitblog_06723的博客 1176

matlab脑电图绘画:2D头皮电位拓扑图和3D皮质层拓扑图

今天刚好又再等实验数据,那我就来分享一下最近写论文所涉及到画图的知识好啦! 1. 本文涉及的背景: a. 针对脑电正问题模型,设置电偶极子强度计算了头皮电位,为了直观显示绘制了2D的头皮电位拓扑图; b. 分别激活不同偶极子,分析各偶极子引起头皮电位差的整体情况,分别计算了RDM(相对差异度)和MAG(放大系数),为了直观显示各电偶极子对RDM和MAG的影响情况,需要绘制3D皮层拓扑图。这个不知道大家是否能理解,如果不能理解那就只需要关注一句话,就是绘制了3D皮层拓扑图...

m0_58134168的博客 7321

HTML5的WebGL实现的3D和2D拓扑树

在HT for Web中2D和3D应用都支持树状结构数据的展示,展现效果各异,2D上的树状结构在展现层级关系明显,但是如果数据量大的话,看起来就没那么直观,找到指定的节点比较困难,而3D上的树状结构在展现上配合HT for Web的弹力布局组件会显得比较直观,一眼望去可以把整个树状结构数据看个大概,但是在弹力布局的作用下,其层次结构看得就不是那么清晰了。所以这时候结构清晰的3D树的需求就来了,那么

yixiaof的专栏 1077

基于 HTML5 的 3D 网络拓扑树呈现

在HT for Web中2D和3D应用都支持树状结构数据的展示,展现效果各异,2D上的树状结构在展现层级关系明显,但是如果数据量大的话,看起来就没那么直观,找到指定的节点比较困难,而3D上的树状结构在展现上配合HT for Web的弹力布局组件会显得比较直观,一眼望去可以把整个树状结构数据看个大概,但是在弹力布局的作用下,其层次结构看得就不是那么清晰了。所以这时候结构清晰的3D树的需求就来了,那么

专注于技术研发行业技术主要有AI人工智能视觉识别、物联网技术、电商平台、app原生技术、微信小程序、鸿蒙语言开发、办公企业oa、ERP等,致力于做东半球最优秀的程序员 1183

基于HT for Web的3D拓扑树的实现

<img src="http://images2015.cnblogs.com/blog/591709/201509/591709-20150909005301340-1280291034.png" class="desc_img"/>在HT for Web中2D和3D应用都支持树状结构数据的展示,展现效果各异,2D上的树状结构在展现层级关系明显,但是如果数据量大的话,看起来就没那么直观,找到指定的节点比较困难,而3D上的树状结构在展现上配合HT for Web的弹力布局组件会显得比较直观,一眼望去可以把整

tingyktwj12的专栏 1445

什么是3D模型拓扑?

这通常通过重新优化点、线、面,在原始基础上进行模型的重新绘制来实现,产生细节足够且面数较少的模型。3D模型拓扑是3D建模过程中的一个重要概念,涉及模型表面的几何结构,特别是点、边和面的连接性,以及表面的光滑性。在3D建模中,好的拓扑结构能够使模型更加具有艺术性和自然感,更接近真实物体的结构,如动物、车辆、机器人等。通过合理的拓扑设计,模型可以呈现出更加逼真的细节和光滑的表面。总的来说,3D模型拓扑是一个综合性的概念,涉及模型的结构、细节、性能和视觉效果等多个方面。

jianewang的博客 1918

点云从入门到精通技术详解100篇-基于拓扑约束的3D点云实例分割

本研究引入持续同调等拓扑数据分析工具以提高模型对3D点云数据实例分割 的表现。因此本章首先介绍拓扑数据分析中的基础概念,其包括单纯型,单纯复型, 单纯同源群,持续同调。然后再对深度学习中的持续同调等应用基础进行介绍。最 后对基于聚类3D点云实例分割方法的常用算法进行介绍。

getusushu的博客 1458

MATLAB实现的3D拓扑优化实战教程

随着计算技术的飞速进步和材料科学的发展,3D拓扑优化已经成为了工程设计和制造领域中的一项重要技术。它不仅能够帮助设计师和工程师在满足一定功能和性能约束的前提下,设计出更加轻质、高效、经济的结构组件,而且还有助于减少材料浪费,提高产品性能。本章将介绍3D拓扑优化的基本概念、历史背景以及在现代工业中的重要性。在进行3D拓扑优化的过程中,优化问题的基本组成通常包括目标函数、设计变量、约束条件和优化参数。

weixin_35751194的博客 1237

如何解决3D建模中的网格拓扑难题

你是否曾经面对过这样的困境:精心制作的3D模型却因为混乱的网格拓扑而难以进行后续的UV展开和动画绑定?当从ZBrush或扫描数据导入高精度模型时,那些不规则的三角面分布往往成为制约创作效率的瓶颈。 ## 3D建模中的四大拓扑痛点 ### 痛点一:高模网格杂乱无章 许多建模师从数字雕刻软件导入高精度模型后,常常发现网格密度不均、三角面过多的问题。这不仅影响模型的美观性,更会导致后续工作流程的严重

gitblog_01177的博客 676

Steam游戏服务器攻防全景解读——如何构建游戏级抗DDoS防御体系?

当检测到TCP/UDP混合攻击时,应触发预设的熔断策略:优先保障游戏大厅服务的UDP 27015端口,临时限制匹配系统的TCP连接数。针对Steam游戏服务器特有的UDP 4380端口,需配置协议合规性检查规则:限制数据包长度不超过128字节,强制校验请求来源IP的真实性。Steam游戏服务器的防护需要平衡安全性与玩家体验,通过协议深度解析、智能流量调度和服务端加固的三维防御体系,可构建游戏行业专属的抗DDoS护城河。答:采用弹性防护方案,基础防护带宽保持50Gbps,遭遇攻击时自动扩展至T级清洗能力。

2501_91486804的博客 1453

基于HTML5的3D网络拓扑树呈现

在HT for Web中2D和3D应用都支持树状结构数据的展示,展现效果各异,2D上的树状结构在展现层级关系明显,但是如果数据量大的话,看起来就没那么直观,找到指定的节点比较困难,而3D上的树状结构在展现上配合HT for Web的弹力布局组件会显得比较直观,一眼望去可以把整个树状结构数据看个大概,但是在弹力布局的作用下,其层次结构看得就不是那么清晰了。所以这时候结构清晰的3D树的需求就来了,那么这个3D树具体长成啥样呢,我们来一起目睹下~

HT for Web 3D 2913

Java + Selenium + TestNg + Allure Web UI 自动化

我们知道,在Python中针对Web UI自动化有Python + Selenium + Pytest/Unittest +Allure的技术栈。那么对于Java而言,也有其独特的Web UI 自动化技术栈。相同的,我们同样的运用Selenium框架,测试报告同样运用Allure。不同的是,我们运用的语言由Python转化为了Java,测试用例管理框架从Pytest转化为了TestNG。

qq_45594960的博客 1912

思科模拟器CIsco Packet Tracer利用三层交换机实现VLAN间路由

版权声明:如果对大家有帮助,大家可以自行转载的。 1.技术原理: 三层交换机具备网络层的功能,实现 VLAN 相互访问的原理是:利用三层交换机的路由功能,通过识别数据包的 IP 地址,查找路由表进行选路转发,三层交换机利用直连路由可以实现不同 VLAN 之间的相互访问。三层交换机给接口配置 IP 地址。采用 SVI(交换虚拟接口)的方式实现 VLAN 间互连。SVI 是指为交换机中的VLAN 创建...

qq_37992321的博客 1万+

如何快速优化3D模型拓扑:Blender重拓扑插件完整指南

在3D建模工作中,你是否经常遇到网格结构混乱、三角面过多的问题?这些问题不仅影响模型的美观性,更会为后续的UV展开和动画绑定带来巨大挑战。今天介绍的Blender重拓扑插件正是解决这些痛点的利器,它能将复杂的三角网格智能转换为规则的四边形拓扑结构。 ## 建模难题与智能解决方案 ### 高模拓扑混乱的困扰 从ZBrush或3D扫描导入的模型常常面临网格分布不均的问题。不规则的三角面结构让模型难

gitblog_00593的博客 1044

雷达工程师避坑指南:STAP处理中,间歇采样转发干扰为什么这么难对付?

本文深入解析了STAP处理中间歇采样转发干扰(ISRJ)的挑战与应对策略。通过分析ISRJ的工作机制和自由度消耗问题,结合仿真数据对比,揭示了其与传统压制干扰的本质差异。文章还探讨了在工程实践中如何构建有效的防御体系,包括降维处理技术选择和混合架构设计,为雷达工程师提供了实用的避坑指南。

weixin_30530339的博客 267

Blender中的重拓扑修改器如何使用?

Mode”(模式)下拉菜单允许您选择“Sharp”(锐利),用于保留锐利边缘,或“Smooth”(平滑),用于创建更有机的拓扑。Blender中的“Decimate”和“Remesh”修改器是强大的工具,可以帮助优化和简化各种3D项目的网格,如动画、游戏开发或3D打印。通过遵循这些步骤,您可以有效地使用Blender中的“Remesh”修改器来创建一个基于您指定设置的更均匀拓扑的新网格。通过遵循这些步骤,您可以有效地使用Blender中的“Decimate”修改器来简化和优化您的网格,用于各种目的。

Renderbus瑞云渲染的博客 3541

Open3D 实现CSF布料模拟算法【2025最新版】

CSF布料模拟算法在open3d模块下的实现,博客长期更新,本文最近更新时间为:2025年1月16日。。

点云侠的博客 5745

Unity如何实现3D物体拆解组装

最近有一个需求,是做一个发动机的拆卸和安装功能,其实是一个很简单的功能,但是其中有一个点我觉的非常有意思,就是拖拽组装时,物体如何精准拖到目标位置,思路有了,但是我一直找不到实现方式,早晨刷牙时无意间想到了叉乘,我才有了解决方案。就凭这一次的灵光乍现,也很有必要写篇博客来记录一下。首先,我们先来看下我们要实现的效果,就是对一个发动机(任意多组件物体,如:车)的360°预览查看,手动拖拽拆解,手动拖拽组装。360°旋转视角远近拉伸视角点击拖拽拆卸拖拽组装。

TxNet 1万+
上一篇: 减少Menu分割线的间距
下一篇: 用TWaver HTML5定制五彩斑斓的链路
subnetwork
博客等级 码龄17年 17粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值