Войти
ПрограммированиеФорумФизика

Помогите написать физический движок :) (35 стр)

Страницы: 132 33 34 35 36 37 Следующая »
#510
(Правка: 18 янв. 2019, 0:43) 20:09, 17 янв. 2019

Вот такой вот результат, если занулять лямбды трения на каждом кадре. Диф заблокирован.


Забегу чуть вперед, по поводу степени блокировки дифференциала.
Импульс понятно как посчитать: l = (w1 - w2) / (i1^-1 + i2^-1)
Как ограничить не совсем понятно, я вот как думаю: maxL = abs(w1 - w2) / (i1^-1 + i2^-1) * k, где k - степень блокировки. Ну и соответственно, аккумулированная лямбда по модулю меньше чем maxL.

upd: маштабирую не правильно. Завтра перерасчитаю все по новой.


#511
4:33, 18 янв. 2019

vindast
> если занулять лямбды трения на каждом кадре
это значит, что warmstarting сделан неправильно

#512
12:39, 18 янв. 2019

Suslik
> vindast
> > Какое изменение контакта считать незначительным? - казалось бы очень простой
> > вопрос, а на деле не все так просто.
> тут вообще всё сложно. например, можно считать, что контакт остаётся тем же
> самым, если контактируют те же самые фичи(та же самая вершина с тем же самым
> фейсом), либо если у незначительно поменялось положение в системе координат
> хотя бы одного из двух тел и так далее. по-разному можно делать.

На счет вармстатинга.
Есть непонятный момент.
Есть три аккумулированные лямбды. Первая - сил нормальной реакции, вторые две - сил трения.

Для первой я выбрал следующие условие: Нормаль контакта с прошлого шага отклонена от нормали с текущего шага не боле чем на eps (0.02f) и не было отрыва колеса от дороги.
В случае если условие выполняется, джоинт обновляется. Иначе, пересоздается с занулением лямбд.

Видое с этого поста: https://gamedev.ru/code/forum/?id=235421&page=34#m507

Такой подход оправдан тем, что нормаль контакта проходит через центр масс колеса и не зависит от его ориентации в пространстве (рейкаст).

А вот что касается трения. С ними мне сложно. Ситуация отягчается тем, что коэффициенты трения от кадра к кадру меняются. Да и если посмотреть со стороны того, что вращается колесо от кадра к кадру значительно ( в общем случае), может стоит завязать обнуление лямбд сил трения на его ориентацию?

#513
13:14, 18 янв. 2019

я обнуляю лямбды для всего джойнта, если он пересоздаётся. пересоздаётся джойнт, который не удалось сопоставить с другим похожим джойнтом на предыдущем кадре. то есть все три накопленные лямбды либо переходят, либо не переходят одновременно.

#514
(Правка: 20:57) 20:28, 18 янв. 2019

Сделал как Вы выше говорили.

void solveFriction(const float& normalImp) //normalImp - аккумулированный импульс нормальной реакции
  {
    float l1, l2;

    //Вычисляю текущие лямбды
    computeRollingFrictionLambda(l1, frJ1, _wheel);
    computeFrictionLambda(l2, frJ2, _wheel);
 
    //Аккумулирую лямбду
    frJ1.accumulatedLambda += l1;
    frJ2.accumulatedLambda += l2;
 
    //Коэффициенты масштаба
    float c1 = 1.0f;
    float c2 = abs(kLong / kLateral);

    //Маштабированые лямбды
    float scaledL1 = frJ1.accumulatedLambda * c1;
    float scaledL2 = frJ2.accumulatedLambda * c2;

    float x = sqrt(scaledL1 * scaledL1 + scaledL2 * scaledL2);

    //Ограничиваю масштабированные лямбды
    if (x > normalImp * abs(kLong))
    {
      //Коэф. масштабирования 
      float c = normalImp * abs(kLong) / x;

      float tmpL1 = frJ1.accumulatedLambda;
      float tmpL2 = frJ2.accumulatedLambda;

      scaledL1 *= c;
      scaledL2 *= c;

      //Перехожу в начальный масштаб
      frJ1.accumulatedLambda = scaledL1 / c1;
      frJ2.accumulatedLambda = scaledL2 / c2;

      l1 -= tmpL1 - frJ1.accumulatedLambda;
      l2 -= tmpL2 - frJ2.accumulatedLambda;
    }

    
    _wheel->_linearVelosity  -= frJ1.n1 * l1 * _wheel->_invMass;
    _wheel->_angularVelosity += frJ1.w1 * l1 * _wheel->_invInertia;
    _wheel->_linearVelosity  += frJ2.n1 * l2 * _wheel->_invMass;
    _wheel->_angularVelosity += frJ2.w1 * l2 * _wheel->_invInertia;
  }

Видео:

Машина как на льду.

Suslik
> это значит, что warmstarting сделан неправильно
Где я мог мог ошибиться. Я точно правильно ограничил? На сколько я могу судить, все таки проблема в ограничителе.

#515
3:44, 24 янв. 2019

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

лагает из-за кривой отрисовки шрифтов, но важное видно.
красным - эллипс аккумулированных сил трения, синим - их вектор.

Могу скинуть небольшой архивчик с демкой, если нужно. Без записи не так нестабильно)

Собственно, вопрос то такой. Как лямбду в демпфере отграничить?

Я думаю сделать его как джоинт трения. Лямбду как: abs(l) <= k * abs(V), где k - коэффициент (демпфирования (?)), скорость сжатия / разжатия пружины, обновлять перед солвером. Норм?

#516
13:26, 24 янв. 2019

vindast
зачем float по ссылке передавать?)
На одну лишнюю инструкцию код тяжелеет
https://godbolt.org/z/A9QEI3

#517
(Правка: 14:25) 14:24, 24 янв. 2019

vindast
> Я вывел графики сил трения
Встряну в разговор, не прочитав предыдущие 34 страницы.
Силы трения показаны в кружках по углам? А их направление совпадает с направлением луча в этих кругах?
Вообще сила трения должна всё наоборот делать. На разгоне толкать машину вперёд, при торможении назад, а при повороте во внутрь. Противостоит же ей сила инерции.

И ещё для справки можешь почитать вот это: https://www.drive2.ru/b/503714590182343210/
Без учёта этого машина будет ехать как на каменных колёсах (пусть и шершавых)

#518
15:30, 24 янв. 2019

Dmitrrr, slip angle учтен.

Dmitrrr
> Вообще сила трения должна всё наоборот делать. На разгоне толкать машину
> вперёд, при торможении назад, а при повороте во внутрь. Противостоит же ей сила
> инерции.
Она так и делает, как бы.

Dmitrrr
> Силы трения показаны в кружках по углам? А их направление совпадает с
> направлением луча в этих кругах?
Смотри. Сам  сам эллипс: a = kLongitudal * normalImp, b = kLateral * normalImp, kLongitudal  - коэфф. фронтального трения фронтального зависящий от longitudinal slip, kLateral  - коэффициент бокового трения, зависящий от lateral slip (собстна увод колес тут учтен). Синий вектор внутри, аккумулированные импульсы сил трения.

#519
2:11, 25 янв. 2019

Придется вернуться на рейкаст, как летом еще было, задача смоделировать аморт самостоятельно для меня нереальная.

#520
3:47, 27 янв. 2019

Я кажется осилил амортизатор. Сделал частоту обновления физики независимой от фпс. (120 герц)

Норм? Жутко не хватает стабилизатора поперечной устойчивости.

#521
11:27, 27 янв. 2019

vindast
> Сделал частоту обновления физики независимой от фпс. (120 герц)
Да, тут может скрываться проблема.
Знаком с разностными схемами и необходимыми условиями для их решения? Насколько могу судить, твоё моделирование сводится к ним.
https://ru.wikipedia.org/wiki/Разностная_схема
Надо бы проверить твоё решение на сходимость (устойчивость, условие Курента) особенно если применена явная схема.

vindast
> Норм?
Да вроде более менее правдоподобно. Поиграйся с заносами. Насколько они правдоподобны. Сможешь ловить их обратным движением руля? Сравни передний привод и задний.

#522
16:33, 27 янв. 2019

Dmitrrr
> Да, тут может скрываться проблема.
> Знаком с разностными схемами и необходимыми условиями для их решения? Насколько
> могу судить, твоё моделирование сводится к ним.
> https://ru.wikipedia.org/wiki/Разностная_схема
> Надо бы проверить твоё решение на сходимость (устойчивость, условие Курента)
> особенно если применена явная схема.
Ничего не понял, я сделал как выше Suslik и }:+()___ [Smile] писали.

#523
16:36, 27 янв. 2019

Dmitrrr
> Да вроде более менее правдоподобно. Поиграйся с заносами. Насколько они
> правдоподобны. Сможешь ловить их обратным движением руля? Сравни передний
> привод и задний.
Да вроде как можно, но надо думать как собственно руль крутить (угол поворота), да и надо сделать межосевой дифференциал. Что касается переднего / заднего привода могу снять видео. Вроде ведет как и должно. Есть мысля сделать абс и есп, но сначала попробую сделать стабилизатор.

#524
(Правка: 21:57) 20:33, 19 мар. 2019

Что делать если не хватает жесткости солвера? Увеличение частоты интеграции физики не представляется возможным, да и эффекта ощутимого не дает. Не хватает именно жесткости псевдоскоростей. По наблюдению, проблема только с угловыми составляющими.

Есть у меня если что альтернативная модель физики (с рейкас машинкой, там такой проблемы нет, но есть другая проблема).


Suslik
> в соединения очень легко добавляется эластичность через constraint force mixing
Что это за зверек такой?

Вопрос гуглится, но там все по готовым уже движкам.

Страницы: 132 33 34 35 36 37 Следующая »
ПрограммированиеФорумФизика