UINO优锘:用悬疑舞台剧的方式打开3D开发工程师的一天

2021-08-26 by uino 249 技术分享

物联网3D场景开发就如同一场舞台剧,舞台就是虚拟空间中的3D场景,演员就是场景中的各类模型,它们有着各自相应的位置和角色功能,而在舞台中摆放着的道具就是3D场景中各个模型的配饰,当“舞台搭建、演员、道具、API剧本”准备就绪了,这出3D剧目就拉开了序幕……

而这出舞台剧的“幕后操控者”(导演)其实就是我们“众星捧月”的3D开发工程师!他们不仅负责舞台剧的排练和演出,同时还要负责甄别相应的“演出事故”原因!而在UINO也有一位专注悬疑舞台剧的“大导”,UINO研发中心负责ART-可视引擎的3D开发工程师翔哥,在七夕佳节之际就破解了大型舞台系列悬疑剧之《Proxima模型闪烁案》,下面我们一起来看看翔哥“破案”的一天!

Proxima模型闪烁案

演出事故 Proxima 3.2版本里,场景中的一些模型会不由自主的闪烁,给场景添加了无限的“活力”,给实施人员添加了无限的惆怅,给翔哥添加了无限的幺蛾子! 看到这种情况,翔哥不禁有点焦头烂额,隐约觉得这“演出事故”背后的原因可能不是什么善茬。但翔哥的直觉告诉他,这估计是渲染的问题,所以首先就怀疑了instance渲染(模型批量渲染)。于是,翔哥开始了操作,在配置里把模型批量渲染先关掉。 果然,奇迹出现了,关闭模型批量渲染后就不闪了。手起刀落,为了坐实是instance的问题,咱得有理有据。于是,翔哥用ThingJS在线开发完美的复现了问题,给ThingJS API 提了个工单。不一会,工单就有了反馈。

事故原因

简单说就是场景中的模型缩放(scale)出现了负数,导致instance处理出现了问题。但是问题到这儿就结束了吗?翔哥和这位查看instance问题工单的研发同学有着同样的疑问:为什么物体的scale会有负值呢?

于是,翔哥开始“刨根问底”查找“演出事故”的“幕后黑手”!

破案过程

翔哥在ThingJS在线开发上,通过代码打印出来所有Thing对象的缩放值(scale),确实有一些对象的缩放出现了负数。

然后又打开原始的tjs文件,进行核对,发现原始输出的tjs文件中就记录了负数的缩放值。 而tjs的来源是CampusBuilder,真相进一步接近了,肯定是CampusBuilder中的某个操作导致了模型的缩放有负数! CampusBuilder,查他!

翔哥打开了CampusBuilder,拖了个模型,发现这里面有个镜像的功能,直觉告诉翔哥,这个操作很可疑很危险。

于是翔哥点击了这个神奇的镜像按钮,然后导出tjs,果然tjs里记录的为负数的scale值。

那么下一个问题接踵而至:这个为负数的scale值合理吗?

从3D原理的角度看,是合理的。

因为模型的镜像就是通过缩放变化实现的,当缩放系数为负时,即发生了镜像变化。

var app = new THING.App();

var url = 'https://model.3dmomoda.com/models/0598C1562DDB48A69C36E58A1DC46E52/0/gltf/'; // 模型地址

var obj = app.create({

type: 'Thing',

id: '模型01',

url: url,

position: [0, 0, 0], // 

complete: function (ev) {



    app.camera.position = [2.5924633695754356, 4.103642737800483, 1.796776548145628];

    app.camera.target = [0.5508564735224164, 1.2163745763678693, -0.24483034790739644];





    new THING.widget.Button('创建镜像模型', function () {

        var obj = app.create({

            type: 'Thing',

            id: '模型01-镜像',

            url: url,

            position: [1, 0, 0], // 

            complete: function (ev) {

                // 设置缩放动画

                ev.object.scaleTo({

                    scale: [1,1,-1], // 缩放倍数

                    time: 2000, // 动画时间

                    loopType: THING.LoopType.PingPong // 循环类型 设置循环后 无回调函数

                })

            }

        });

    })

}

});

但这样镜像后的模型,肯定是“反”的啊? 比如:原本在左侧的门,镜像后就是在右侧了。

从这一点,也能看出数字孪生的世界里,虚拟空间的“舞台剧”可没我们想象的那么简单。

首先咱UINO是做DCV数据中心可视化起家的,如果实施工程师以前都这么实施的话,开关机柜门肯定早就发现问题了。

难道是因为这个项目的实施工程师不知道?为了“偷懒”,想把模型批量旋转就用了镜像?

取证环节

于是,翔哥又开始调查起了实施人员。由于天色已晚,七夕又要将至,翔哥只能找盼杰(UINO项目经理)这种经验丰富的老实施人员取证了。

从盼杰的信息中,翔哥敏锐的观察到了,“以前”二字。说明,以前实施操作肯定是对的。此时公司已经没人能对证了,只有等第二天再查案了。

第二天,翔哥一早就来到了公司,看到佳琦(UINO项目经理)在,赶紧逮住让他在CampusBuilder操作镜像功能。一番操作后,发现机柜门确实是不太对,并且反复确认佳琦以前的操作和现象确实和今天的不一样了。

于是,翔哥觉得马上就能破案找到“事故真凶”了。应该是CampusBuilder在某次版本升级后,导致“镜像”这个功能发生了变更。于是,翔哥找到ThingJS研发组长张琪,在老版本的CampusBuilder和CampusBuilder2020里确实发现了,“镜像”这个功能有所变更。

老版本的CampusBuilder中的“镜像”功能只是将模型旋转了180度,而非真正的镜像。 从导出的tjs来看,确实也记录了旋转值。 所以之前实施工程师在用此“镜像”功能时,现象是对的,又能满足“一键”将模型“翻转”180度的能力,实施当然要这么用了。

调查结果

而新版本CampusBuilder2020中其实是将原来“镜像”非正镜像的bug给改正确了,因此在CampusBuilder2020版本中的镜像才是真正的镜像!

总结起来就是“怀旧服”CampusBuilder和“体验服”CampusBuilder2020交替时修复了之前的bug,导致各工具间的“信息感知”不对称。

看完这场“悬疑舞台剧”之后,我们能切实感受到数字孪生的技术栈和工具链是一套复杂的体系,各个组件之间有着大量需要相互配合的技术细节。当“悬疑舞台剧”中的“演出事故”模型闪烁案发生时,也是耗费了翔哥一天多的时间才找出真相!

可见,数字孪生引擎技术并非一蹴而就,作为引擎技术栈的提供商,必须通过大量工程实践来构建和完善这套复杂的体系。在日常工作中,犹如翔哥一样的数字孪生技术领域的从业者可能每天都在经历着“无数次的破案”,但也正因为UINO想让数字孪生技术变得简单易用,让大家都能体验到数字孪生可视化跟我们每个人的连接,因此就要付出更多的努力、经过无数次的bug修复、项目工程实践和积累来把各种复杂性屏蔽在底层。

比如,当你想要开发一个数字孪生应用场景时,虽然只需通过UINO提供的CampusBuilder、CityBuilder等工具链实现3D模型位置的摆放、增加配饰、设置参数、标签等信息,之后通过ThingJS、Proxima等平台进行虚拟空间中相应的孪生体集合的业务数据配置、关联逻辑等,就可实现数字孪生可视化场景的应用了。但这看起来易上手的操作背后是UINO规避了无数数字孪生技术底座的复杂性,从而实现了从建模到实施所有环节的简单应用。

UINO近10年都在致力于数字孪生领域的业务探索和技术积累,而在面对实际业务操作过程中出现的“悬疑案”其实也是激发我们持续改进的源动力。未来UINO将努力打造更加完善的数字孪生工具链和标准化平台,更好地支撑数字孪生可视化业务的普及。

数字孪生 智慧园区 智慧城市