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

C# 运动物体的子弹物理碰撞检测,c#,bulletphysics,C#,Bulletphysics,我已经有一段时间在想这个问题了: 我有一个具有长方体形状的运动学刚体实例。我有一个静态地板对象(还有另一个长方体形状的刚体实例)。 运动学实例是应该能够移动对象的玩家对象,但其他对象不得以任何方式影响玩家对象 但是,我还希望运动学对象不要穿过墙或楼板。我知道bullet不允许运动对象检查与静态对象的碰撞。或者至少我认为不是这样 我认为我的选择是: 创建始终随运动学对象移动并检查碰撞的重影对象。我尝试过这样做,但每当我将重影对象的位置更新到其父对象的位置时,就会出现严重的性能问题。由于某种原因,幽

我已经有一段时间在想这个问题了:

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

但是,我还希望运动学对象不要穿过墙或楼板。我知道bullet不允许运动对象检查与静态对象的碰撞。或者至少我认为不是这样

我认为我的选择是:

  • 创建始终随运动学对象移动并检查碰撞的重影对象。我尝试过这样做,但每当我将重影对象的位置更新到其父对象的位置时,就会出现严重的性能问题。由于某种原因,幽灵物体总是和什么东西碰撞

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

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

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

    非常感谢您的帮助。我怎样才能让这个基本的球员动作发挥作用

    我正在使用BulletSharp。

    如果您坚持使用#2,并更改播放器和对象的质量比,该怎么办。 比如将玩家的质量(和影响力)增加十倍,将其他物体的质量(和影响力)减少十倍。 这肯定会使你的球员不会移动一英寸,如果它被小重量的方块击中


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

    嘿,谢谢你的回答。我会试试这个,然后尽快给你回复!我试过你的方法。玩家的质量为5000,其他物品的质量在1到50之间。当按下“d”键时,我通过将线速度设置为(5 | 0 | 0)来移动播放器。这会相应地移动玩家对象,但释放“d”键后,玩家对象仍会移动一点。我猜这是因为速度随着时间慢慢减小。地板和玩家对象的摩擦力值均为0。我知道这种行为在物理上是正确的,因为两帧之间的速度不会为零。我想我必须手动将速度设置为0,然后。。。。这就导致了你上面提到的浮动行为,对吗?顺便问一下,为什么你的地板摩擦力为0?它应该始终大于0。当你按下WASD时,你的球员身体应该将摩擦力设置为0。当你释放WASD时,你的身体应该将摩擦力设置回1,这肯定会阻止你的角色在摩擦力设置为1的地板上滑动。啊,我的错。我的意思是两者的摩擦力都是1。很抱歉我知道这很难,因为我想使用物理引擎,但我不想所有对象都表现得逼真;)