基于Virtools的虚拟灭火系统碰撞检测设计与实现
2017-07-10周守东
周守东
摘要:虚拟仿真灭火培训系统的设计实现基于虚拟现实技术,而碰撞检测是虚拟现实得以实现的关键技术之一。模拟系统设计对AABB包围盒碰撞检测算法进行改进,提出基于Virtools网格的包围盒算法。实验表明,改进后的包围盒算法减少了碰撞检测的误差,提高了模拟系统人机交互的沉浸感。
关键词:虚拟仿真系
;Virtools;碰撞检测;虚拟现实技术
中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2017)14-0174-03
1概述
虚拟现实技术是一门富有挑战性的交叉技术前沿学科和研究领域。是它多种技术集合,包括计算机图形学、实时三维技术、广角立体显示技术、动作捕捉技术,以及力反馈、网络技术、语音技术等。使用者通过各种设备与计算机生成的虚拟空间完成各种交互行为,从而实现仿真交互。虚拟仿真模拟灭火系统是典型的虚拟现实系统,基于虚拟现实技术模拟灭火培训全过程;模拟火灾场景,构建真实感强的虚拟场景。在虚拟现实场景漫游中经常要触发的一个动作就是要进行碰撞检测,碰撞检测对增强虚拟场景漫游的临场感起到了至关重要的作用。碰撞检测是虚拟现实领域重要的研究课题。碰撞检测做得好了不易被人注意到,但是做得差了却很容易让人发现,人物经常被卡住不能前进或者人物穿越了障碍。很多研究人员对此开展了系统研究,获得了不少比较成熟的算法,如层次包围盒算法中的AABB算法,OBB算法,还有k-DOP算法等。这些算法的主要关键点就是用形状简单的盒子围住待测对像,以包围盒与其他图形的相交性来检测。这些算法虽然方便快捷,但针对复杂图形的物体误差较大。随着虚拟现实技术的普及和推广,体验者对虚拟仿真的要求也从新奇逐步升级为注重仿真度的体验。用户需求对虚拟仿真的模拟技术提出了舒适度及真实度的更高要求,虚拟仿真技术中采用的碰撞检测算法对于虚拟仿真产品的体验感有相当重要的影响,本文主要针对仿真模型采用的碰撞检测算法是在传统AABB包围盒算法的基础上进行优化,对其不足进行改进。
2碰撞事件处理算法分析
2.1基于球形包围检测法的碰撞检测
在虚拟场景中,为需要检测的物体用一个不可见的球体进行包围,即用球体来替代不规则物体进行碰撞检测。当检测到有包围器发生碰撞时,采取相应措施,以避免碰撞。其实现思路如图1所示。
包围球碰撞检测算法是虚拟仿真碰撞检测最常用的一种基础算法。算法使用球体作为基础包容体,将碰撞检测体进行包围,以包围球的碰撞检测替代三维模型的碰撞检测。包围球碰撞检测算法极大减少了碰撞检测的复杂度,以最小的系统资源满足了实时碰撞的响应速度,但对应的缺点是碰撞检测精度不够精确,误差冗余较大,经常会导致用户的误操作,用户体验度较差。
为了提高基础包围球算法的精度,在基础包围球算法的基础上进行优化,提出了球体树解决方案。球体树算法实际上是依据三维物体层次结構构造一个由基础包围球构成的集合。具体实现方法为:首先分析三维模型的层次结构,根据其层次结构对模型进行拆分;其次对拆分出的三维模型逐个进行碰撞检测球体的包围和绑定;最后依据包围球数组的碰撞检测结果,判断是否发生碰撞检测及碰撞部位。
球体树算法解决了包围球算法的碰撞检测精度问题,缺点是对三维模型的分析和拆分较为复杂,球体树内部碰撞检测判断设定繁琐,不利于技术的普及和推广。
2.2基于AABB检测法的碰撞检测
包围球虽然简单,但用球体来包容一个三维物体,通过上述分析我们可以发现其中存在很多问题。盒子包围法即是对作为碰撞检测对象的球改成长方体,降低了碰撞检测的计算维度,同时也会在布局上紧凑很多。
目前,盒子包围碰撞检测的算法主要有两种,分别是AABB(axis-aligned bounding box)盒包围算法和OBB(Orient Bounding Biox)盒包围算法。
AABB(axis-aligned bounding box)盒子,即轴对齐包围盒,主要用于比较规则的物体进行碰撞检测。算法利用长方体对三维模型进行包围,立方体的每一条边都平行于一个坐标平面且与坐标系的轴垂直,如图2所示。
与包围球相同,针对复杂的三维模型,同样可以构建由包围盒组成的AABB盒子树。由于AABB盒子是一种降低维度的检测计算,所以与包围球检测算法不同的是,AABB盒子树之间的碰撞检测更为优化。对于两个AABB盒子的碰撞检测,我们仅需要在两个维度上对坐标投影进行检测便可以判断两者之间是否有碰撞发生,如果投影重叠表示有碰撞发生,反之则没有发生碰撞,如图3所示。
AABB盒子虽然简单,但是当物体倾斜时,检测盒就会随之变大,一方面增加了系统检测消耗,同时碰撞检测精度也随之下降;当物体发生旋转时,对AABB盒子要进行重新的计算赋值,这时候就必须对物体的整个检测系统重新进行定义,增加了系统负担。
OBB(Oriem Bounding Box)盒子,即是带有方向的包围盒,它是在AABB盒子的基础上增加了方向,使包围盒能有解决任意方向的碰撞检测,主要是对AABB盒子在检测旋转后的模型与其他模型之间的缺点进行强化。
3系统中的碰撞检测设计
3.1设计模型及其包围盒
决定碰撞检测效率及质量的因素,除算法外,还有一个很重要的因素就是场景管理。碰撞检测对系统资源的需求,主要取决于场景中需要监听并解算碰撞的包围盒的数量,即参与碰撞检测的三维模型的数量。高效的场景管理,可以极大的减少当前运行场景中三维模型的数量,从而很大程度上提高系统运行速度及效率。
在场景管理条件相同的情况下,如场景中参与碰撞检测的盒体数量为n,最原始的算法则是需要每帧对每个监听盒体进行逐个比较,即n(n-1)/2次,效率很低。针对碰撞检测再加上时间就更麻烦,于是采取算法简化策略,优化监听对比效率,优化简略代码如下:
3.2基于网格检测的优化
基于包围盒的碰撞检测技术在虚拟世界中应用的很广泛,在Virtools里还提供了另外一种独特的碰撞检测的方法:通过Grid实现基于网格的碰撞检测。在本项目中最终采用AABB碰撞检测来完成常规碰撞检测,利用网格碰撞检测控制整个场景的大范围,防止角色漫游出边界导致系统运行出现错误。
具体实现:场景中从俯视图将场景投射到一个二维区域,将这个二维区域用网格加以细分和定义,使其作为一个不可见的三维体,赋予碰撞检测属性。这种碰撞检测方法一般采用滑动的方法将角色控制在二维区域范围内。这种方法的优点是比较简单,但碰撞检测的精度不高,而且对高度不同的地形,要根据地形的高度同步进行调整。
在投射的二维区域表面创建Virtools检测网格,通过颜色来定义整个场景的边界和碰撞检测范围,通过脚本和LayerSlider BB行为交互模块完成对角色漫游范围的控制。在VT中首先将地面赋予Floor属性,然后通过Character Keep On Floor BB来实现角色跟随地面高度的变化。
3.3仿真结果分析
建立测试场景,对优化后的算法进行效率及成果验证。为便于分析,在測试场景中制作AB两组三维模型对象,A组模型对象适配于包围盒,B组模型对象为AABB碰撞检测存在缺点的狭长体。实验设定一个用于碰撞检测的刚体小球在测试框内随机出现,分别记录单位时间段系统检测到的交叉碰撞次数。具体实验中,单位时间段分别取值8s、10s及15s。实验结果如表1所示。其中上面三行为AABB碰撞检测算法成果数据,下面三行为优化后的Grid+AABB动态检测算法。
通过分析可以得出:三维模型对象在采用Grid分割后滤除了对象误差区域的碰撞,提高了碰撞检测的正确率。通过实验发现,尤其是针对原始AABB误差率较高的狭长形三维模型对象有着较大的优势。
4结束语
碰撞检测技术是计算机虚拟仿真技术中的核心技术之一。碰撞检测的精度很大程度上决定了虚拟仿真最终产品的数据真实性及用户体验满意度。本文针对仿真灭火系统中设计到的碰撞检测算法问题,以成熟的AABB包围盒碰撞检测算法为基础,针对AABB碰撞检测算法在虚拟灭火碰撞检测中存在的问题进行优化设计。提出了在Virtools中基于Grid的AABB碰撞检测算法改进方案,经过实际案例测试,表明该方案不仅提高了系统运行效率,同时对软件的碰撞检测也有了较大的提高。