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

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

Страницы: 1 2 3 4 514 Следующая »
vindastПостоялецwww27 апр. 201813:22#30
vindast
> По идее вот эти три строчки и есть бол-сокет
>
> solveMove(car, weel, car->xVector, contactPos);
> solveMove(car, weel, car->yVector, contactPos);
> solveMove(car, weel, car->zVector, contactPos);

Разве не это бол-сокет?
Или я что-то не так понимаю?

vindastПостоялецwww27 апр. 201813:24#31
мне нужна помощь зала.
vindastПостоялецwww27 апр. 201813:27#32
Ну ок, это не бол - сокет, сейчас это заставляет тела иметь одинаковые линейные скорости.
Ок, это я осознал еще вчера.
SuslikМодераторwww27 апр. 201813:49#33
vindast
> > solveMove(car, weel, car->xVector, contactPos);
> > solveMove(car, weel, car->yVector, contactPos);
> > solveMove(car, weel, car->zVector, contactPos);
> Разве не это бол-сокет?
оно станет бол-сокетом, когда ты угловую составляющую починишь
vindastПостоялецwww27 апр. 201815:29#34
Я не понимаю какое условие должно соблюдаться что бы тела были сцеплены в точке
mega_otecУчастникwww27 апр. 201815:30#35
физика в движках - это подгон

вы что реально считаете, что природа итерирует?

Правка: 27 апр. 2018 15:30

vindastПостоялецwww27 апр. 201815:34#36
mega_otec
Хочешь помочь подогнать - помоги, хочешь поспорить дискретный ли мир - поспорь где нибудь еще.

Правка: 27 апр. 2018 15:35

SuslikМодераторwww27 апр. 201816:00#37
vindast
> Я не понимаю какое условие должно соблюдаться что бы тела были сцеплены в точке
относительная скорость в этой точке по трём осям должна быть равна нулю
vindastПостоялецwww27 апр. 201816:04#38
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 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);
  }
contactPos - в мировой системе координат
Они разъезжаются все равно

Правка: 27 апр. 2018 16:07

vindastПостоялецwww27 апр. 201816:10#39
вот что я делаю не так
vindastПостоялецwww27 апр. 201816:15#40
Suslik
> относительная скорость в этой точке по трём осям должна быть равна нулю
По сути это тот же случай что и в туторе https://gamedev.ru/code/articles/?id=4706#warmstarting__goryachiy_start_
тот тут лямбда должна быть равна нулю всегда.
vindastПостоялецwww27 апр. 201816:17#41
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;
       
  }

Я ничего не понимаю, все двигается наоборот...

SuslikМодераторwww27 апр. 201816:21#42
vindast
> Я ничего не понимаю, все двигается наоборот...
что значит "двигается наоборот"? я не помню, какой знак при cross product должен быть, попробуй поменять. чему равен pos у джойнта, ты уверен, что он корректно следует за позицией точки соединения?

vindast
> По сути это тот же случай что и в туторе
> https://gamedev.ru/code/articles/?id=4706#warmstarting__goryachiy_start_
> тот тут лямбда должна быть равна нулю всегда.
нет. вообще забудь про warmstarting и псевдоимпульсы. всё это добавляется потом, когда всё и без них работает хоть как-то.

Правка: 27 апр. 2018 16:23

vindastПостоялецwww27 апр. 201816:54#43
Suslik
> что значит "двигается наоборот"?

На видео, точки контакта там отмечены как 3 красные линии.

Правка: 27 апр. 2018 16:54

vindastПостоялецwww27 апр. 201816:56#44
Suslik
> нет. вообще забудь про warmstarting и псевдоимпульсы. всё это добавляется
> потом, когда всё и без них работает хоть как-то.
Криво ссылку дал, там у Вас разбирается случай соударения, так вот тут по сути это то же соударение с 3 нормалями ( базис ортогональный) с точкой где это дело лежит.
Только лямбду надо всегда применять. Вроде сделал правильно, но все равно чушь какая то.

Правка: 27 апр. 2018 16:57

Страницы: 1 2 3 4 514 Следующая »

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

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