我正在做一个项目,其中有一个房间充满了不同形状的物体。
我正在用油漆画房间,画的全是白色,把所有的墙/障碍物都涂成红色。
我在一个不同的文件中绘制每个可移动的对象,也是使用油漆。
现在,我将房间和物体的地图作为1和0的矩阵加载到我的程序中。对于第一个对象,我有一个矩阵,对于我加载到房间中的每个对象,都有另一个矩阵。
该对象将能够在房间中自由移动,移动任何距离,任何角度,并允许旋转自己。我应该如何设计一种方法,允许我以任何角度旋转对象,同时仍然能够检测碰撞?我的意思是,如果对象可以向上、向下、向左和向右移动,我就可以检查两个矩阵,看看它们是否与1中的任何一个“重叠”。但是,如果我想旋转对象,比方说,旋转10º,我看不到如何将其转换为矩阵,并与墙的矩阵进行比较。
我是否应该放弃矩阵表示,创建数学区域,并像我们在IR^2微积分中处理它一样,使用一些库来处理它?从计算的角度来看,这不是很昂贵吗?
有什么简单的方法可以做到这一点?它不需要是一个顶级的方法,但我将它用于一个复杂的算法,我不想在每次迭代中损失太多的计算时间。
发布于 2009-11-23 23:18:45
这可能不会完全回答您的问题,但它可能会有所帮助。当我在写一个小游戏进行碰撞检测时,我会在物体周围有一个碰撞“命中框”,以及一个更复杂的检测方法。在两个命中框重叠之前,不必使用复杂方法,然后只需计算两个对象的碰撞,而不是计算空间中每个对象与其他对象的碰撞。
发布于 2009-11-23 23:41:03
几年前我也做过类似的事情。我的3D场景中的每个对象都由基本的墙/地板/天花板对象模式组成。每个对象都是一个具有自己的边界球体的网格。然后,我首先测试相机的边界球体与每个对象的边界球体,以检测碰撞,如果它们发生碰撞,我执行更精确的碰撞测试(网格/球体)。
它足够快(Duron600 MHz),而且很容易实现。
对于您的场景,您似乎有很多动态对象(我在我的项目中只有一个摄像头,作为一个移动对象),所以使用某种空间分区技术可能会有所帮助,比如四叉树的BSP树。
发布于 2016-05-06 19:31:17
我建议将两个物体近似为半径为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将产生碰撞时间。不要害怕这个公式!当公式中的B^2 >0时,当时间最短时,发生第一次表面碰撞。
冲突情况:
在以下情况下会发生:
1) 0 <= t <= 1.
初步检查:
2)最小d(半径条件=0的导数)必须< R1 + R2
也可以通过创建具有叶密度(每个单元的基本体数量)条件的对象网格的边界体积层次来增强此功能。然后,初始碰撞测试将从根向下迭代,以处理由于胶囊顺序而导致的过度近似。
https://stackoverflow.com/questions/1783500
复制相似问题