3

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

问题:车辆不能接触地面。在球形容器(内部)中行驶时,悬架会被压缩至 100%,使车辆底盘接触地下,从而导致车辆发生意外碰撞。

尽管这可能是一种现实的行为,但我们的游戏旨在营造一种街机感觉,所以我正在寻找一个实现最大压缩的公式,这样车辆底盘就不会比悬架尺寸的 X% 更接近地下在任何给定时刻,无需实际模拟两个刚体之间的物理接触。因此,我需要对悬架施加假力。

我目前的方法: 如果车辆底盘实际上会接触悬架底座(对不起,我不知道合适的词来描述这个。我的意思是,当悬架处于最大压缩状态时),一个大小相等但相反的力相对于推动悬架的力的方向将施加到车辆底盘,迫使其停止向下移动。

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

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

好的,当车辆在跳跃后降落在飞机上时,这个伪代码即使在地下也能正常工作。然而,在越来越大的坡度上行驶(比如在球体的内壁上行驶),无论如何都会使悬架达到最大压缩,所以显然我的方法是不正确的。

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

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

任何帮助表示赞赏。问候,

4

1 回答 1

2

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

我通过根据悬架扩展级别将力减小 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 idk 之间,您的代码的行为方式以及您希望此“中断”的行为方式)

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

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

另请注意,根据您何时/如何计算/更新您的暂停,这(以及基于暂停级别的扩展应用于力的任何功能)在某些情况下或根本不起作用。

于 2017-01-24T15:06:53.103 回答