碰撞检测(ColisionDetection).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
碰撞检测(ColisionDetection)

碰撞检测(Collision Detection) 向量的数量积: 设为墙壁的法向量,为运动物体,那么由图表1、图表2和图表3,可以得知运动物体碰撞墙壁的必要条件是。(也适用于三维碰撞)。(向量夹角[0,π]) 碰撞前: 碰撞后: 《『原创』适合初学的简单3D碰撞检测初探(对于3D编程初学人员)》 /fengyecsdn/archive/2005/04/13/345216.aspx 目前成功商业3D游戏普遍采用的碰撞检测是采用BSP树及包装盒方式。简单讲就是采用一个描述用的正方体或者球型体包裹住3D物体对象整体(或者是主要部分),之后根据“描述用”包装盒的距离、位置等信息来计算是否发生碰撞。当然除了球体和正方体以外,其他形状也可以作包装盒,但是相比计算量和方便性来讲 还是前边两中形状更方便些,所以其他形状的包装只用在一些特殊部分使用。BSP树是用来控制检测顺序和方向的数据描述。因为在一个游戏场景中可能存在很多物体,他们之间大多属于较远位置或者相对无关的状态,一个物体的碰撞运算没必要遍历这些物体,同时节省重要的时间。 对于可控制的3D动态场景,不仅需要能准确及时的绘制图形,而且需要在内存中建立一个控制描述世界。在这个世界中不必考虑具体的图形绘制,但要把每个即将在屏幕上绘制的物体都考虑在内。为每个物体建立一个包围盒(或者说是定位坐标组)。每个运动的物体都要有状态属性,比如运动方向,速度,当前位置信息。这些信息用来检测和处理碰撞问题。 《胶囊和凸多边形的动态碰撞检测》 /Program/Abstract/Arithmetic/capsule.mht 在我的一项使用BSP进行碰撞检测的实验中,人物以胶囊来模拟,房屋内部通过非SOLID 的LEAFY BSP来构造,在使用BSP剔除了大量面片以后,遇到这样一个问题:如何在最后筛选下的三角形面片进行碰撞测试,以确定碰撞发生的时间,法向量等。 本文提出一种简单,易懂,准确的方法用来确定一个以速度v前进的胶囊和一个凸多边形第一次发生碰撞的时间。 首先 一个胶囊是所有到某根线段的距离等于某个值r的点的集合: 如图:虚线表示该线段这里以ab表示,r代表所有点到该线段的长度: 首先观察静态情况下的碰撞情况。当一个多边形面片和胶囊碰撞的时候,实际上是该多边形面片中存在一些点,这些点到线段ab的距离小于了r,这是因为在胶囊外部的点到线段ab的距离均大于r(胶囊是所有到某根线段的距离等于某个输r的点的集合)。所以在两个物体都静止的情况下相交测试实际上是测试线段ab到多边形的最短距离,如果该距离r那么存在碰撞,否则不存在碰撞: 如图这里以一个三角形为例子,左图中该三角形的所有点到线段ab的距离均大于r所以和该胶囊不相交,而右图中三角形的黑色区域中的点到线段ab的距离小于r所以该三角形和胶囊相交。 所以实际上只要计算一条线段到某个多边形的距离,然后和r作比较就可以知道是否发生碰撞。而一条线段和一个多边形的距离计算,需要分以下几个步骤(以三角形为例) A将线段ab的2个端点投影到三角形所在平面,并检查投影点是否落在三角形内部,如果是的话将该投影距离作为一个候选值 B分别计算线段ab和三角形的三条边的最短距离点对,并检查该点对中的点是否落在线段中(ab线段和三角形的边线段中)如果是的话将该点对的距离作为一个候选值。 C分别计算线段ab的两个端点到三角形每条边的投影(实际上是计算最近点对),并检查该投影是否落在边的线段中如果是的话作为一个候选值保存。 D分别计算三角形的3个顶点到线段ab上的投影,并检查该投影是否落在线段ab中。如果是的话作为一个候选值保存。 E 分别计算三角形的3个顶点到线段ab的两个顶点,把距离作为候选值保存。 这样一来碰撞检测就归结为,点和线段,线段和线段,以及点和面的最短点对的计算了, 最后将上述的候选值进行比较,结果最小的那个就是三角形中到线段ab的距离。 上述方法非常容易推广到动态的情况也就是:当胶囊以速度v运动时第一次和三角形发生碰撞的时间。问题归结为 在哪个时间T线段ab到三角形的距离等于半径r,而这又归结为上述A,B,C,D,E 5个子问题。如果能够分别求出这5个子问题的时间,t1,t2,t3,t4,t5那么取这5个时间中的最小值就是胶囊和三角形发生碰撞的确切时间了。 下面以两条直线,一条静止,另外一条以速度v移动作为例子,来说明求得时间的过程。问题等同于: 给定一条静止,另外一条以速度v移动的直线,求出在哪个时间T这两条直线的距离等于半径r。 对于两条直线,假设直线的方程分别为: L1:P1+r1*t; L2:P2+r2*t; 现在架设直线L2以速度v={vx,vy,vz}移动; 根据两条直线的距离公式 d=|P1P2 .(r1Xr2)| /|(r1Xr2)|

文档评论(0)

haowendangqw + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档