如何在Farseer中制造炸弹爆炸,将附近的物体推开?


14

我正在尝试在Farseer中制造炸弹爆炸。我为炸弹创建了一个圆圈。但是,如果炸弹爆炸,则其周围的物体(主体)应飞走,因为它们被爆炸的巨大力量推回。不过,我不确定如何建立这种力量-我该怎么做?


值得指出的是,Farseer附带了一个实现爆炸的示例。它是“ AdvancedDemo5”(在当前源中)。它与Classic Thunder出色答案中的接近方法相似,只是不太复杂(AABB中的固定幅度脉冲)。
安德鲁·罗素

Answers:


28

我建议您查看爆炸iforce2d页面。在性能与准确性之间进行权衡时,它在处理爆炸的各种方式方面做得非常出色。它涉及3种方法,我将在这里总结。因此,这只是我在研究过程中发现的信息的摘要,而这些都不是我自己的工作。

您也想在这里施加冲力,而不是施加力。要了解为什么要阅读此内容

接近法

接近法

这与Byte56回答中的方法相同。这个概念很简单。有一个爆炸点,并在远离该点的相反方向施加脉冲,这会影响所有物体,其强度取决于其距离。

优点:

  • 非常快
  • 易于编码。

缺点:

  • 爆炸穿过不动的物体和静态物体。
  • 如果仅检查到重心的距离,则可以跳过爆炸影响区域中的对象。
  • 不考虑表面积。
  • 一切都立即受到影响。

射线投射法

射线投射法

这很简单,可以从爆炸的源头投射出射线,并在它们碰撞到物体时以距离所决定的脉冲施加脉冲。

优点:

  • 与弹丸方法相比,性能强度较低。
  • 爆炸被物体阻挡。
  • 考虑到表面积。

缺点:

  • 一切都立即受到影响。
  • 爆炸越大,确保爆炸影响一切所需的射线就越多。
  • 比接近方法更注重性能。

粒子法

粒子法

我个人的最爱。与RaySasting方法类似,但不是使用射线,而是利用物理引擎并吐出与场景交互的小颗粒。

优点:

  • 极其简单的代码。产生球并向每个球施加脉冲。您没有要编写的代码。只要有一个计时器,它会在爆炸完成后关闭并重置/重置尸体。
  • 爆炸被物体阻挡。
  • 考虑表面积。
  • 爆炸从表面反射出来。
  • 爆炸距离较远的物体对爆炸的反应速度较慢。
  • 您可以将这些球用作生成片段的基础,从而使您的效果准确反映爆炸的影响。

缺点:

  • 增加每笔交易的复杂性。

5
很好的答案。我特别喜欢粒子法。似乎这样会使获得强大的爆炸更加困难。使粒子质量更高是微不足道的吗?
MichaelHouse

1
影响粒子的所有物理方面都是微不足道的,最相关的是密度,速度和阻尼。调高密度并设置较高的速度可以使您产生可笑的暴力爆炸。
ClassicThunder

您是否使爆炸粒子故意减速,还是只是整个动画停止了。给粒子增加恒定的摩擦力是有意义的。
这个

@self Box2D允许您向对象添加衬里阻尼,从而以一定速率线性降低对象的速度,这是gif中使用的技术。
ClassicThunder 2014年

1
极好的答案:)我会在最后一种方法上添加一个专业的选项,因为您可以使用颗粒位置绘制一些看起来不错的烟尘。
iforce2d 2014年

2
  • 选择炸弹影响范围内的所有对象。
  • 对于每个对象
    • 使用对象位置和爆炸的中心来计算脉冲矢量。有点像normalize(object - center)
    • 使用从炸弹中心到物体的距离来计算脉冲的大小。就像是(object - center).length
    • 使用前面步骤中找到的矢量和幅度向对象施加脉冲

至于计算幅度,您可以从简单的线性衰减开始,如果您不喜欢结果,则移至其他公式。


力是指您要随时间影响某个物体的情况,此处并非如此。施加冲动会更正确。
ClassicThunder 2014年

抱歉,我说过用力,但与冲动有关。
MichaelHouse
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.