高级碰撞检测及响应算法碰撞检测.DOC

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
高级碰撞检测及响应算法碰撞检测

高级碰撞检测及响应算法——碰撞检测 2010-11-18 22:35 1.概述 移动的物体可以由椭球体近似表达,这种椭球体更容易逼近类人和动物的形状,比如说人的头,就是一个X-Y-Z轴半径相等的椭球体,髋骨,盆骨等都可以较好地用椭球体体现出来。多个椭球体组成的集合的形状也使它们易于在障碍物上平滑地移动,这一点在3D游戏中显得特别重要,因为玩家绝不希望在激烈的战斗中自己被卡在某个死角里不能动弹。 我们希望能在场景中来回移动我们的物体(或者角色)。它可以由一个椭球体表现,其中椭球体的中心位置代表了角色的位置,半径向量则定义了椭球体沿三个轴向的尺寸。见图3.1。 图3.1:椭球体的半径向量 通过对角色施加某方向的力,他就能在场景世界中移动。这个过程由速度向量(velocity vector)表示。我们希望椭球体能够在场景世界中移动,那么它的新的位置等于它当前位置加上速度向量。见图3.2。 图3.2:通过一个速度移动椭球体 但是我们还不清楚我们是否能成功完成这个移动,因为可能在过程中会出现一些事情,例如组成场景世界的一个或者多个三角片挡住了椭球体的去路。我们不可能事先准确地知道椭球体会撞上哪个三角片,所以我们应该检查所有的三角片(这里,可以将一个大的网格体化分成一个八叉树,这个八叉树被用来帮助我们检查那些靠近角色的三角片)。同时,我们还不能在检测到一个可能碰撞的三角片后就立即停止检测,因为我们要检测出所有潜在的障碍,近而找出最近的那一个碰撞。如果我们检测到了一个与三角片A发生的碰撞后就停止,而没有继续检测其它的三角片,例如三角片B,那么将发生如图3.3所示的情况,即三角片B比三角片A更先发生碰撞。 图3.3:必须检测所有的三角片 碰撞检测过程应该为后继的响应阶段提供至少两个必要的信息: ?? *?? 球体在场景中的碰撞位置。 ?? *?? 球体发生碰撞之前,沿速度方向到碰撞点的距离。 所以,对于单个三角片的碰撞检测,我们首先要清楚是否会发生碰撞(这将产生一个bool值),如果发生了碰撞,算法应该能够为碰撞响应提供上述两个必要的信息。 2.单个三角片的检测 在e空间中,有一个三角片,它由p1,p2和p3三个顶点所定义,它们以顺时钟排序。另外有一个球体,它位于基点,basePoint,并正沿着它的速度方向运动,速度大小为velocity。如果我们用 t 作为自变量,用方程表达球体的运动过程,那么我们有球体的位置方程: 在三维空间中,一个球体可以由它的位置和半径唯一表示(在e空间中半径是1)。对于运动的球体,半径是常数但是位置是不断变化的。上面的公式给出了球体在任何时刻 t 的位置,这就是所谓的扫掠球(swept sphere)。图3.4表示了这种关系,这一点很重要。由于velocity的大小不清楚,但它与时间的乘积直接影响着扫掠球的位置,而扫掠球每次所作的检测只在一个velocity的长度范围内。那么问题可以转化为:能否在一个[ 0,velocity ]范围内找到碰撞的情况,或者说能否在[0,1]的范围内,找到能满足碰撞特征的t值。在此过程中,解二次方程所得到的t 值的情况,跟velocity的大小有关,图3.9说明了这种关系。 图3.9:速度大小与碰撞的可能情况 同时,对于当前扫掠球的位置而言,可能与它所面对的三角片发生5种关系。具体来讲: ?? ***?? 当VN=0时,此时球体平行于平面运动,球体中心到平面的距离要么为1, 要么小于等于1。对于前一种情况,检测提前退出;对于后一种情况,显然在t[0,1]范围内的所有球体位置中,球体与平面均保持相交。 ?? ***?? 当VN不等于0时,此时球体总会与平面发生碰撞(前提是速度方向有正对平面正面的分量),其形式无非有4种。第一种就是与三角片平面相交,但是不与三角片相交。 ?? ***?? 球体与三角片内部某点相交。 ?? ***?? 球体与三角片某顶点相交。 ?? ***?? 球体与三角片某边缘相交。 图3.4:球体的位置方程 算法的检测程序就从这里开始。其功能是用检测函数将一个扫掠球信息体(空间速度与位置、碰撞是否发生、什么地方发生和发生距离等)与单个三角片信息体(主要是三个顶点坐标信息)进行碰撞检测。并不断循环调用该函数,同时更换函数中的三角片信息体,使当前扫掠球与所有的三角片都被检测到,最后整理并填入扫掠球信息体中的碰撞信息,并在响应过程中更新速度与位置信息。 下面,第一个任务是检测扫掠球是否与三角片所在的平面相交。如果不相交,扫掠球当然不会跟三角片相交。所以我们构造一个平面,叫三角片平面trianglePlane,它是由三角片的三个顶点所确定的平面。如果我们有单位化的平面法向量N和平面常数Cp,那么我们可以计算点p到平面的有符号距离(signed distance):

文档评论(0)

fengruiling + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档