龙源期刊网中的碰撞检测方法研究作者:杨浪来源:《软件导刊》2014年第07期摘要:碰撞检测是虚拟现实的关键技术,其效果直接影响整个应用的真实感。详细介绍了Unity中的基本碰撞检测、触发器碰撞检测和光线投射的基本原理、优缺点及适用范围。关键词:Unity;碰撞检测;触发器;光线投射中图分类号:TP302文献标识码:A文章编号:(2014)基金项目:河源市科技计划项目()0引言随着计算机图形学、数字媒体技术的快速发展,计算机硬件成本不断降低,人们对游戏、虚拟现实的需求越来越高。而碰撞检测技术是游戏和虚拟现实中最核心、最基本的技术。碰撞检测技术在游戏和虚拟现实场景中非常重要,它保证了真实世界的正确虚拟化。例如对于角色的控制欲规划,碰撞检测可以帮助角色避开场景中出现的障碍物[1]。为使用户在虚拟场景中能够感受到自己确实在场景中,就需要能够实时地检测角色与障碍物之间的碰撞检测,并及时作出响应。然而在一个场景中,可能存在许多种不同类型的碰撞,这就要求有不同的碰撞检测方法来适应各种类型的碰撞。目前,在虚拟现实技术中出现了很多种碰撞检测方法,其目的无非有3个:检测模型之间是否发生碰撞、预测即将发生的碰撞、动态获取模型之间的距离。在Unity中主要有3种碰撞检测方法与上面的3个模型对应,分别是基本碰撞检测、触发器碰撞检测和光线投射。1Unity简介无论是PC端还是移动应用端,碰撞检测技术始终是程序开发的难点,甚至可以用碰撞检测技术作为衡量引擎是否完善的标准。好的碰撞检测技术要求对象在场景中可以平滑移动,同时还要满足精确性和稳定性,防止对象在特殊情况下发生违背常规的状况。例如,人物无缘无故被卡住不能前进,或者人物穿越了障碍物。目前,比较成功的商业3D引擎Unity,其功能非常强大,集成了强大的碰撞检测功能,其中一个显著特点就是跨平台游戏开发。2碰撞检测方法2.1碰撞检测定义龙源期刊网碰撞的发生无非是检测两个物体对象之间的物理接触,在Unity中是使用碰撞器组件覆盖在物体表面,用来负责与其它物体之间的碰撞。这种从其它碰撞器检测和取得碰撞信息的方法称为碰撞检测。2.2Unity碰撞检测方法分类在Unity中,可以检测两个物体之间的碰撞,也可以检测特定碰撞器之间的碰撞,甚至可以使用光线投射预先检测碰撞。本文以一个角色与3D物体的碰撞为例说明这3种碰撞方法的不同。2.2.1基本碰撞检测在Unity中,要实现碰撞检测,就必须给每个对象添加相应的碰撞器。默认情况下,Unity会自动将碰撞器添加到创建的对象中,当然也可以自己添加碰撞器。判断角色是否和其它物体发生碰撞,可以使用Unity的角色控制碰撞器。Unity专门有一个方法OnControllerColliderHit用来检测角色控制器和其它物体之间的碰撞,只需要将包含OnControllerColliderHit的脚本绑定到角色控制器即可。functionOnControllerColliderHit(hit:ControllerColliderHit){//碰撞发生后的动作}其中,hit是一个ControllerColliderHit类型变量,包含着碰撞发生时所有产生的信息。通过hit变量,可以获知角色和哪一个物体发生了碰撞。通过记录碰撞时所产生的信息,角色可以做出真实的反应。虽然系统提供的OnControllerColliderHit方法得以很好地利用,但该方法具有一定的局限性。如玩家要通过一扇门进入屋内,使用上面的碰撞技术玩家会突然碰到门,然后门才缓缓打开,角色在门打开之前停下移动的脚步,这瞬间的停顿将会影响游戏的可玩性。2.2.2触发器碰撞检测触发器碰撞检测很好地解决了上面描述的问题,指定一个处于触发状态的碰撞器,将实际检测碰撞对象包含进该触发器中。这样,角色与对象的碰撞检测就转换为角色与触发器之间的碰撞检测。只要增大触发器的范围,就能解决玩家和门之间出现的停顿问题。触发器碰撞原理如图1所示。图1触发器碰撞龙源期刊网使用触发器碰撞,需要使用两个碰撞器,一个是依附在门上的碰撞器,一个是稍微比门大点并包含门的触发器。如上图所示,只要角色进入触发器范围,就能通过脚本代码提前让门打开,从而消除角色与门因碰撞产生的停顿感。functionOnTriggerEnter(collider:Collider){//进入触发器后对应的动作}2.2.3光线投射光线投射是3D场景中一个点向一个方向发射的一条无终点的线。在发射过程中,一旦与其它对象发射碰撞,它将停止发射[2]。在Unity中可以利用光线投射实现碰撞检测,即在角色所面对的方向投射出一条光线,在设定的光线长度内实现碰撞检测。这意味着,角色靠近门时,角色不需要和门进行接触就可以实现碰撞检测。光线投射原理如图2所示。图2光线投射光线投射为了实现碰撞检测必须让光线和碰撞对象相交,也即,角色必须面对门的方向。当角色与门的距离小于设定的光线长度时,就可判断两者发生碰撞。示例代码如下:functionUpdate(){//光线投射碰撞发生if(Phisics.Raycast(transform.position,transform.forward,hit,distance)){//碰撞后的动作}}其中distance表示光线的距离,只有当角色和门小于distance时才会被检测到碰撞。光线投射的缺点是角色必须面对门的方向,尽管光线投射存在缺点,但它经常被用来预测碰撞检测[3]。3Unity碰撞检测方法比较及应用龙源期刊网在所分析的示例中,基本碰撞检测和光线投射方法都存在着缺陷,使用基本碰撞检测时,只有角色碰撞到门上时门才会打开,造成角色停顿感,影响交互性;使用光线投射时,虽然能让门提前打开,消除停顿感,但是只有当角色正对着门的时候,门才会开启。使用触发器碰撞检测是最适合的方法,它很好地解决了基本碰撞检测带来的停顿感和光线投射带来的方向限制。基本碰撞检测虽然简单易用,但它不适合复杂的碰撞检测。碰撞对象之间必须真实发生碰撞,而且检测代码被放入一个脚本中,不利于维护。基本碰撞检测适合处理场景中简单的碰撞检测,如角色与石头、河流等的简单碰撞。光线投射由于受到射线方向的限制,因此常用来检测高速运动的对象之间的碰撞,如射击游戏中子弹与人物之间的碰撞。触发器碰撞检测需要增加一个触发碰撞器来替换碰撞对象,它适合于有预设动作的场景。4结语随着用户对交互实时性和虚拟场景真实性要求的不断提高,如何在实现功能的前提下保证应用的实时性和真实性尤为重要。本文主要依据目前流行的Unity引擎,分析了Unity中3种碰撞检测技术的优缺点及适用场合。Unity中的3种碰撞检测技术都有它们各自的优缺点和用途,应依据场景选择合适的碰撞检测技术,这样才能达到最佳效果。参考文献:\[1\]CHRISTERERICSON.实时碰撞检测算法技术[M].刘天慧,译.北京:清华大学出版社,2010.[2]宣雨松.Unity3D游戏开发[M].北京:人民邮电出版社,2012.[3]WILLGOLDSTONE.Unity3.x游戏开发经典教程[M].北京:科学出版社,2013.(责任编辑:孙娟)