周建秋,陈卫华,李 丹,杨正辉
(中广核工程有限公司 核电安全监控技术与装备国家重点实验室,广东 深圳 518172)
图1 系统架构Fig.1 System architecture
虚拟现实技术以其具有沉浸感、交互性和构想性等特性[1],在核电工程建设领域的需求和应用越来越广泛,如今除设计板块以外的施工、运行、培训以及公关等领域都需要三维虚拟现实技术,针对具体应用场景提供各种相应的三维虚拟现实解决方案。虚拟核电畅游系统可以为用户提供核电厂厂区、厂房、设备等虚拟场景等比例的沉浸式漫游浏览,通过体感交互,模拟操作场景中的动态元素,给用户带来身临其境的体验,是虚拟现实技术向核电现场和下游板块延伸的一个载体。通过虚拟核电畅游系统,用户不用进入现场就可以看到核电厂内部的样貌。
在传统的核电三维漫游系统中,存在模型精度不高且涵盖面小,光影及烘焙效果不够真实,场景加载和切换速度过慢,渲染帧率低等问题;同时用户通过鼠标、键盘对虚拟三维场景游览的传统交互手段也缺乏一定趣味性,不能给用户带来真实有趣的体验效果。为了给设计和其他板块提供全局参考和验证,优化电厂工作人员的培训环境和培训效果,进一步提高虚拟现实技术在核电工程和运行领域的应用水平,本文使用虚拟现实引擎Unity3d 搭建核电三维场景,结合Kinect 体感设备作为交互输入手段,开发基于体感智能交互的虚拟核电畅游系统。
该系统通过虚拟现实引擎Unity3d 构建渲染逼真绚丽的核电多三维场景,采用动态数据载入技术降低核电场景切换载入等待时间,使用动态LOD 和遮挡剔除技术提高场景渲染帧率。通过Kinect 骨骼跟踪技术采集用户运动空间信息,根据获取的骨骼点信息进行自定义姿势与手势设计,进而将捕捉到的用户姿势及手势与自定义姿势及手势进行匹配判断;并将匹配正确的姿势或手势映射到Unity3d 三维场景中,替代传统键盘鼠标交互方式,从而实现体感畅游核电厂。
图2 三维核电场景Fig.2 3D Nuclear power scene
基于Kinect 体感交互的虚拟核电厂畅游系统架构自底向上分为数据支撑层、服务接口层、技术支撑层及功能应用层,如图1 所示。
1)数据支撑层
该层次属系统的功能应用基础层。包括厂区、厂房、设备模型数据,直接为接口层提供数据支撑。
2)服务接口层
为系统提供各种服务接口,包括场景处理、Unity3d 与Kinect 连接通信接口以及人机交互接口。
3)技术支撑层
为应用业务层的正常运作提供保障,包括场景处理核心组件、Unity3d 与Kinect 通信中间件以及体感交互组件。
4)功能应用层
通过调用平台业务支撑层中所提供的各类接口,实现各种具体的业务需求,并为用户提供友好的人机操作界面。
本系统实施的三维模型场景数据与电厂实际环境一致。厂房外观模型根据CAD 图纸1:1 构建,厂房内部系统模型通过PDMS 布置设计平台建立相应布置模型,经过特定的模型文件格式转换流程,导出获得待优化处理的粗模;然后,将粗模导入3D MAX 中进行优化处理,并进行赋予材质纹理;最后,将3D MAX 处理后的模型导入Unity3d,通过Enlighten 全局实时光照技术和Lightmap 光照贴图烘焙技术对场景进行烘焙渲染,形成逼真绚丽效果的核电场景,如图2 所示。
进行虚拟核电畅游系统开发过程中,引入AssetBundle技术满足运行过程中场景动态下载和加载,从而大大减少场景加载过程等待时间。一方面,通过AssetBundle 可以将程序所需各类资源打包压缩并上传至网络资源服务器上;另一方面,在运行程序时可以从服务器上下载该资源,从而实现资源的动态加载,减轻客户端数据容量。其工作流程如图3 所示。
1)打包创建AssetBundle
图3 AssetBundle工作流程Fig.3 AssetBundle Workflow
图4 三维场景LOD技术效果Fig.4 Technical effect of 3D scene LOD
在Unity3d 中通过脚本进行压缩打包创建满足要求的AssetBundle 文件,AssetBundle 可以存储任意一种Unity 引擎能够识别的资源,例如模型、材质、纹理、音频、动画甚至场景。
2)上传服务器
将创建好的AssetBundle 文件通过上传工具将其上传至服务器中,从而使客户端运行程序时通过访问服务器来获取所需的资源。
3)下载AssetBundle
客户端运行程序时根据实际需求,从服务器上将适当AssetBundle 下载到本地机器。
4)加载AssetBundle 中的资源
AssetBundle 文件下载完成,客户端即可通过特定API来加载其所包含的资源。
通过AssetBundle 动态加载机制,将核电厂大数据量的三维场景模型动态打包放置于服务器,运行时动态读取服务器等外部资源,实现数据动态载入,提高加载场景速度,减少等待时间。本文以国内某核电厂区为例进行测试对比,结果表明通过此方法可有效将场景数据加载速度提高50%以上,见表1。
细节层次显示(LOD)技术,其功能相当于多重纹理贴图。在屏幕中根据显示模型大小的比例来判断使用高或低层次的模型,即当模型远离观察者时精度越来越低。由于物体距离越远,理论上观察者不会感觉模型质量有所下降,从而可以极大减少对GPU 的传输数据和减少GPU 所需要的顶点计算,如图4 所示。
表1 场景载入时间对比表Table 1 Comparison of scene loading time
图5 LOD设置逻辑图Fig.5 Logic diagram of LOD setting
根据上述,LOD 动态设置逻辑步骤如下,其逻辑流程如图5 所示。
1)在Unity3d 的Update 中 利 用Vector3.Distance 实 时计算相机与模型物体的距离。
2)模型选定,设置高中低3 种精度模型。
3)判定距离,当距离较近(小于等于200m),设置高精度模型LOD0;当距离中等(大于200m,小于500m),设置中精度模型LOD1;当距离较远(大于500m),设置低精度模型LOD2。
通过此动态批量设置LOD 属性的方法,丰富了场景内容而且也使得场景渲染帧率提高了30%以上,同时利于场景的后期维护与更新。
图6 体感接口框架Fig.6 Body sense interface framework
微软公司于2010 年推出了Kinect 体感设备[2]。Kinect有3 个摄像头,每秒更新30 帧图像,其中中间的主摄像头是RGB 彩色摄像头,左右分别为红外线发射器和红外线CMOS 景深摄像头[3]。它同时包含了即时动态捕捉、影像识别、麦克风输入、语音识别、人脸识别等功能,通过Kinect 体验者可以利用自身肢体动作或声音去操控虚拟环境中的物体。2012 年微软发布了Kinect for windows SDK,使得在windows 平台上开发支持手势和语音识别的应用程序成为现实。2014 年微软发布了新一代的Kinect2 及配套开发SDK,其在硬件性能和软件功能上都得到了大幅提高。
Unity3d 是目前与Kinect 结合比较紧密的一款三维引擎[4],其相关结合技术已经取得大量研究成果,例如卡耐基梅隆大学的KinectWrapper,OpenNI 提供的OpenNIUnityToolkit 等交互中间件[5]。通过Kinect 与Unity3d结合可以方便地开发Kinect 体感操作的3D 应用程序。
本系统的体感交互开发的软硬件接口框架如图6 所示。
1)用户输入层
该层主要提供用户的输入动作或语音等信息并传递给Kinect 设备,为整个系统提供最自然的交流方式。
2)Kinect 交互层
首先,通过Kinect 体感器的摄像头获取彩色图像和深度数据,通过麦克风阵列获取音频数据;然后,Kinect for windows 的设备驱动程序从硬件读取原始数据,并根据彩色图像和深度数据来进行人体骨骼跟踪;最后,将捕获的人体骨骼点数据传递给应用接口层。
3)应用接口层
图7 Kinect骨骼跟踪图Fig.7 Kinect bone tracking chart
首先,根据虚拟核电畅游系统涉及的具体操作需求和相应算法建立对应的人体姿势及手势API 库;其次,接受用户的输入动作并与建立的API 库进行匹配验证;最后,根据匹配对应的动作映射驱动核电三维场景的畅游操作。
骨骼追踪技术是Kinect 的核心技术,它可以准确标定人体的20 个关键骨骼点,并能对20 个骨骼点的位置进行实时追踪。具体过程是:首先,Kinect 发射红外线,并探测红外光反射,从而可以计算出市场范围内每一个像素的深度值,即获得深度数据,从深度数据中最先提取出来的是物体主体和形状[6];然后,用这些形状信息来匹配人体的各个部分;最后,计算匹配出来的各个关节在人体中的位置。通过Kinect 与Unity 的中间件将获取的人体骨骼点数据信息与Unity3d 三维场景中的人物角色映射绑定,进而驱动人物模型,效果如图7 所示。
对于一个完美的体感交互应用来说,识别功能仅仅是基础而已,更重要的是将多种识别组合起来,设计出适合不同应用的统一自然交互系统[7]。
针对本系统,主要涉及的操作包括控制角色前进及视角旋转、模式切换、三维菜单显示/滑动/点击。根据实际操作需求,设计适合本系统应用的交互动作,见表2。
3.4.1 静态姿势识别技术
上述手臂伸直、左倾等交互操作属于一定时间段内某种控制状态的判断(True or False),对于此类动作只需判断对应骨骼点满足条件即可。Kinect 静态姿势识别凭借其出色的稳定性,适合于此类状态的判断。
下面以左臂向前伸直表示角色前进为例简要描述。左臂向前伸直可以根据left_hand(左手)、left_elbow(左肘)、left_shoulder(左肩)3 个骨骼点的相对位置关系进行判断。如图8 所示,P1 表示left_elbow 到left_hand 的三维向量,P2 表示left_elbow 到left_shoulder 的三维向量,根据几何知识判断向量p1 与向量p2 的夹角Angle 为180°即可认为手臂伸直,考虑到Kienct 识别的准确性,其设定夹角阈值为10。
表2 交互动作定义表Table 2 Definition of interaction action
图8 手臂骨骼节点示意图Fig.8 Schematic diagram of arm bone node
图9 挥手手势示意图Fig.9 Schematic diagram of hand waving
3.4.2 动态手势识别技术
除了上述静态姿势识别以外,如三维菜单滑动、菜单点选需要在一定时间内做出一系列连贯性动作,这种交互方式显得更加自然,适用于持续交互过程[8]。本节以右手挥动进行三维菜单的滑动操作为例描述动态手势识别的关键技术。图9 为常用挥手手势的示意图。
从图8 中可以观察得出一些规律,第一个规律就是,手和手腕都是在肘部和肩部之上,这也是大多数挥手动作的特征,也是识别挥手这一手势的第一个标准。第一幅图展示了挥手这一姿势的中间位置,如果用户手臂改变了这种关系,前臂在垂直线左边或者右边,则认为这是该手势的一个片段,即向左或向右挥动了。使用这两点通过观察得到的规律,可以通过算法建立算法准则,来识别挥动手势。
算法通过计算手离开中间姿势区域的次数。中间区域是一个以肘部为原点并给予一定范围阈值的区域。算法需要用户在一定的时间段内完成这个手势,否则识别就会失败。
整个挥手动作的算法设计流程如图10 所示。
图10 挥手手势识别流程图Fig.10 Flow chart of hand gesture recognition
第一个条件是验证手和肘关节点是否处于追踪状态。如果这两个关节点信息不可用,则重置追踪状态,否则进行下一步的验证。如果姿势持续时间超过阈值且还没有进入到下一步骤,在姿势追踪超时,重置追踪状态。下一个验证手部关节点是否在肘关节点之上,如果不是,则根据当前的追踪状态,挥手姿势识别失败。如果手部关节点在Y 轴上且高于肘部关节点,继续判断手在Y 轴上相对于肘关节的位置并更新手关节点位置。最后判断定义的重复次数是否满足,如果满足条件,挥手手势识别成功。
图11 动作映射效果示意图Fig.11 Schematic diagram of action mapping effect
为了验证系统的效果度、稳定性和可靠性,对设计的Kinect 姿势及手势动作与虚拟核电畅游系统结合,验证了对应动作响应不同的交互操作的及时性与准确性,以及系统呈现的最终效果。体验者执行不同动作驱动不同交互操作的效果示意如图11 所示。
结果表明,通过Unity3d 进行虚拟核电畅游系统的开发,其画面效果和流畅度都达到预期效果,同时结合Kinect 的体感交互操作可以解放用户对鼠标键盘的依赖。该系统的实现,为核电展厅内核电科普宣传及人员培训方面提供了新的思路,有较大的应用价值,已在国内两大核电基地实施应用。