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

Box2d Вращение кузова под действием вращения колес

Страницы: 1 2 Следующая »
#0
19:34, 18 фев. 2018

Имеется авто на двух колесах, соединения b2WheelJoint* b2j_w[]

Управление приводом:

первый вариант
b2j_w[1]->SetMotorSpeed(goLeft * -speed + goRight * speed);  // первое колесо
b2j_w[2]->SetMotorSpeed(goLeft * -speed + goRight * speed);  // второе колесо

второй вариант через вращение тел

b2b_w[1]->SetAngularVelocity(goLeft * -speed + goRight * speed);
b2b_w[2]->SetAngularVelocity(goLeft * -speed + goRight * speed);


Когда мы едем то вращение соединений закручивает кузов.... если управлять вращением тел то закручивает в другую сторону..
Но в любом случае влияет на кузов... Уменьшение массы особо не помогает тем более с мелкой массой соединения ведут себя не адекватно..

Пытался управлять через кузов - body_0->SetAngularVelocity(0.0f); в зависимости от того оторваны от земли колеса или нет... и соответственно в воздухе блокировать вращение кузова если оба колеса в воздухе но это не совсем удобно так как в реале машина будет клевать носом из-за тяжелого двигателя..

Кто то сталкивался с таким и как это решить?


#1
23:07, 18 фев. 2018

Можеш не круртить колёса, а просто толкать машинку applyImpuls(direction) !

Или просто отклучи вращения тела кузова в b2WheelJoint , то бишь пусть колеса прокручивються на кузове , то есть motoSpeed должен вращять только колеса , а не кузов !

#2
1:31, 19 фев. 2018

NSX
вообще-то по закону сохранения момента импульса кузов вполне себе должен закручиваться в обратную сторону от колёс. если хочется уменьшить этот эффект, уменьшай момент инерции колёс, а не их массу.

#3
8:35, 19 фев. 2018

На двух колёсах?

На двух колёсах и должно крутиться, это врождённое уродство схемы.

Помнится, я в молодости собрал двухколёсного робота, пришурупив грампластинки к колёсам движка от "лунохода". Эта шайтан-арба носилась, как электрический веник, но имела тенденцию прокручиваться: сам механизм крутился на оси если она упиралась во что-нибудь.

#4
17:01, 19 фев. 2018

werasaimon
А в виде кода можно? )))

что отключить как??
box2dset | Box2d Вращение кузова под действием вращения колес

ничего интересного с джойном не сделать.

то есть motoSpeed должен вращять только колеса , а не кузов !

Так в этом и вопрос данного топика - "КАК это сделать! ??"

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

#5
17:13, 19 фев. 2018

NSX
> В реальной жизни колеса настолько малы по отношению к весу авто, что не
> закручивают всю машину..... А вот подобрать адекватное сооотношение массы тел
> не получается....
масса здесь не играет прямой роли. как я уже говорил, на этот эффект влияет только момент инерции колёс по отношению к моменту инерции кузова.

#6
17:30, 19 фев. 2018

Suslik
Вы не совсем правы....
Ваше утверждение верно если я буду делать так:

второй вариант через вращение тел

b2b_w[1]->SetAngularVelocity(goLeft * -speed + goRight * speed);
b2b_w[2]->SetAngularVelocity(goLeft * -speed + goRight * speed);

То-есть чисто крутить тела... и тут действительно влияет момент энерции... Который я не могу побороть... о чем и прошу в данной теме...помощи.

Если я использую МОТОР:

первый вариант
b2j_w[1]->SetMotorSpeed(goLeft * -speed + goRight * speed);  // первое колесо
b2j_w[2]->SetMotorSpeed(goLeft * -speed + goRight * speed);  // второе колесо

тогда даже если я зажму ручник и запрещу смену угла:

b2b_w[1]->SetFixedRotation(stay); //если ручник фигсикуем ротацию stay=1
b2b_w[2]->SetFixedRotation(stay);

то если я буду при этом использовать мотор и задавать скорость то кузов все равно будет ВРАЩАТЬСЯ под действием призматического соединения.. в колесе... (как мне кажется)
смотрите GIF
https://wmpics.pics/di-7WOO.gif

Массу кузова задал 10, массу колес по 1 в данном примере.

#7
17:40, 19 фев. 2018

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

#8
20:47, 19 фев. 2018

Слушай werasaimon, не слушай Suslik. Suslik не шарит.

#9
21:45, 19 фев. 2018

NSX
Я не шарю как там в  Box2D ,я больше по Bullet .!
  Вот заглянул в исходник Box2D , и , вот кусок кода из b2WheelJoint который  задаёт реактивный  момент вращения

// Solve rotational motor constraint
  {
    float32 Cdot = wB - wA - m_motorSpeed;
    float32 impulse = -m_motorMass * Cdot;

    float32 oldImpulse = m_motorImpulse;
    float32 maxImpulse = data.step.dt * m_maxMotorTorque;
    m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse);
    impulse = m_motorImpulse - oldImpulse;

    wA -= iA * impulse;
    wB += iB * impulse;
  }

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

public:
bool isValidMomentumA;
bool isValidMomentumB;

---------
// Solve rotational motor constraint
  {
    float32 Cdot = wB - wA - m_motorSpeed;
    float32 impulse = -m_motorMass * Cdot;

    float32 oldImpulse = m_motorImpulse;
    float32 maxImpulse = data.step.dt * m_maxMotorTorque;
    m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse);
    impulse = m_motorImpulse - oldImpulse;

    if(isValidMomentumA) wA -= iA * impulse;
    if(isValidMomentumB) wB += iB * impulse;
  }
Если myWheelJoint.isValidMomentumB == false , то тело B не вращаеться вокруг оси , а если myWheelJoint. isValidMomentumA == false то тело A не вращается вокруг оси  .и.т.д !
  Но это не правильно с точки зрения физики, так что лутше сделай так как говорит
Suslik , и увеличь момент инерции кузова .
Просто сделай кузов немного длинней , это увеличит его момент инерции!
#10
21:57, 19 фев. 2018

werasaimon
Спасибо!

#11
2:09, 20 фев. 2018

NSX
> то если я буду при этом использовать мотор и задавать скорость то кузов все
> равно будет ВРАЩАТЬСЯ под действием призматического соединения.. в колесе...
> (как мне кажется)
> смотрите GIF
> https://wmpics.pics/di-7WOO.gif
>
> Массу кузова задал 10, массу колес по 1 в данном примере.
если честно, у тебя в гифе вообще всё выглядит физично и правильно. я не знаю, что ты пытаешься поменять, но, скорее всего, как это обычно бывает, ты пытаешься подстроить систему под своё интуитивное ожидание, которое неверно. кузов должен закручиваться с ровно тем же самым моментом, с которым ты крутишь колёса. момент инерции колёс и кузова посчитаны, судя по всему, автоматически, следовательно, правильно. я ещё раз повторяю — если ты хочешь уменьшить этот эффект, то надо уменьшать момент инерции колёс, оставляя массу постоянной.

почему в жизни автомобили себя так не ведут?
- потому что в жизни у автомобилей момент инерции колёс ещё в 10 раз меньше относительно момента инерции кузова.
- потому что в жизни гравитация гораздо больше.
- потому что в жизни центр масс кузова гораздо ниже.

на monster truck'ах такой эффект ещё как сильно появляется и машину может перевернуть просто на ровной дороге, потому что 1 и 3 условия не выполняются. из-за того же самого эффекта мощные двигатели при ускорении поворачивают кузов вокруг оси коленвала, то есть в горизонтальной плоскости: https://www.youtube.com/watch?v=lMR2SGM8KZs&t=75

#12
4:57, 20 фев. 2018

Suslik
=) ок ок

#13
21:38, 20 фев. 2018

NSX
У тебя когда машынка будет резко стартовать то онна не поднимет капот , так как это бывает в реальной жызни . А тебе важна реалистичность физики или нет ?

#14
7:45, 21 фев. 2018

Лучше бы посоветовали ему учебник по физике

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

Тема в архиве.