Физика [UE4]: реализовать "максимальное сжатие" для подвески автомобиля
Для данного автомобиля я внедрил систему подвески на четыре колеса. Система основана на законе Гука.
Проблема: Транспортное средство не должно касаться земли. При движении в сферическом контейнере (внутри) подвеска сжимается до 100%, в результате чего шасси автомобиля соприкасается с подземным ходом, что приводит к нежелательным столкновениям, которые разбрасывают автомобиль.
Несмотря на то, что это может быть реалистичным поведением, наша игра нацелена на чувство аркады, поэтому я ищу формулу для реализации максимального сжатия, чтобы шасси транспортного средства не могло приблизиться к подземному ходу, чем X процентов от размера подвески в любой момент, без фактического моделирования физического контакта между двумя твердыми телами. Таким образом, мне нужно применить поддельную силу к подвескам.
Мой нынешний подход: если шасси транспортного средства фактически коснется основания подвески (извините, я не знаю подходящего слова для описания этого. Я имею в виду, когда подвеска находится в максимальном сжатии), сила, равная по величине и противоположная в Направление относительно силы, толкающей подвеску, будет приложено к шасси транспортного средства, заставляя его прекратить движение вниз.
Поэтому я получаю мировую скорость V своих транспортных средств. Чтобы получить нисходящую скорость, я получаю DotProduct от скорости и BodyUpVector.
float DownForceMagnitude = DotProduct(VelocityAtSuspension, BodyUpVector);
FVector DownForce = DownForceMagnitude * BodyUpVector;
FVector CounterForce = -DownForce * WeightOnSuspension;
Хорошо, этот псевдокод работает довольно хорошо даже на подземном ходу, когда транспортное средство приземляется на самолете после прыжка. Однако движение по возрастающему склону (например, движение по внутренним стенкам сферы) в любом случае приводит к максимальному сжатию подвески, поэтому, очевидно, мой подход не верен.
Теперь мне интересно, в чем причина. Только мой вес рассчитывается с помощью VehicleWeight / 4, поскольку Unreal Engine 4 не имеет функции для получения веса в данном месте. Я не физик-профессионал, так что прости меня, если это легко вычислить. Может ли это быть проблемой?
Мне не нужно физически правдоподобное решение на 100%, мне просто нужно решение, которое работает и в достаточной степени останавливает движение шасси моего автомобиля вниз.
Любая помощь приветствуется. Привет,
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
Вот рисунок, чтобы помочь, на что это будет похоже:
Это очень медленно растущая функция, поэтому она прекрасно работает для этого.
Вы, вероятно, хотите сжать значения (может быть между 0 и 100 точно так же, как ваш код ведет себя и как вы хотите, чтобы этот "перерыв" вел себя)
Приспособьте функцию к вашим потребностям, я просто хотел предложить вам использовать ln, как я сделал, чтобы решить эту проблему.
Сначала я добавил e к x, чтобы он прошел через 0,0, если вы хотите остановить его раньше, просто вычтите из x перед использованием ln.
Также обратите внимание, что в зависимости от того, когда / как вы рассчитываете / обновляете вашу приостановку, это (и любая функция, применяемая к силе, основанной на расширении уровней приостановки), может не работать при некоторых обстоятельствах или вообще.