物理 [UE4]:为车辆悬架实施 "maximum compression"
Physics [UE4]: Implement a "maximum compression" for vehicle-suspension
对于给定的车辆,我在四个轮子上实施了悬架系统。
该系统基于胡克定律。
问题:车辆不能接触地面。在球形容器(内部)中行驶时,悬架被压缩至 100%,使车辆底盘接触地下,从而导致不必要的碰撞,使车辆四处乱飞。
尽管这可能是一种现实行为,但我们的游戏旨在提供街机感觉,因此我正在寻找一个公式来实现 最大压缩,以便车辆底盘在任何给定时刻,不能比悬架尺寸的 X% 更接近地下, 无需实际模拟两个刚体之间的物理接触。因此,我需要对悬架施加假力。
我目前的做法:
如果车辆底盘实际上会接触悬架底座(抱歉,我不知道合适的词来形容这个。我的意思是,当悬架处于最大压缩状态时),一个大小相等但方向相反的力相对于推到悬架上的力将施加到车辆底盘上,迫使其停止向下移动。
因此,我收到我的车辆世界速度 V。
为了获得向下速度,我得到了速度的 DotProduct 和 BodyUpVector。
float DownForceMagnitude = DotProduct(VelocityAtSuspension, BodyUpVector);
FVector DownForce = DownForceMagnitude * BodyUpVector;
FVector CounterForce = -DownForce * WeightOnSuspension;
好的,当车辆在跳跃后降落在飞机上时,这个伪代码甚至在地下也能正常工作。然而,在增加的坡度上行驶(就像在球体的内壁上行驶),无论如何都会使悬架达到最大压缩,所以显然我的方法是不正确的。
我现在想知道是什么原因。我的重量计算仅由 VehicleWeight / 4 模拟,因为 Unreal Engine 4 没有在给定位置接收重量的功能。我不是物理学专业人士,如果这很容易计算,请原谅我。这可能是问题所在吗?
我不需要物理上 100% 合理的解决方案,我只需要一个有效的解决方案,并充分阻止我的车辆底盘的向下运动。
感谢任何帮助。
问候,
我在未来的磁性气垫船上遇到了这个问题。
我通过根据悬架扩展级别减少 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
这里有一张图片可以帮助你了解它的样子:
ln 是一个增长非常缓慢的函数,这就是为什么它对此如此有效。
您可能想要限制值(可能在 0 到 100 之间,以了解您的代码的行为方式以及您希望此 "break" 的行为方式)
根据您的需要定制功能,我只是想建议您像我一样使用 ln 来解决这个问题。
我先将 e 添加到 x 以使其通过 0,0 如果你想让它更早停止只需在使用 ln 之前从 x 中减去即可。
另请注意,根据 when/how 您计算/更新您的暂停(以及基于暂停级别的扩展应用于力的任何功能)可能在某些情况下或根本不起作用。
对于给定的车辆,我在四个轮子上实施了悬架系统。 该系统基于胡克定律。
问题:车辆不能接触地面。在球形容器(内部)中行驶时,悬架被压缩至 100%,使车辆底盘接触地下,从而导致不必要的碰撞,使车辆四处乱飞。
尽管这可能是一种现实行为,但我们的游戏旨在提供街机感觉,因此我正在寻找一个公式来实现 最大压缩,以便车辆底盘在任何给定时刻,不能比悬架尺寸的 X% 更接近地下, 无需实际模拟两个刚体之间的物理接触。因此,我需要对悬架施加假力。
我目前的做法: 如果车辆底盘实际上会接触悬架底座(抱歉,我不知道合适的词来形容这个。我的意思是,当悬架处于最大压缩状态时),一个大小相等但方向相反的力相对于推到悬架上的力将施加到车辆底盘上,迫使其停止向下移动。
因此,我收到我的车辆世界速度 V。 为了获得向下速度,我得到了速度的 DotProduct 和 BodyUpVector。
float DownForceMagnitude = DotProduct(VelocityAtSuspension, BodyUpVector);
FVector DownForce = DownForceMagnitude * BodyUpVector;
FVector CounterForce = -DownForce * WeightOnSuspension;
好的,当车辆在跳跃后降落在飞机上时,这个伪代码甚至在地下也能正常工作。然而,在增加的坡度上行驶(就像在球体的内壁上行驶),无论如何都会使悬架达到最大压缩,所以显然我的方法是不正确的。
我现在想知道是什么原因。我的重量计算仅由 VehicleWeight / 4 模拟,因为 Unreal Engine 4 没有在给定位置接收重量的功能。我不是物理学专业人士,如果这很容易计算,请原谅我。这可能是问题所在吗?
我不需要物理上 100% 合理的解决方案,我只需要一个有效的解决方案,并充分阻止我的车辆底盘的向下运动。
感谢任何帮助。 问候,
我在未来的磁性气垫船上遇到了这个问题。
我通过根据悬架扩展级别减少 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
这里有一张图片可以帮助你了解它的样子:
ln 是一个增长非常缓慢的函数,这就是为什么它对此如此有效。
您可能想要限制值(可能在 0 到 100 之间,以了解您的代码的行为方式以及您希望此 "break" 的行为方式)
根据您的需要定制功能,我只是想建议您像我一样使用 ln 来解决这个问题。
我先将 e 添加到 x 以使其通过 0,0 如果你想让它更早停止只需在使用 ln 之前从 x 中减去即可。
另请注意,根据 when/how 您计算/更新您的暂停(以及基于暂停级别的扩展应用于力的任何功能)可能在某些情况下或根本不起作用。