欢迎来到天天文库
浏览记录
ID:43473187
大小:164.00 KB
页数:6页
时间:2019-10-05
《高级碰撞检测和响应算法——碰撞响应》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、高级碰撞检测及响应算法——碰撞响应2010-11-2316:32对运动的球体作碰撞检测,查明它将与三角片发生何种形式的碰撞是检测算法完成的任务。但是当碰撞真的发生了,接下来应该怎么做呢?最简单的作法是让球体停下来,或者一旦发现可能的碰撞,就禁止球体继续运动。但是这些作法都不是真正意义上的碰撞响应,我们应该得到更加自然的响应过程。比如在游戏开发中,我们应该在发生碰撞后将物体沿墙壁滑动,自动地爬上楼梯抑或自动地翻过地面上的障碍物,又比如在计算机过程仿真中,让碰撞的物体按物理规律进一步做出诸如反弹等的反应……下面,我们
2、以基本的滑移响应为例,说明如何利用由检测算法得到的碰撞数据。那么到底什么是滑移呢?在场景世界中,如果我们检测到角色将与一面三角片碰撞,我们接下来要做的事情就是尽量靠近这块三角片,然后改变角色的速度方向,最后在新的方向上继续运动。见图4.1。图4.1:碰撞三角片后的滑移1.滑移平面滑移平面,顾名思意,就是发生碰撞后物体将沿此平面滑动。简单地从图4.1可以看出,滑移平面应该就是被碰撞的三角片所在的平面。事实上,在某些情况下这个结论是对的,但是在图4.2中所描述的情况下,这种说法显然不太妥当。图4.2:滑移平面的定义下
3、面我们概括一下什么是滑移平面。在图4.2中的两个滑移平面有什么共同点呢?它们都是扫掠球上接触点的切平面。所以,我们必须知道过球体表面上给定点的切平面的方法。通常我们描述一张平面的方法是通过平面上一点(origin点)和平面的法向量(normal向量)来定义。在碰撞检测部分,我们已经得到了碰撞点,所以当前的任务就是计算在球体碰撞点处的切平面的法向量。很幸运,我们选择在e空间中进行所有的操作的确为我们节省了大量的计算工作,因为过单位球体表面上任意一点的切平面的法向量其实就是由表面上定点到球体中心的向量!见图4.3。图
4、4.3:单位球体的切平面于是在e空间中,通过以下几行代码我们就能求得滑移平面的表达式。VECTORplaneOrigin=intersectionPoint;VECTORplaneNormal=newPosition-intersectionPoint;planeNormal.normalize();PLANEslidingPlane(planeOrigin,planeNormal);2.滑动单位球现在我们已经知道了如何计算滑移平面,接下来呢? *** 使单位球不断逼近将要碰撞的三角片。不妨将此时的球体位置叫
5、作“新点” *** 计算新点所对应的滑移平面 *** 将原始的速度向量投影到滑移平面,得到新的速度向量的终点 *** 用终点减去三角片上的碰撞点得到新的速度向量 *** 然后使用新的位置basePoint和新的速度向量velocity递归调用碰撞检测函数进行新一轮检测在这里,最后一步出现得比较突然,碰撞检测被递归调用,对于每一次循环,我们都要用更新了参数的单位球重新检测所有的三角片。循环的结束条件是下面条件之一: *** 单位球没有撞上任何东西,于是我们只用更新位置 *** 速度向量变得非
6、常小(经过多次投影后,可能会变得非常小,比如说垂直碰撞三角片平面时)那么,上面提到的“投影”是怎么回事儿?这个对我们很重要,通过投影我们可以得到新的速度向量,从而可以在滑移平面上继续运动,并且球体撞击三角片的入射角越小,球体产生的滑移量就越小。见图4.4。图4.4:碰撞入射角影响滑移量接下来,我们更深入地解释如何将一个速度向量投影到滑移平面上。我们通过三角片上的碰撞点和法向量来求得滑移平面。那么首先必须求出原始速度向量的终点到滑移平面的有符号距离(singeddistance),然后将终点沿滑移平面法线方向投影到
7、滑移平面上,于是我们可以得到投影点:floatdistance=slidingPlane.distanceTo(destination);VECTORnewDestinationPoint=destination-distance*planeNormal;(这里planeNormal是单位向量)总之,我们的工作是计算新的速度向量,然后用新的位置(也就是碰撞的位置)和新的速度递归调用碰撞检测和响应算法。3.重力如何对场景中的物体施加重力呢?难吗?一点都不难。在碰撞检测算法中,我们都插入两个函数调用,一个用于设置角色
8、的速度,另一个则设置重力(也可以将其当作一个速度施加)。你可以将这两个向量合并起来,那么每次循环时只需调用一次函数用于设置综合速度向量v=velocity+gravity,但是这种合并会使诸如爬楼梯的情形变得更加困难,因为当角色撞击了楼梯的边缘,速度向量必须足够长才能使投影向量向上滑移。因为重力向量使原始的速度向量产生了垂直向下的分量,从而使碰撞入射角减小,当然沿切平面向
此文档下载收益归作者所有