avatar
Today is 星期五
2010 年 09 月 10 日

2010 年 02 月 22 日

动态球体碰撞检测

by fireyang — Categories: actionscript评论暂缺

出处:Dynamic Circle/Circle Collision Detection in ActionScript 3

demo:collision detection demo 【点击并拖动球,观察速度矢量变化】

source:source

介绍:

两球的碰撞是碰撞检测中最普遍的一种。你可以简单比较两球的半径之和与它们圆心距离进行比较,如果它们的之和大于距离,那么球将发生碰撞。在模拟的每一个时间点里做这样的运算就可以了。

在大多的情况下会做一定的优化,比如先判断两个球所在的矩形是否有发生碰撞(矩形碰撞略),这样能避免不断的进行开方运算,因为开方运算的开销是非常昂贵的。

问题:

但是如果我们的球运行的速度非常快呢?在速度的开始和结束时间都没发生碰撞;但是在两个时间点之间却发生了碰撞的。

(这就是通常所说的穿透现象,就是速度过快,碰撞检测失效了……)

解决办法:

我们计算两次可能的碰撞(给定固定的速度)-它们的开始碰撞时它们是非常临近的(如果它们彼此穿过并且不影响彼此的移动)。这里有两种非必然的情况;且第二种情况无论如何对我们是没有半点好处的,因此我们需要避免:

(A)如果球在间隔点上发生碰撞
(B)发生的碰撞是在间隔点之间
这个解决办法的提出在Christer Ericson 的Real-Time Collision Detection。他在这方面做了大量的工作,我只是在这里进行解释而已,让我们开始吧。

起源:

首先我们假设一个变量0≤t≤1来表示规定速度内的间隔,这样球的位置遍是:

这里X表示初始位置,v表示速度。因此在开始的时候,球的位置应该是X+v*0=X,如果t大于0的时候,就是X+v的一部分。我们需要一个关于t的一个方程,根据这个参数用来计算两个球之间的距离变化。

其中

and 

当f等于两球的半径之和时,这两球发生碰撞:

这里的r表示半径。计算距离意味着我们需要做开发运算,之前也提到,这是非常不值得的。所以我们在等式的两边同时进行平方。

矢量之和再平方,进行分解后,类似标量的乘法的多项式运算

将所有项移至等式的左边,转换成以t为未知数的一元二次方程,等式格式如下:

其中

根据一元二次方程的求根公式的它两个根:

性能考虑:

所有的运算都需要处理器当然ActionScript也不能避免!我们能组织我们的检测方法

实现:

PS:这里略了,因为已经有源码了,自己看,哈哈……
反弹作用:
PS:这里也略了,这里主要是涉及到一些动量守恒的原理,看代码一般能理解的,还有作者还加了弹性和刚体属性。

评论暂缺 »

还没有任何评论。

发表评论

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

© 2010 fireyang’blog All rights reserved - Wallow theme by TwoBeers Crew - Powered by WordPress - Have fun!浙ICP备07033342号