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

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

Страницы: 130 31 32 33 34 35 Следующая »
#495

Suslik
> k1 = 0, k2
при к = 0, отвалится из-за деления.

10 янв. 2019, 16:46

#496

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

10 янв. 2019, 16:49

#497

http://www.rowlhouse.co.uk/jiglib/index.html

10 янв. 2019, 16:56

#498

lookid
> http://www.rowlhouse.co.uk/jiglib/index.html
там очень слабые коллижены, нет никаких интересных джойнтов, трение плохое. хотя для своего времени он был неплохо оптимизирован.

10 янв. 2019, 17:10

#499

Suslik
токамак, ньютон динамикс, физикс 3, буллет, бокч2д, чипманк, ode. Мало?

10 янв. 2019, 20:30 (Правка: 20:35)

#500

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

11 янв. 2019, 4:02 (Правка: 4:03)

#501

Я тут пересчитал все. normalImp * _frictionKoef > 0

Для изотропного:

float l = sqrt(l1 * l1 + l2 * l2);

    if (l > normalImp * _frictionKoef)
    {
      float a = (l1 * l1 + l2 * l2);
      float b = -2.0f * (l1 * l1 + l2 * l2);
      float c = l1 * l1 + l2 * l2 - normalImp * normalImp * _frictionKoef * _frictionKoef;

      float d = sqrt(b * b - 4.0f * a * c);

      float x1 = (-b - d) / (2.0f * a);

      l1 -= l1 * x1;
      l2 -= l2 * x1;
    }
Для анизотропного (kLong  * kLateral > 0, не придумал как решить систему так, что бы можно было это условие нарушать):

float l = sqrt(l1 * l1 / (kLong * kLong) + l2 * l2 / (kLateral * kLateral));

    if (l > NormalImp)
    {
      float a = (l1 * l1 / (kLong * kLong) + l2 * l2 / (kLateral * kLateral));
      float b = -2.0f * (l1 * l1 / (kLong * kLong) + l2 * l2 / (kLateral * kLateral));
      float c = l1 * l1 / (kLong * kLong) + l2 * l2 / (kLateral * kLateral) - NormalImp * NormalImp;

      float d = sqrt(b * b - 4.0f * a * c);

      float x1 = (-b - d) / (2.0f * a);

      l1 -= l1 * x1;
      l2 -= l2 * x1;

    }

12 янв. 2019, 10:16 (Правка: 10:28)

#502

vindast
нет, результат должен быть проще. корень должен быть один, ближе к твоей предыдущей попытке.

12 янв. 2019, 10:47

#503

Как надо аккумулировать лямбду сил трения?

Я сделал так (аккумулирую по каждому направлению отдельно):

frJ1.accumulatedLambda += l1;
frJ2.accumulatedLambda += l2;
Получил крайне нестабильную хрень.

Сообщение выше я читал, но пока только так смог.

float l = sqrt(frJ1.accumulatedLambda * frJ1.accumulatedLambda / (kLong * kLong) + frJ2.accumulatedLambda * frJ2.accumulatedLambda / (kLateral * kLateral));

    if (l > NormalImp)
    {
      float a = 
        (
          frJ1.accumulatedLambda * frJ1.accumulatedLambda / (kLong * kLong) + 
          frJ2.accumulatedLambda * frJ2.accumulatedLambda / (kLateral * kLateral)
        );

      float b = 
        -2.0f * 
        (
          frJ1.accumulatedLambda * frJ1.accumulatedLambda / (kLong * kLong) + 
          frJ2.accumulatedLambda * frJ2.accumulatedLambda / (kLateral * kLateral)
        );
      
      float c = 
        frJ1.accumulatedLambda * frJ1.accumulatedLambda / (kLong * kLong) + 
        frJ2.accumulatedLambda * frJ2.accumulatedLambda / (kLateral * kLateral) - 
        NormalImp * NormalImp;

      float d = sqrt(b * b - 4.0f * a * c);

      float x1 = (-b - d) / (2.0f * a);
      float x2 = (-b + d) / (2.0f * a);

 
      frJ1.accumulatedLambda -= frJ1.accumulatedLambda * x1;
      frJ2.accumulatedLambda -= frJ2.accumulatedLambda * x1;

      l1 -= frJ1.accumulatedLambda * x1;
      l2 -= frJ2.accumulatedLambda * x1;
      
    }

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

14 янв. 2019, 18:06 (Правка: 18:10)

#504

Я починил) Я не в том порядке прикладывал аккумулированные импульсы. Но теперь вышло так, что машина едет как по рельсам, силы трения огромные. Аккумулированные лямбды сил трения никогда доходят до ограничителя.

Буду думать где я на этот раз накосячил.

14 янв. 2019, 20:16

#505

vindast
> Но теперь вышло так, что машина едет как по рельсам, силы трения огромные
на самом деле, ограничить силу трения обычно гораздо проще, чем получить корректное бесконечное трение.

15 янв. 2019, 4:06

#506

Suslik
> чем получить корректное бесконечное трение.
Я не уверен что я это получил.

Я решил составить ограничитель как уравнение эллипса (N * k > 0):

x^2 / a ^ 2 + y ^ 2 / b ^ 2 = 1

Для изоморфного:

(l1 - l1 * x) ^ 2 / (N * k) ^ 2 + (l2 - l2* x) ^ 2 / (N * k) ^ 2 <= 1


В коде так ( варистатинг к обычным контактам не прокрутил пока что):

+ Показать

А для анизотропного:
(l1 - l1 * x) ^ 2 / (N * k1) ^ 2 + (l2 - l2* x) ^ 2 / (N * k2) ^ 2 <= 1

В коде так:

+ Показать

Не знаю правильный ли это подход, но очевидно что при N * k = 0 решать эти уравнения нет смысла. А при втором случае N * k = inf система решена корректно.

Что касается трения на колесах, оно как было огромным так и осталось.

15 янв. 2019, 18:46 (Правка: 19:11)

#507

Вот чего мне удалось добится. Машинка ведет себя стабильно, камера не дрожит. С силой трения мне разобраться так и не удалось. При попытке сделать пончик в конце это хорошо видно.

Suslik, посмотрите пожалуйста.



Диф пока полностью свободный.

Пост выше актуален.

17 янв. 2019, 16:27

#508

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

17 янв. 2019, 16:44

#509

Сделал как выше было.

      frJ1.accumulatedLambda += l1;
      frJ2.accumulatedLambda += l2;

      float x = 
        sqrt(
              frJ1.accumulatedLambda * frJ1.accumulatedLambda / kLong / kLong 
            + frJ2.accumulatedLambda * frJ2.accumulatedLambda / kLateral / kLateral
          );

      if (x > normalImp)
      {
        float c = normalImp / x;

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

        frJ1.accumulatedLambda *= c / kLong;
        frJ2.accumulatedLambda *= c / kLateral;

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

Все равно не то.
А могут ли быть проблемы от того что коэффициенты трения от кадра к кадру меняются? Может есть смысл не аккумулировать лямбду и импульс не применять?

17 янв. 2019, 19:55 (Правка: 19:56)

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