量子物理因为区别于经典物理而被称为新物理,它最著名的三个特性就是叠加态、纠缠态和坍缩性。虽然目前尚不能完美地解释这些特性,但因为数学公式的严格推导、实验的间接证明和生活中的广泛应用,所以量子理论已经成为了真理的一部分。
所谓的叠加态,就是一个粒子可以同时多个具备排他的状态。比如一个电子在双缝干涉实验中同时出现在两个地方,造成明暗相间的条纹。但是,这怎么可能呢?确实,不仅仅是普通人,就连爱因斯坦到死的时候,也无法接受量子理论。 但是,无论能不能理解,如刚才所说,它就是真理。最重要的是,叠加性因为同时具备一些矛盾的特性,也拥有了逆天的实用价值。量子计算机的并行计算能力,就是利用叠加特性。如果有一天,人类能精准地预测天气,快速发明治疗各种疾病的药物,就是量子计算机在背后贡献力量。 知道了什么是叠加态,我们不难发现,在现实世界中,程序员们已经通过编写程序,在计算机的虚拟世界中创造了很多具备叠加性的应用系统,数字孪生就是典型的代表。 那么,数字孪生系统到底存在哪些叠加态?这些叠加态又是如何实现的呢?下面,就以北京优锘科技有限公司的数字孪生系统,即ThingJS
3D可视化平台(以下简称ThingJS)为例来进行具体的说明。 2 亦近亦远 当宇航员置身太空中时,尽管地球如此巨大,但依然能尽收眼底。再大的物体,只要距离它足够远,我们也能看清它的全貌,知道它的形状,颜色,其表面都覆盖着什么。 另一方面,就算距离地球如此之远,宇航员依然能够利用高精密度的观测设备,拉近了与地球的距离,甚至能够看清楚地面上的一只蚂蚁。可以说,利用了宇宙飞船和观测设备,宇航员同时具备了亦近亦远这种看似矛盾的能力。 现实工作中人们通常不需要观察或者管理地球这么大尺度的物体,但就算一栋楼或者城市的某个区域,也不是想远就远,想近就近的。要么借助某些工具,要么就是人自己跑的远一点或者近一点。 这一切在数字孪生系统出现后,便发生了变化。借助ThingJS,使用者只需要操作鼠标,便能改变与物体的距离,让人具备了远看全局近看细节的能力。 为了实现这种亦近亦远的能力,ThingJS都做了哪些工作呢? 2.1 虚拟摄像机 在解释亦近亦远能力如何实现之前,要说一个ThingJS的专业术语:摄像机,它是可视化应用开发过程中必不可少的一个概念,它是用户观察3D场景的切入点。你可以把电脑的屏幕理解成摄像机,屏幕后面就是三维虚拟世界。亦近亦远的三维场景,就是通过控制摄像机的可视范围来实现的,即可视范围越大,物体显得更远;可视范围越小,物体显得更近。 ThingJS还有一种能力,就是摄像机不动的情况下,某个被观察物体可以单独进行缩放,这种伸缩可以是长宽高同时缩放,也可以是某个方向上单独缩放。 2.2 精简切换 可视化应用很重要的一个使用场景就是宣传展示,展示的设备会由普通的电脑显示器变成了大屏,分辨率可能达到2K、4K甚至8K。在这种分辨率下,模型必须制作的非常精细,才能够保证在近距离和高分辨率下,模型依然保持正常的观感,不模糊,不出现锯齿。但这又带来了另外一个问题,精细的模型比普通的模型占用更多的内存和显卡计算能力,精细的模型多的时候,就会出现大家所说的“卡”。 经常玩游戏的人深有体会,配置低的电脑如果各种游戏特效都打开,流畅度就会大大下降,原因之一就是特效打开的情况下,加载过多的高精细度的模型(人物模型、道具模型、特效模型等)造成的。 ThingJS巧妙的使用了精模简模切换的办法,兼顾了性能和视觉效果。也就是说在场景初始化后,用户是远距离观察整个场景,此时系统虽然加载了所有模型,但加载的是精细度较低的模型,保证了系统响应速度;当用户近距离观察某个设备(比如数据中心的机柜)的时候,系统会自动把那些在用户视野范围内且距离较近的设备切换为精细的模型,因为同时在用户视野内且距离较近的设备数量不可能过多,所以虽然是精细模型也不影响系统性能。 2.3 小地图 ThingJS支持小地图方式,帮助用户在全局视角下,通过点击右上角小地图的某个点,在3D场景中观察该位置的详细情况。这个功能让用户同时拥有了远近观察的能力。 3 亦内亦外 小时候很喜欢看动画片,印象最深的动画片之一便是崂山道士。片中的王生习得了法术,可以念动咒语,穿过墙壁进入室内,不过因为他心术不正,最终导致法术失灵。 时至今日,崂山道士换成了ThingJS,穿墙术换成了层级切换,而且这个法术百试百灵,永远不存在失效的情况。 3.1 层级切换 首先,ThingJS将3D场景中的空间单位按从大到小的顺序进行了层级划分,比如分别为园区,建筑、楼层、房间、物体等等。 以此结构为基础,ThingJS提供了层级切换的能力,让用户的观察视角在各个层级之间实时变化,穿墙瞬移都不是问题。比如在园区层级,双击某个建筑物,可以切换到建筑层级,近距离的观察建筑物外立面;再双击建筑物的某个楼层,可以切换到楼层层级,查看该楼层的布局结构。 层级切换能力可以从外到内,也可以从内到外,但都是逐级切换。 更神奇的是,无论在任何层级,用户可以立刻飞到某个物体的旁边,就像X战警中的瞬移人。这个功能通常用来实现物体的搜索和空间定位。 3.2 第一人称行走 如果觉得层级切换和瞬移这种超能力太过逆天,而你只想做个普通人,规规矩矩的从外到内,也没问题。ThingJS还提供了第一人称行走的能力,就像玩游戏一样。 A:左移; D:右移; W:前进; S:后退; 空格:跳跃; 鼠标:旋转场景; 在此功能基础上,还可以自定义行走路线。设定完成后,视角就会根据设定的路线自动行走并切换。 4 亦分亦合 请看下面两张图,看出有什么差别了吗? 第一张图中,是变电站的一台主变压器,但为了管理和观察上的方便,在第二张图上将这个变压器的各个组件进行了拆解,可以查看每个组件的外形和监控数据。 在应用系统所管理的对象中,有很多类似的物体,它包含了众多复杂的组件。如果拆开表示,虽然能够仔细观察到各个组件的外观和运行情况,但却破坏了系统总体外观上的完整性;如果不拆开,就难以了解复杂对象的物理结构,在理解这个对象的运行原理,以及发生故障时候的根源分析和问题解决的情况下,都会造成困难。由此可见,具备了聚合分解能力的模型和可以承载这种模型的可视化平台是多么重要。 4.1 模型制作 阅读过了上面的部分,我们自然可以想到,ThingJS平台亦分亦合的能力是要有相应的模型支持的,程序还没有达到能把一个模型拆解成多个模型组件的智能化程度。 优锘的建模工程师从客户处获取物体各个组件的外观照片,然后分别建模再整合到一起。这个过程中,每个组件模型的美观和组合在一起的完整性和契合性都要保证,其制作的复杂性和时间上的高成本,导致了在实际项目中,只有一些大型的、重要的物体,比如变压器、盾构机等,才进行分合模型的制作。 4.2 模型分合 分合模型制作完成后,接下来就是程序处理了。程序可以按照视觉上的合理性,设置各个组件的运动轨迹和向量,然后对物体的各个组件进行位移,最后形成一个整体模型分开,变成多个组件模型的动画效果。 实际开发过程中,一个分合模型的组件数量比较少还好,但是如果组件数量多,一个个进行轨迹和向量的设置然后测试,最后形成一个合理的视觉效果,会耗费很大的工作量。因此,ThingJS提供了一个可视化工具,实现了模型移动和代码自动生成的双向交互。也就是说,将一个分合模型导入到这个可视化工具后,可以用鼠标拖动模型中的一个组件,系统就会自动生成相应的脚本。如此往复,把每一个组件都用鼠标拖动到分开状态下的合适位置,也就完成了所有的代码开发工作。如果对位置的细节不满意,还可以修改代码中代表位移长度的数字,则可视化区域中的组件会进行对应的移动。 4.3 动态组合 分合模型的动画效果无论从视觉感受,还是实际管理上都有很重要的意义。不过,ThingJS亦分亦合的能力不仅于此,比如动态组合。 在与某厂的合作过程中了解到,他们为客户生产的数据中心微模块中,包含的机位数量是不固定的,每一种类型的微模块有十几种可能性,而且微模块的类型有很多种。在这种情况下,一般的做法就是要做几十种模型,更要命的是,如果某种类型的微模块的模型要进行改动,这个系列的所有模型都要改变,费时费力易出错。 为此,ThingJS新增了一种动态组合的能力,像上文中提到的微模块,会制作一个含有三个组件,即两侧的门和一对机柜(如果是单列微模块就是一个机柜)的模型。在3D场景中,系统可以根据外部系统传入的参数(包括方向和机柜数量),动态的加载模型组件,即微模块前门,动态数量的机柜和微模块后门,最终在3D场景中形成大小不一的微模块。 5 亦静亦动 一般人理解数字孪生系统,只是简单地理解为二维变三维,殊不知,比起维度的改变,更重要的是,数字孪生系统让原来静止的世界动了起来。ThingJS也是如此,如果用户想仔细地清楚,它就静止;如果用户想全面的了解,它就转动。当然,为了更好地展示被管理的对象,ThingJS平台研发出的更多能力是向着动的方向倾斜的。 5.1 物体控制 ThingJS提供了很多控制物体的方法,包括: 显示/隐藏:可以让某个或者某些物体模型显示或者隐藏; 旋转:让某个物体模型沿任意方向,旋转任意的角度; 移动:让某个物体模型沿着一定的线路移动; 上面提到的物体显示隐藏、旋转和移动都是比较简单的运动能力,ThingJS还提供了一些复杂的运动能力,比如一个物体围绕着另一个物体旋转,一个物体追随着另一个物体运动等等。各种简单和复杂的运动方式组合起来,为各种业务场景的可视化展示和管理提供了无数的可能性。 还有一种活动效果是模型本身就具有的,比如数据中心场景中的机柜门的开关。ThingJS可以获取并展现该模型具备的所有活动效果。 5.2 视点动画 如果把物体控制能力形成的效果比喻成小视频的话,那么ThingJS的动画制作能力就可以看成是动画片的制作。设想一下,如果有机会变成宫崎骏,谁还会在乎抖音上火不火呢。那么,ThingJS的动画的制作过程是怎样的呢? 首先了解一下视点的概念。其实很容易理解,在3D场景中,某一个固定的画面就是一个视点。当然了,从用户的角度看是一个静止的画面,而从系统后台看这个画面却包含了众多的数据,比如场景的编号和角度,摄影机到场景的距离和角度等等。 在了解了视点的概念后,下一步就是获取视点,相当于把你认为合适的3D场景画面按个暂停键然后截图。 如果想动画过程中表现的内容多一些,就要多获取一些视点,形成一个视点列表。 完成了一个视点列表,其实就是完成了一个动画的制作。你可能会想怎么会这么容易,如果一个视点是园区的鸟瞰图,下一个视点是某个设备的细节放大图,两个视点连续播放岂不就是图片的切换,跟动画有什么关系呢? ThingJS的强大之处,就在于它没有把视点切换做成生硬的图片切换,而是在后台做了大量的工作,计算两个视点中场景的层级和角度,摄像机的距离和角度等信息,然后按照一定速度均匀地进行变换,从用户的角度看起来,就是一个平滑的动画过程。 如果还不明白,就想象一下那些能够进行变脸的APP吧,这些APP通过算法把一张脸渐渐地,毫无违和感地变成另外一张脸。虽然这算法复杂,但是用户只需要关心前后两张脸的图片就行了,剩下的交给计算机。 限于篇幅原因,ThingJS量子宇宙的叠加态先介绍到这里。接下来的一篇中,我们还将介绍亦简亦繁,亦旧亦新,亦真亦幻和亦独亦群四种叠加态。 |