Questions tagged «aabb»

6
快速移动物体的六角形碰撞检测?
对象具有位置和速度矢量。通常仅使用该位置来检查两个物体是否发生碰撞,这对于移动速度非常快的物体是有问题的,因为可能发生物体移动得如此之快,以至于在第一次碰撞检查中它位于第一个物体的前面,而在第二个碰撞检查中位于它的后面第二次碰撞检查。 现在,还有基于行的碰撞检查,其中您仅检查每个对象的运动矢量是否与另一个对象的边界框相交。这可以看作是一点的扩展。这仅在快速移动的物体很小的情况下才有效。 所以我的想法是,为什么不扩展矩形而不是扩展点?这将产生一个六边形。 现在,到目前为止一切顺利。但是我实际上如何检查两个这种六角形是否相交?请注意,这些是非常特殊的六角形。 奖励问题:是否可以计算出碰撞发生的确切位置(或确切地说,经过多少时间)?这对于检测实际发生的情况(例如在何处以及具有多少功率)以及模拟它们在碰撞到帧结束之间的时间中如何移动非常有用。

4
我的物理引擎中更新问题的动量和顺序
这个问题是我上一个问题的“后续”问题,涉及到碰撞检测和解决,您可以在这里找到。 如果您不想阅读上一个问题,这里是有关我的物理引擎如何工作的简短描述: 每个物理实体都存储在称为SSSPBody的类中。 仅支持AABB。 每个SSSPBody存储在一个名为SSSPWorld的类中,该类更新每个身体并处理重力。 每帧,SSSPWorld都会更新每个身体。 每个更新的实体都在空间哈希中查找附近的实体,检查是否需要检测与它们的碰撞。如果是,它们将调用“碰撞”事件并检查是否需要解决与其之间的冲突。如果是,他们将计算穿透矢量和方向重叠,然后更改其位置以解决穿透问题。 当一个物体与另一个物体碰撞时,只需将其速度设置为自己的速度即可将其速度传递给另一个物体。 如果从上一帧起未更改位置,则将物体的速度设置为0。如果它也与移动的物体(例如升降机或移动的平台)相撞,则会计算升降机的运动差,以查看物体是否尚未从其最后位置移动。 同样,当一个实体的所有AABB角与某帧中的某些内容重叠时,它会引发“压碎”事件。 这是我的游戏的完整源代码。它分为三个项目。SFMLStart是一个简单的库,用于处理实体的输入,绘制和更新。SFMLStartPhysics是最重要的类,其中SSSPBody和SSSPWorld类位于其中。PlatformerPhysicsTest是游戏项目,包含所有游戏逻辑。 而这是在SSSPBody类,评论和简化了“更新”的方法。如果您不想看整个SFMLStartSimplePhysics项目,则只能看一下。(即使这样做,您也应该看看它,因为它已被注释。) .gif显示两个问题。 如果将实体放置在不同的顺序中,则会发生不同的结果。左侧的板条箱与右侧的板条箱相同,只是以相反的顺序放置(在编辑器中)。 两个板条箱都应朝屏幕顶部推进。在左边的情况下,没有箱子被推进。在右边,只有其中之一是。两种情况都是意外的。 第一个问题:更新顺序 这很容易理解。在左侧的情况下,最上面的板条箱先于另一个板条箱被更新。即使底部的板条箱将速度“传递”到另一个板条,它也需要等待下一帧移动。由于它没有移动,因此底部木箱的速度设置为0。 我不知道如何解决此问题。我希望解决方案不依赖于“排序”更新列表,因为我觉得我在整个物理引擎设计中做错了什么。 主要的物理引擎(Box2D,Bullet,花栗鼠)如何处理更新顺序? 第二个问题:只有一个板条箱被推向天花板 我还不明白为什么会这样。“弹簧”实体的作用是将物体的速度设置为-4000,然后将其重新放置在弹簧本身的顶部。即使禁用重新定位代码,该问题仍然会发生。 我的想法是,当底部板条箱与顶部板条箱发生碰撞时,其速度设置为0。我不确定为什么会这样。 尽管有机会看起来像放弃第一个问题的人,但我在上面发布了整个项目的源代码。我没有任何东西可以证明这一点,但是相信我,我努力解决了这个问题,但是我找不到解决方案,并且我以前没有任何物理和碰撞方面的经验。我一直在努力解决这两个问题超过一个星期,现在我很绝望。 我认为如果不从游戏中剥离许多功能(例如,速度传递和弹簧),就无法找到解决方案。 非常感谢您花时间阅读此问题,如果您甚至想提出解决方案或建议,也要多谢。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.