碰撞检测

时间:2009-11-23 14:35:35

标签: collision-detection

我正在做一个项目,其中有一个房间充满了不同形状的物体。

我正在用油漆画房间,画面全是白色,并将所有墙壁/障碍物涂成红色。

我正在使用绘画将每个可移动对象绘制在不同的文件中。

现在,我将房间的地图和对象作为1和0的矩阵加载到我的程序中。我有一个矩阵用于第一个矩阵,另一个矩阵用于我在房间里加载的每个对象。

物体可以在房间内自由移动,移动任何距离,任何角度,并允许自己旋转。我该如何设计一种方法,允许我以任何角度旋转物体并仍然能够检测到碰撞?我的意思是,如果物体可以向上,向下,向左和向右移动,我可以检查矩阵以查看它们是否与1中的任何一个“重叠”。但是如果我想旋转物体,让我们说,10度,我无法看到如何将其转换为矩阵并将其与墙的矩阵进行对比。

我是否应该删除矩阵表示并创建数学区域并处理这个问题,因为我们在IR ^ 2演算中使用某些库来处理它?在计算方面它不是很昂贵吗?

这样做的简单方法是什么?它不需要是一流的方法,但我将它用于复杂的算法,我不希望在每次迭代时都失去太多的计算时间。

3 个答案:

答案 0 :(得分:1)

这可能无法完全回答您的问题,但可能有所帮助。当我在一个我正在写的小游戏中进行碰撞检测时,我会在物体周围碰撞“碰撞盒子”以及更复杂的检测方法。在两个命中框重叠之前,您不必使用复杂方法,然后您只需计算两个对象的碰撞,而不是每个对象与空间中的每个其他对象。

答案 1 :(得分:1)

几年前我做了类似的事情。我的3D场景的每个对象都由基本的墙/地板/天花板对象模式组成。每个对象都是一个带有自己的边界球体的网格。然后我首先测试我的相机的瞄准球体对着每个物体的边界球体以检测碰撞,如果它们相撞,我进行了更精确的碰撞测试(网格/球体)。

它足够快(Duron 600 MHz)并且它非常容易实现。

对于你的场景,你似乎有很多动态对象(我的项目中只有摄像头,作为一个移动对象)所以它可能有助于拥有某种空间分区技术,如四叉树的BSP树。

答案 2 :(得分:0)

我建议将两个物体近似为半径为R1和R2的球体(碰撞舱)。

如果是这种情况,您需要考虑:

1 - 两个身体的半径。在这种情况下,敌人将是半径为0的点,子弹将具有半径getBulletSize();

2 - 动画帧期间子弹和敌人的速度在0< = t< = 1之间。

当| r1 + r2 |发生碰撞时< d,其中d是两个物体质心之间的距离。

d为P(t)-Q(t),Q和P为两个物体的质心。 P(t)= P0 + Vp t。 Q(t)= Q0 + Vq t。

Vp = P1 - P0; Vq = Q1 - Q0;

=> d = P(t) - Q(t)

求解情况(R1 + R2)^ 2 =(P(t) - Q(t))^ 2将产生碰撞时间。不要害怕这个公式!它解决了一个简单的二阶多项式,其二次方程式将解决t。如果B ^ 2>公式中为0,当时间最小时,第一次发生表面碰撞!

碰撞案例:

在以下情况下发生:

1)0 <= t <= 1。

初步检查:

2)最小d(半径条件的导数= 0)必须<1。 R1 + R2

您还可以通过使用叶密度(每个单元格的基元数)条件创建对象网格的边界体积层次来增强此功能。然后,由于胶囊顺序,初始碰撞测试将从根向下迭代以处理过度近似。