1. 引言
虚拟现实技术(简称VR)在近年来是一种比较常用的技术,它包含多种技术如:计算机图形学、多媒体、人工智能等。虚拟现实技术可以产生一种沉浸式逼真的虚拟环境,与用户产生交互,带给用户更多的沉浸感、体验感 [1]。鉴于虚拟现实技术可以带给用户更加逼真的虚拟环境,所以往往用于教育培训、展示等多种场景。并且近年来虚拟现实技术与应用取得了很好的进展。因此在本文中,将虚拟现实与幕墙行业结合起来更加有现实意义。
幕墙工程属于建筑行业的范畴,建筑施工行业存在施工人员多、施工现场多等情况,而且幕墙的安装有别于传统的建筑建造行业,所以需要对工人进行安全及技术相关的培训。采用VR虚拟现实技术,提高了工人的技术实力同时也解决掉了一些安全隐患。基于此,本文开展了VR技术在幕墙工程培训中的应用研究工作。相关技术的研究与开发主要借重于Unity与3DSMax建模软件 [2]。
Unity是利用交互的图形化开发环境为首要方式的软件,是一款用于创建三维视频交互、建筑可视化、实时三维动画等类型互动内容的多平台综合型三维开发工具。在场景交互、AI、动画、UI制作、粒子效果、VR开发等方面提供了简单易用的功能接口,可使用C#语言进行脚本编辑实现自定义功能开发 [3]。3DSMax是一款基于PC系统的三维动画渲染和制作软件,其通用性很强,对PC的性能要求不高,其具有强大的角色动画制作功能,在3DSMax中可以采用堆叠式的建模步骤,使得模型的制作具有非常强大的弹性 [4]。
在现实生活中人员是没有办法穿透物体的。同样在虚拟场景中,如果场景和人员都没有加入碰撞检测,那么人员就可以随便穿透墙体等虚拟建筑物,很明显不符合自然规律。因此有必要在虚拟模型中添加碰撞检测范围 [5]。
另外,为了最终效果的真实与美观,需要利用Unity中的组件对模型材质进行渲染。
对于VR培训相关模块开发步骤如图1所示。
2. 虚拟建筑模型的建立
为了让用户有更加真实的沉浸式体验效果,所以搭建一个逼真的虚拟场景就显得十分重要。故需要

Figure 1. Flow chart of VR training module development steps
图1. VR培训模块开发步骤流程图
建立虚拟幕墙模型。本文采用Unity作为开发工具,但不能创建比较复杂的模型,所以选取3DSMax作为建模软件。
本文使用多边形建模的方法进行3D幕墙模型的制作 [6] [7],这个方法是先由一个正方形开始,利用添加线段和面数的方法完成模型的创建。首先在3DSMax中进行基础模型的创建:在3DSMax中使用命令创建一个正方体,在正方体的属性面板中调整正方体的长、宽、高尺寸以符合实际图纸的要求,之后对建立的基础多边形模型进行编辑,以图2为例,在3DSMax中首先选择bevel命令给正方体添加一个内边,再使用extrude命令就可以得到一个长方形外框;之后通过复制和修改长方形外框的比例就可以粗略制作完成模型的框架。得到基本框架之后,通过创建标准物体面片命令就可以得到一个面片,然后把面片放置在所需位置就可以得到需要的模型 [8]。

Figure 2. Three dimensional basic model rendering
图2. 三维基础模型效果图
3. 碰撞检测
在虚拟建筑场景中,有规则和不规则的物体,规则或者比较规则的模型可以用规则的物体替代,不规则的模型可以用规则的物体替代,从而形成碰撞效果。只要进入碰撞检测范围内,就会发生碰撞检测效果 [9]。
三维模型制作好之后在3DSMax中选择导出,文件格式选择Obj类型文件;导出之后将Obj模型拖拽到Unity中,形成Unity预设文件。形成预设文件的好处在于若后续模型制作过程中会出现需要修改源文件的可能性,修改一个源文件之后所有根据此源文件复制的文件都可以一并修改,然后修改文件命名给文件进行分组、命名。完成文件的准备工作之后,在三维模型中选择相应的位置,选择“add component”功能,添加碰撞范围(Box Collider)组件。添加碰撞范围之后,此效果可以利用脚本文件实现,最终达到动态的效果。效果对比如图3(a)和图3(b)所示。
(a) Unity中的预设文件
(b) 最终效果
Figure 3. Comparison of adding collision effects
图3. 添加碰撞效果对比图
3.1. 球体碰撞检测
在大多数的碰撞检测中,球体碰撞检测是一个基本的球体形状的碰撞检测器,也是最简单的一种。如果知道两个球体的半径和两个球之间的距离就可以检测判断了 [2],而且计算量非常小。如果两个球体相切或者相交,那么两个球体开始发生碰撞;如果既不相切也不相交,那就不发生碰撞。
球体碰撞检测原理如图4所示,根据两个球体球心的坐标、球的半径求出球体之间的距离,然后和两个球体半径的和进行比较,从而判断两个球体是否发生了碰撞。如果两个球体半径和小于球体之间距离,则两个球体发生了碰撞;如果两个球体半径和大于球体之间距离,则两个球体没有发生碰撞。假设球C1、C2的半径分别为R1、R2,d为两个球体之间的距离。当
时,两个球体相切或者相交,也就是发生了碰撞;当
时,两个球体没有发生相切或者相交,也就是未发生碰撞。
3.2. AABB包围盒碰撞检测
球体的碰撞检测对于规则的物体可以有效的检测到,然而对于不规则的物体,球体碰撞检测显然无法满足要求,采用AABB包围盒碰撞检测算法可以检测到物体包围的边界碰撞 [10]。
为了简化物体之间的碰撞检测运算,通常会对物体创建一个规则的几何外形将其包围。如果物体外形发生变化,包围的几何图形也发生变化,导致碰撞的边界检测也会发生改变。三维场景中包围盒表现为六面体,并且每个面都平行于一个坐标平面,如图5所示。在程序中计算效率较高,但是碰撞检测效果并不是很理想,它的主要优势就在于性能。

Figure 5. Bounding box hexahedron (picture source: Baidu)
图5. 包围盒六面体(图片来源百度)
三维场景中物体的AABB包围盒是一个六面体,所以实际上在三维场景中物体的AABB碰撞检测可以采用四个点信息的判定来实现。三维物体的AABB包围盒的八个顶点可以用两个顶点来标识,如图6所示。得到图中两个红色顶点信息,也就得到了这个物体所对应的八个顶点信息 [11]。

Figure 6. Max min vertex (picture source: Baidu)
图6. 最大最小顶点(图片来源百度)
所以,在做三维物体的AABB碰撞检测时,只需验证物体A与物体B是否满足如下条件:
1) 物体A的X轴方向最小值大于等于物体B的X轴方向最小值且小于等于物体B的X轴方向最大值或者物体B的X轴方向最小值大于等于物体A的X轴方向最小值且小于等于物体A的X轴方向最大值;
2) 物体A的Y轴方向最小值大于等于物体B的Y轴方向最小值且小于等于物体B的Y轴方向最大值或者物体B的Y轴方向最小值大于等于物体A的Y轴方向最小值且小于等于物体A的Y轴方向最大值;
3) 物体A的Z轴方向最小值大于等于物体B的Z轴方向最小值且小于等于物体B的Z轴方向最大值或者物体B的Z轴方向最小值大于等于物体A的Z轴方向最小值且小于等于物体A的Z轴方向最大值。
若满足上述条件,则证明物体A与物体B发生碰撞,反之,则证明物体A与物体B未发生碰撞。
4. 培训模块的设计应用
本文主要解决幕墙安装与故障排除以及相关安全意识的培训。主要为了提高幕墙安装工人的技术实力,以及相关幕墙安装的故障排除,另外就是为了提高工人的安全意识,降低事故发生率。主要分为三个阶段:
第一:准备工作,结构设计工作,收集材料;
第二:在Unity3D中进行场景的搭建;
第三:相关功能的实现。
下图7为幕墙培训模块开发流程图。

Figure 7. Flow chart of curtain wall training module
图7. 幕墙培训模块流程图
以张家口机场窗户为例,展示窗户的开关等教学工作的实现。主要是脚本的编写和组件的设置。
因为窗户的开启和推拉门略有区别,需要将窗户的把手旋转到一定角度才能开启窗户;并且当窗户把手旋转相反的角度以后可以将窗户锁上,所以需要对“Circular Drive”组件的代码进行一定的修改,以达到预期效果。
修改的基本思路就是当把手旋转到一定的角度后开启或者关闭碰撞核组件就可以达到锁/解锁窗户的效果。
首先找到“Circular Drive”组件,右键点击组件-选择编辑脚本命令,在脚本中找到“startingGrabType”函数,将其状态从“GetGrabStarting”改为“GetGrabStay”(部分代码如图8所示)。这样就可以在用户使用VR手柄抓住门把手的时候更改被抓物体的属性,为之后碰撞核的开关打下基础。

Figure 8. Window VR component code of Zhangjiakou Airport
图8. 张家口机场窗户VR组件代码
然后在“Circular Drive”组件里找到“旋转限制”(Limited Rotation)选项,点击“+”按钮,在弹出的对话框中找到碰撞核开启/关闭选项,并把需要更改碰撞核的物体拖入,这里需要修改碰撞核的是窗户的把手(如图9所示)。

Figure 9. Window VR component setting of Zhangjiakou Airport
图9. 张家口机场窗户VR组件设置
通过以上步骤所达到的效果就是当用户在机场虚拟现实环境中,可以使用VR手柄模拟真实世界中机场窗户的开启。用户将手柄放在推拉门碰撞范围内,按下手柄上的“Trigger”按钮,窗户把手会随着用户手柄位置的移动旋转相应的角度,当角度达到一定程度以后,如果用户的VR手柄在窗户的碰撞核内,窗户可以直接随着用户手柄位置的移动旋转相应的角度。当用户松开“Trigger”键再次选择窗户把手旋转相应角度后,可以锁定窗户。从而达到模拟现实中机场窗户开启或关闭的动作。也就达到了教学开关窗户的目的。
5. 材质渲染
机场外观的材质主要分为普通材质、反射类材质和透明类材质。地面和屋顶就可以使用普通材质球 [12]。在Unity中右键点击文件夹空白区域,选择“创建–材质球”;然后在Albedo属性处更改成为相应的颜色。水泥墙外围和屋顶外围边就需要使用反射,在Unity中右键点击文件夹空白区域,选择“创建–材质球”;然后勾选高光颜色和反射;把“Metallic”调成0.8,“Smoothness”调成0.9,从而得到反射材质。对于墙面玻璃材质则需要更改Alpha通道的深浅达到透明的效果。在Unity中右键点击文件夹空白区域,选择“创建–材质球”;点击“ALbedo”后面的颜色属性,将“Aplha通道”颜色调低,颜色越深透明度越小;颜色越浅透明度越高。最后效果如图10所示。

Figure 10. Reflection effect and glass refraction effect of Zhangjiakou Airport wall
图10. 张家口机场墙面反射效果、玻璃折射效果
使用Unity中的PostProcessing调整画面颜色,增加视觉效果。在Unity中选择“Windows-Package Manger”下载添加PostProcessing文件包;选择摄像机,添加“PostProcessing layer”组件,将组件里的层级改为“PostProcessing”,并更改摄像机物体的层级为PostProcessing。
在Unity中选择“游戏物体–创建空物体”,在空物体上添加“Post Processing Volume”组件,将“IsGlobe”选项勾选,因为项目中无需判定特效的范围,更改物体层级为PostProcessing。之后点击添加特效按钮添加想要的特效,这里使用了颜色调整特效,使画面颜色看上去更“暖”。最后效果如图11所示。

Figure 11. Final effect of Zhangjiakou Airport
图11. 张家口机场最终效果
6. 结束语
本文以幕墙工程安装培训为背景,研究阐述了VR虚拟现实技术在此背景下的应用。对VR技术在培训领域具体实现过程中实现方法和操作过程进行了解释。但略显粗糙,还有很多不足之处。主要有以下几点:
1) 幕墙模型多种多样,另外,不同的施工现场、不同的施工建筑主体多种多样,也就增加了建模的难度和工作时长,导致工作效率不高。如果能够直接导入建筑模型或许使建模这一工作能够更加便捷。
2) 在此系统之上还可以丰富功能,比如增加安全培训在里面的比重,增加普通工人对幕墙的保养维护培训。
3) 考虑到相应场景增加情景对话或者语音讲解,丰富培训教学的形式。使被培训人员有更加完美的体验。
4) 在碰撞检测中,考虑到两个物体之间的碰撞检测,多个物体之间碰撞检测算法还未考虑。
针对以上不足,希望通过后续工作继续改进。
基金项目
天津市智能制造专项资金项目(201810602, 201907206, 201907210);天津市互联网先进制造专项资金项目18ZXRHGX00110。