运动学物体的子弹物理碰撞检测

时间:2021-05-11 16:15:44

标签: c# bulletphysics

我很长时间以来一直在努力解决这个问题:

我有一个盒子形状的运动学刚体实例。我有一个静态地板对象(RigidBody 实例也有另一个盒子形状)。 运动学实例是应该能够移动对象的玩家对象,但其他对象不得以任何方式影响玩家对象。

但是,我也希望运动学对象不穿过墙壁或地板。我知道子弹不允许运动物体检查与静态物体的碰撞。或者至少我认为没有。

我认为我的选择是:

  1. 创建一个始终与运动学对象一起移动并检查碰撞的幻影对象。我尝试过,但是每当我将幻影对象的位置更新为其父对象的位置时,都会遇到严重的性能问题。而且出于某种原因,幽灵物体总是在碰撞什么东西?

  2. 将我的运动学对象切换为动态对象。我也试过这个,但我不知道如何阻止其他对象移动我的播放器对象。如果没有按下 WSAD,我也无法让玩家对象停止。它总是“滑动”一点(是的,我试过摩擦 = 1)。当然,每次不按下 WASD 键时,我都可以将线速度设置为 0,但这似乎也会影响重力,使我的玩家漂浮在地面上而不是坠落。我也尝试将阻尼系数设置为高值,但这也会影响世界重力,导致物体下落得更慢...

  3. 我最喜欢的选项:由于我的运动学刚体实例具有碰撞形状,因此必须有一种方法可以调用“获取具有碰撞法线和深度的相交形状列表”的方法。然后我会在每一帧迭代该列表,并使用碰撞法线和深度来重新定位我的播放器,如果它与地板形状相交。

在尝试“Bullet”之前,我手动进行了碰撞测试: 首先是宽相轴扫描,然后是潜在碰撞候选的 SAT 交叉测试。然后通知对象并将碰撞对象、碰撞法线和深度作为参数提供给它们。 我只需要这种行为:-)。

非常感谢任何帮助。我怎样才能让这个基本的玩家动作发挥作用?

我正在使用 BulletSharp。

1 个答案:

答案 0 :(得分:0)

如果你坚持 #2,并改变你的玩家和物体的质量比会怎样。 就像将玩家质量(和影响力)增加十倍,并将其他物体的质量(和影响力)减少十倍。 这肯定会让你的播放器在被小重量的盒子击中时一英寸都不会移动。

第二部分不清楚为什么摩擦不起作用。摩擦力是否对其他受重力影响的物体起作用,或者它们也在斜坡上滑动?