物理[UE4]:实现"最大压缩"用于车辆悬架

时间:2016-05-14 16:59:16

标签: c++ physics unreal-engine4 physx

对于给定的车辆,我在四个车轮上实施了悬架系统。 该系统基于胡克定律。

问题:车辆不应该接触地面。当在一个球形容器(内部)中行驶时,悬架会被压缩至100%,使车辆底盘接触地下,从而导致不必要的碰撞,使车辆四处乱转。

尽管这可能是一种现实行为,但我们的游戏目标是街机感觉,所以我正在寻找实施最大压缩的公式,以便车辆底盘可以&# 39;在任何给定时刻,接近地下的距离比悬挂尺寸的X%更接近,而没有实际模拟两个刚体之间的物理接触。因此,我需要对悬架施加假力。

我目前的做法: 如果车辆底盘实际上碰到了悬架底座(对不起,我不知道用这句话来说明这个词。我的意思是,当悬架处于最大压缩状态时),力的大小相等,方向相反推动悬架的力将施加在车辆底盘上,迫使其停止向下移动。

因此,我收到了我的车辆世界速度V. 为了获得向下速度,我得到了速度的DotProduct和BodyUpVector。

float DownForceMagnitude = DotProduct(VelocityAtSuspension, BodyUpVector);
FVector DownForce = DownForceMagnitude * BodyUpVector;
FVector CounterForce = -DownForce * WeightOnSuspension;

好吧,当车辆在跳跃后降落在飞机上时,这个伪代码甚至可以在地下工作。然而,在越来越大的坡度上行驶(如在球体的内壁上行驶),使悬架达到最大压缩,所以显然我的方法不正确。

我现在想知道原因是什么。我的体重计算仅由VehicleWeight / 4模拟,因为虚幻引擎4没有在给定位置接收重量的功能。我不是物理专家,如果这很容易计算,请原谅我。这可能是问题吗?

我不需要物理上100%合理的解决方案,我只需要一个有效的解决方案,并充分阻止我的车辆底盘的向下运动。

感谢任何帮助。 问候,

1 个答案:

答案 0 :(得分:1)

我有一个未来的磁性气垫船这个问题。

我通过将力减少ln来解决它,具体取决于悬架扩展级别,如下所示:

y = ln(ln(x+e)) 

其中:

x = Suspension extension lvl in % (-> 0 being fully compressed)
y = the factor that you multiply the force with
e = eulers number

这里有一张图片来帮助它:

https://ggbm.at/gmGEsAzE

ln是一个非常缓慢的增长功能,这就是为什么它如此有效。

您可能想要钳制这些值(可能在0到100之间,确切地说代码的行为方式以及您希望这种“中断”行为的方式)

根据您的需求定制功能,我只是想建议你像我一样使用ln来解决这个问题。

我首先将e添加到x以使其通过0,0如果你想让它早点停止只是在使用ln之前减去x。

另请注意,根据您计算/更新暂停的时间/方式(以及根据暂停级别的延伸对力施加的任何功能)可能在某些情况下或根本不起作用。