Физика [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%, мне просто нужно решение, которое работает и в достаточной степени останавливает движение шасси моего автомобиля вниз.

Любая помощь приветствуется.
Привет,

3

Решение

У меня была эта проблема с футуристическим магнитным судном на воздушной подушке.

Я решил это, уменьшив силу на 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

Это очень медленно растущая функция, поэтому она прекрасно работает для этого.

Вы, вероятно, хотите сжать значения (может быть между 0 и 100 точно так же, как ваш код ведет себя и как вы хотите, чтобы этот «перерыв» вел себя)

Приспособьте функцию к вашим потребностям, я просто хотел предложить вам использовать ln, как я сделал, чтобы решить эту проблему.

Сначала я добавил e к x, чтобы он прошел через 0,0, если вы хотите остановить его раньше, просто вычтите из x перед использованием ln.

Также обратите внимание, что в зависимости от того, когда / как вы рассчитываете / обновляете вашу приостановку, это (и любая функция, применяемая к силе, основанной на расширении уровней приостановки), может не работать при некоторых обстоятельствах или вообще.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]