Для данного автомобиля я внедрил систему подвески на четыре колеса.
Система основана на законе Гука.
Проблема: Транспортное средство не должно касаться земли. При движении в сферическом контейнере (внутри) подвеска сжимается до 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
Вот рисунок, чтобы помочь, на что это будет похоже:
Это очень медленно растущая функция, поэтому она прекрасно работает для этого.
Вы, вероятно, хотите сжать значения (может быть между 0 и 100 точно так же, как ваш код ведет себя и как вы хотите, чтобы этот «перерыв» вел себя)
Приспособьте функцию к вашим потребностям, я просто хотел предложить вам использовать ln, как я сделал, чтобы решить эту проблему.
Сначала я добавил e к x, чтобы он прошел через 0,0, если вы хотите остановить его раньше, просто вычтите из x перед использованием ln.
Также обратите внимание, что в зависимости от того, когда / как вы рассчитываете / обновляете вашу приостановку, это (и любая функция, применяемая к силе, основанной на расширении уровней приостановки), может не работать при некоторых обстоятельствах или вообще.
Других решений пока нет …