Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Помогите написать физический движок :) (4 стр)

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

Страницы: 13 4 5 614 Следующая »
vindastПостоялецwww27 апр. 201817:38#45
void solveMove(TRigidBody* body1, TRigidBody* body2, vec3 axis, vec3 pos)
  { 
 
    vec3 n1 = axis;
    vec3 w1 = cross(-axis, pos - body1->_pos);
    vec3 n2 = -axis;
    vec3 w2 = cross(-axis, pos - body2->_pos);

    float l = getLambda(body1, n1, w1, body2, n2, w2);

    body1->linearVelosity += n1 * l * body1->invMass;
    body2->linearVelosity += n2 * l * body2->invMass;

    body1->angularVelosity += w1 * l * body1->invInertia;
    body2->angularVelosity += w2 * l * body2->invInertia;
       
  }


Поменял знак у первого cross-а, работает,  только не могу теперь понять почему должно быть именно так.

Правка: 27 апр. 2018 17:40

vindastПостоялецwww27 апр. 201818:26#46
Suslik
Смотрите:
void solveMove(TRigidBody* body1, TRigidBody* body2, vec3 axis, vec3 pos)
  { 
 
    vec3 n1 = axis;
    vec3 w1 = cross(-axis, pos - body1->_pos);
    vec3 n2 = -axis;
    vec3 w2 = cross(-axis, pos - body2->_pos);

    float l = getLambda(body1, n1, w1, body2, n2, w2);

    body1->linearVelosity += n1 * l * body1->invMass;
    body2->linearVelosity += n2 * l * body2->invMass;

    body1->angularVelosity += w1 * l * body1->invInertia;
    body2->angularVelosity += w2 * l * body2->invInertia;
       
  }

  void solveRotation(TRigidBody* body1, TRigidBody* body2, vec3 axis)
  {
 
    vec3 n1 = vec3(0);
    vec3 w1 = axis;
    vec3 n2 = vec3(0);
    vec3 w2 = -axis;  

    float l = getLambda(body1, n1, w1, body2, n2, w2);


    body1->angularVelosity += w1 * l * body1->invInertia;
    body2->angularVelosity += w2 * l * body2->invInertia;



  }

  void constJoint(TCar* car, TRigidBody* weel, float dT, vec3 contactPos)
  {
    //запрещаем двигаться колесу и машине друг относительно друго по всем трем осям машины
    solveMove(car, weel, vec3(1, 0, 0), contactPos);
    solveMove(car, weel, vec3(0, 1, 0), contactPos);
    solveMove(car, weel, vec3(0, 0, 1), contactPos);
    
    //Запрещаем вращаться колесу и машине друг относительно друга по всем трем осям машины
    solveRotation(car, weel, car->yVector);
    solveRotation(car, weel, car->xVector);
    solveRotation(car, weel, car->zVector);
  }

Сейчас это получается правильный const-джоинт?

И что бы получить из него Hinge joint разрешающий вращение по оси car->xVector досточно закоментить solveRotation(car, weel, car->xVector)? Так?

SuslikМодераторwww28 апр. 20182:00#47
vindast
> Поменял знак у первого cross-а, работает,  только не могу теперь понять почему
> должно быть именно так.
со знаками в cross product'ах вообще дело ясное, что дело тёмное. они зависят от ориентации системы координат. короче, лень расписывать, но вектора угловых скоростей, моментов, и тому подобных углоподобных величин — это на самом деле псевдовекторы и их направления ты выбираешь произвольно. а вот после векторного произведения псевдовектора на реальный вектор ты получаешь реальный вектор, у которого направление строго фиксировано. но умножить надо в правильном порядке.

vindast
> И что бы получить из него Hinge joint разрешающий вращение по оси car->xVector
> досточно закоментить solveRotation(car, weel, car->xVector)? Так?
теоретически — да. практически — я понятия нету, нет ли у тебя там других багов, без видео.

vindastПостоялецwww28 апр. 201810:55#48
Suslik
> теоретически — да. практически — я понятия нету, нет ли у тебя там других
> багов, без видео.
Воодушевляет.
vindastПостоялецwww28 апр. 201812:13#49
Спустя 4 страницы темы можно вернуться к ее вопросу.
Как мне подсчитать вес с которым давит машина на колесо?
[img=машинка | Помогите написать физический движок :)]
vindastПостоялецwww28 апр. 201820:30#50
Попытка сделать петельное соединение.
Разъезжается очень быстро.

vindastПостоялецwww28 апр. 201820:32#51
Пора юзать псевдоскорости?
vindastПостоялецwww28 апр. 201820:32#52
или я просто криво сделал?
lookidПостоялецwww28 апр. 201820:37#53
может лучше заголишь норм raycast vehicle, не?
vindastПостоялецwww28 апр. 201820:40#54
lookid
там рейкаст колеса
или я что то пропустил?
SuslikМодераторwww29 апр. 20183:14#55
vindast
> Пора юзать псевдоскорости?
да, уже можно. ещё у тебя моменты инерции для колёс и промежуточных тел выглядят как-то рандомновато и количество итераций солвера недостаточное. делай итераций 30 хотя бы для такого случая.

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

Правка: 29 апр. 2018 3:16

vindastПостоялецwww29 апр. 201814:33#56
Suslik
> делай итераций 30 хотя бы для такого случая.
Сделал. Все равно пока расходится, буду курить псевдоимпульсы.

Suslik
> 1) на жёстких джойнтах делаю жёсткие ограничения: колесо может вращаться только
> вокруг своей оси, подвеска может ходить только вертикально, итп
Вот там человек про рейкаст говорил, вот по сути машинка из соседнего треда была рейкастовой. 
Вот сейчас упоролся на джоинты что бы сделать макферсон.
Допустим решу проблемы с этими джоинтами (надо только починить разхождение джоинтов и сделать еще цилиндрический джоинт), вот все равно останется вопрос как работать с силами в такой системе.  Хочется добиться того что бы ни машина ни колесо ни элементы подвески не знали друг о друге, а знали только то какие к ним джоинты присоединены.  И вот хоть убей, не понимаю как передавать силы (особенно вес) через такие структуры (без вставки костылей).
Suslik
> 2) на мягких соединениях, просто прикладывая ускорения к телам, делаю все
> эластичные силы вроде упругости и демпинга в амортизаторах и рессорах
Мягкие это вообще как? Я планировал сделать аморт из двух тел, связанных через цилиндрический джоинт, и передавать вдоль оси силы (каким-то образом).

Правка: 29 апр. 2018 14:34

vindastПостоялецwww29 апр. 201814:35#57
Suslik
> у тебя моменты инерции для колёс и промежуточных тел выглядят как-то
> рандомновато
Это так, почти на бум сделано.
Допустим подсчитать моменты отсносительно трех осей тела (x-y-z векторов реально), а вот что делать с солвером где фигурирует число не понятно.
vindastПостоялецwww29 апр. 201814:43#58
Да и ось по сути в общем случае произвольная.
vindastПостоялецwww29 апр. 201815:49#59


Suslik
А если считать систему как матричную то париться о сходимости не нужно будет?

Страницы: 13 4 5 614 Следующая »

/ Форум / Программирование игр / Физика

2001—2018 © GameDev.ru — Разработка игр