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

问题:车辆不应接触地面。当在球形容器(内部)中行驶时,悬架被压缩到 100%,使车辆底盘接触地下,这会导致意外碰撞,从而将车辆抛向四周。 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

好吧,当车辆在跳跃后降落在飞机上时,这个伪代码甚至在地下也能正常工作。然而,在逐渐增加的斜坡上行驶(例如在球体的内壁上行驶),无论如何都会使悬架达到最大压缩,因此显然我的方法是不正确的。

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

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

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

最佳答案

我在使用 future 派磁性气垫船时遇到了这个问题。

我通过根据悬架扩展级别将力减小 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 中减去。

另请注意,根据您计算/更新悬架的时间/方式,此(以及基于悬架水平的扩展应用于力的任何函数)在某些情况下可能不起作用或根本不起作用。

关于c++ - 物理 [UE4] : Implement a "maximum compression" for vehicle-suspension,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37229459/

10-13 06:17