1

我正在做一个项目,房间里摆满了不同形状的物体。

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

我在不同的文件中绘制每个可移动对象,也使用油漆。

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

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

我应该放弃矩阵表示并创建数学区域并处理这个问题,就像我们在 IR^2 微积分中处理它一样,使用一些库吗?在计算方面不是很昂贵吗?

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

4

3 回答 3

1

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

于 2009-11-23T15:18:45.277 回答
1

几年前我做过类似的事情。我的 3D 场景中的每个对象都由基本的墙壁/地板/天花板对象图案组成。每个对象都是一个有自己的边界球的网格。然后我首先针对每个物体的边界球测试我的相机的包围球以检测碰撞,如果它们发生碰撞,我会执行更精确的碰撞测试(网格/球体)。

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

对于您的场景,您似乎有很多动态对象(我的项目中只有相机,作为移动对象),因此拥有某种空间划分技术(如四叉树的 BSP 树)可能会有所帮助。

于 2009-11-23T15:41:02.737 回答
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)必须 < R1 + R2

您还可以通过使用叶密度(每个单元的图元数)条件创建对象网格的包围体层次结构来增强这一点。然后,初始碰撞测试将从根向下迭代以处理由于胶囊顺序引起的过度近似。

于 2016-05-06T11:31:16.840 回答