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

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

Страницы: 1 2 3 4 536 Следующая »
#30
13:22, 27 апр. 2018

vindast
> По идее вот эти три строчки и есть бол-сокет
>
> solveMove(car, weel, car->xVector, contactPos);
> solveMove(car, weel, car->yVector, contactPos);
> solveMove(car, weel, car->zVector, contactPos);

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


#31
13:24, 27 апр. 2018

мне нужна помощь зала.

#32
13:27, 27 апр. 2018

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

#33
13:49, 27 апр. 2018

vindast
> > solveMove(car, weel, car->xVector, contactPos);
> > solveMove(car, weel, car->yVector, contactPos);
> > solveMove(car, weel, car->zVector, contactPos);
> Разве не это бол-сокет?
оно станет бол-сокетом, когда ты угловую составляющую починишь

#34
15:29, 27 апр. 2018

Я не понимаю какое условие должно соблюдаться что бы тела были сцеплены в точке

#35
(Правка: 15:30) 15:30, 27 апр. 2018

физика в движках - это подгон

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

#36
(Правка: 15:35) 15:34, 27 апр. 2018

mega_otec
Хочешь помочь подогнать - помоги, хочешь поспорить дискретный ли мир - поспорь где нибудь еще.

#37
16:00, 27 апр. 2018

vindast
> Я не понимаю какое условие должно соблюдаться что бы тела были сцеплены в точке
относительная скорость в этой точке по трём осям должна быть равна нулю

#38
(Правка: 16:07) 16:04, 27 апр. 2018
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 - в мировой системе координат
Они разъезжаются все равно

#39
16:10, 27 апр. 2018

вот что я делаю не так

#40
16:15, 27 апр. 2018

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

#41
16:17, 27 апр. 2018
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;
       
  }

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

#42
(Правка: 16:23) 16:21, 27 апр. 2018

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

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

#43
(Правка: 16:54) 16:54, 27 апр. 2018

Suslik
> что значит "двигается наоборот"?

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

#44
(Правка: 16:57) 16:56, 27 апр. 2018

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

Страницы: 1 2 3 4 536 Следующая »
ПрограммированиеФорумФизика