一种关于Web端多种图形引擎的标准化接口设计方法
2023-10-30朱欢丽姚浩陈哲
朱欢丽 姚浩 陈哲
1. 中国电建集团华东勘测设计研究院有限公司 浙江 杭州 311122;2. 浙江华东工程数字技术有限公司 浙江 杭州 311122
引言
数字孪生是一种近年来快速发展的技术,它可以将实体物体的真实数据转化为数字化的虚拟模型,从而实现对其进行仿真和分析。数字孪生图形引擎作为数字孪生技术的重要应用之一,可以提供精确、高效的图形模拟和可视化效果,是数字孪生技术不可或缺的关键技术。
然而,面对数字孪生技术的快速增长和市场需求的变化,数字孪生图形引擎的应用程序越来越多,这些应用程序和平台之间存在互相独立的特点,导致它们难以互相交互和兼容,这显然会影响数字孪生技术的应用效果和发展。因此,实现数字孪生多维融合图形引擎中的标准化接口的设计成为当前的一个实用的研究方向。
1 背景与现状
数字孪生图形引擎是一种复杂的维数据的可视化引擎系统,它通常需要包含复杂的数据结构、算法和大量的可视化技术。针对这种复杂性,相应的应用程序可能会使用不同的技术和算法,导致它们无法互相交互和兼容[1]。这使得数字孪生多维图形引擎中的应用程序很难被其他应用程序所重复利用和扩展。通过整合引擎接口的统一,可以在应用层面解决以上问题。
2 关键技术与实现
实现多个图形引擎之间统一,一般有如下5个步骤[2]:①定义接口标准:首先需要明确各个图形引擎之间需要融合的共同点,包括数据格式、功能、参数等,根据这些共同点定义接口标准。②实现适配器:针对不同的图形引擎实现不同的适配器,将各个图形引擎的接口转化为通用的接口,以便实现融合。③实现桥接器:将适配器组合起来,形成一个桥接器,通过桥接器将多个图形引擎适配器连接起来。④实现融合逻辑:根据实际需求,设计具体的融合逻辑,利用桥接器将多个图形引擎的功能组合起来,实现多个图形引擎的融合。⑤测试和优化:进行全面测试和优化,确保融合接口的稳定性、可靠性和性能。
总的来说,多个图形引擎之间的融合需要进行详细的接口设计和实现,需要充分考虑各种因素,包括数据格式、功能、参数等。同时,需要进行大量的测试和优化工作,确保融合结果稳定、可靠。
2.1 统一控制入口
一般情况下,如果要在不同的场景下执行相同的代码以获取相同的功能输出,可以使用条件判断语句(如if-else或switchcase)在函数内部根据场景执行相应的代码。但随着场景和功能模块的增多,这种方式会导致代码变得冗长且难以维护。
可以采用分模块模式和适配器模式解决以上问题。按照引擎划分模块,每个模块负责实现一个引擎的功能,模块之间相互独立,但是又遵循相同的规范(函数名、传参、返回值)来实现对应的功能[3]。这样,每个模块就可以独立开发和维护。最后,通过一个控制类来进行模块控制和操作流程的控制。
具体实现中还会用到策略模式,即每个子模块都有一个用来管理子模块的策略类,每个策略类都实现了相同的接口。同时,还建议使用标准化的数据格式,如JSON。通过使用JSON作为场景加载数据的标准格式,可以简化数据的解析和处理。这样,在不同的场景下,我们只需要使用不同的JSON数据来加载对应的模块即可。
在实际编程中,我们应该注重代码的可读性、可维护性、可扩展性和可复用性。控制类SampleApp实现示例如下:
在控制类中,SampleApp.open()函数采用了策略模式,通过传入标准化的场景加载参数,调用SampleApp.getScene(),获取对应的场景策略类,获取该模块的控制入口。然后将该控制入口交给SampleApp.Scene代理,最终通过代理执行子模块open()方法加载对应场景。SampleApp.Scene作为子模块的代理,使用了代理模式,在后续操作中可以很方便地操作子模块,同时还增强了系统的可扩展性和灵活性。
2.2 统一工具和统一API
引擎中的组成部分可以划分为两个部分:工具和API。API提供了执行操作或返回所需内容的接口,而工具则是通过鼠标等输入设备与场景进行交互,以实现操作和输出的交互方式。工具是API的一种应用场景,例如测量、剖切等,使得与场景进行交互更为便捷。
2.3 统一工具的处理方式
工具是指用于与场景进行交互的功能模块,如测量和剖切。这些工具可以启动和销毁,因此在工具的父类Tool中,我们可以定义抽象函数start和cancel,并由子类进行继承和重写以实现工具的启动和结束。为了在工具启动前和结束后能够执行一些操作,我们增加了run和end函数,在这两个函数中去执行相关操作。这样的设计可以采用模板方法模式,将具体实现交给子类,同时保证父类中的算法结构不变。同时,将工具类抽象出来,利用工厂方法模式创建具体的工具实例,以实现灵活的工具管理和使用。示例代码如下:
在实现具体工具时,除了继承实现父类中定义的抽象函数:启动和结束,还需要为该类添加一个静态属性toolId,用于标识工具的唯一ID。这个ID将作为工具注册和获取的关键信息,可以通过工具注册类实现注册和获取功能。工具代码示例如下:
我们可以通过工具注册类来管理工具。在这个类中,我们将所有的工具维护在一个映射集合中,使用工具的唯一标识toolId作为映射的键值,将工具实现类作为映射的值记录进map集合中。当我们需要运行某个工具时,可以通过SampleApp.tools.run(toolId)方法获取对应的工具实例,然后执行工具内部的run方法,该方法默认继承自工具父类。使用工具注册类的优点在于可以动态添加和删除工具,从而更好地管理和维护工具集合。另外,工具的具体实现和管理被分离,增强了系统的可扩展性和可维护性。工具注册类实现示例如下:
2.4 统一API设计
在设计类似功能的API时,不同的引擎有不同的设计方式,例如参数和返回值,这将导致很大的差异。因此,实现标准化API对提高Web端多维图形引擎的效率和质量至关重要。
在具体实施中,为了实现标准化接口,按照相同的函数名、参数形式和返回值来设计不同子模块中的API。以三维引擎中常用的相机为例,即使每个引擎采用的坐标系相同,但对API的开放程度和实现上也有很大差别。为了解决这一问题,在每个子模块的Camera类中,需要统一实现获取相机参数的方法getCameraParams。该方法不需要入参,但返回结果需要统一,使用通用的经纬度作为坐标的格式,并将弧度制作为角度的单位格式,以保证返回值数据格式的统一。对应的设置相机参数方法称为flyTo,它只接收getCameraParams返回的数据格式,在函数将其转换为当前引擎所需的数据类型。至此,在后续使用中,可以执行同一行代码来获取或设置相机参数,不必考虑打开的是哪个引擎的场景。下面是相机类的实现示例:
3 结束语
在Web端对多种图形引擎进行标准化接口设计对数字化项目的研发和实施有很多实际意义。通过标准化接口,降低二次开发人员的引擎接口的学习成本,提高引擎接口的兼容性,提升开发效率和质量。同时一致的接口,一致的前端组件,还可以统一系统的UI和交互,提高用户体验。