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

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

Страницы: 118 19 20 2137 Следующая »
#270
19:42, 16 сен. 2018

vindast
я тебе уже говорил, что этот написан нормально, по крайней мере в первом приближении.


#271
19:56, 16 сен. 2018

Suslik, Вы просто иногда так пишете, что не ясно что имеете в виду: "норм" или "иди ищи ошибку и переделывай".

Есть такая подзадачка.

В коробке передач есть два вала, один уходит на двигатель и сцепление, второй на раздатку / редуктор. (пока ни раздатки, ни редуктора нет).
Проблема в том, что оба этих вала в общем случае вращаются с  разными скоростями (в зависимости от коэффициента, w1  = k * w2), либо разомкнуты.

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

gearbox->angularVelocity  - это скорость вращения вала со стороны двигателя (который идет на сцепление),
соответственно, gearbox->angularVelocity / gearbox->getGearRatio() - это скорость со стороны второго выхода коробки.

struct WheelGearBoxJoint
{
  TCarGearBox* gearbox;
  TInertialBody* weel;

  inline void solve()
  {
    a = weel->angularVelocity - gearbox->angularVelocity / gearbox->getGearRatio();
    b = weel->invInertia + gearbox->invInertia;

    l = -a / b;

    weel->angularVelocity += l * weel->invInertia;
    gearbox->angularVelocity -= l * gearbox->invInertia / gearbox->getGearRatio();
  }

private:
  float a, b, l;
};


Как такую штуку лучше всего сделать? Этот вариант работает хорошо, но есть вопрос с тем, как именно распределять вращающий момент на колеса.

#272
(Правка: 20:14) 20:03, 16 сен. 2018

vindast
> Как такую штуку лучше всего сделать? Этот вариант работает хорошо, но есть
> вопрос с тем, как именно распределять вращающий момент на колеса.
нет, неправильно. исходи из формулы ограничения:
[cht]jv = c[/cht]
в твоём случае джойнт связывает только две угловые скорости, поэтому:
[cht](1, -\alpha)(\omega_0, \omega_1)^T=0[/cht], где [cht]\alpha[/cht] — передаточное число.
далее [cht]v(t+\delta t)=v(t)+Mj^T \delta \lambda[/cht], где [cht]M[/cht] — матрица масc, то есть в твоём случае — обратные моменты инерции. далее если подставить, получается:
[cht]jMj^T\lambda = -jv(t)[/cht], то есть [cht]a=-jv(t)[/cht], [cht]b=jMj^T[/cht]

точно так же получаются все остальные джойнты.

но это на самом деле — тоже плохо, потому что в таком виде всё равно не сохраняется закон сохранения момента импульса, потому что на самом деле якобиан редуктора коробки передач — это вовсе не [cht]\omega_0 = \alpha \omega_1[/cht], а что-то в духе [cht](\omega_0 - \omega_b)=\alpha(\omega_1 - \omega_b)[/cht], где [cht]\omega_b[/cht] — угловая скорость вращения корпуса редуктора, то есть такой джойнт на самом деле соединяет три тела, а не два.

короче, чтобы расписать любой джойнт, первое, что нужно сделать — расписать ситуацию, когда он "разрешён", то есть когда в нём не возникают никакие напряжения. то есть в случае с колесом, например, это случай, когда точка контакта корпуса с землёй движется в направлении, куда смотрит колесо и со скоростью, равной скорости его вращения. это будет выражение вида f(v) = 0. далее это выражение нужно линеаризовать, представив в виде jv = c. получив якобиан j, далее вообще код решения всех джойнтов одинаковый. разница на самом деле будет только в нелинейной части ограничения джойнтов, как, например, трение не может быть больше порогового значения, но такие ограничения нужно вводить уже после этого, когда джойнт без ограничений работает.

#273
(Правка: 1:19) 1:10, 17 сен. 2018

Suslik
Стоп, коробка работает как:
W1 - это скорость вращения со стороны двигателя.
W2 - это скорость вращения со стороны колес, или же W1 / a, там не умножение а деление оборотов.
Она дает выигрыш в моменте, за счет оборотов.

Или я что то путаю?
vindast
> w1  = k * w2
Я тут Вас ввел в заблуждение.

В любом случае стоит коробку разделить на два тела, соответственно два вала, и джоинт.

upd
b не правильно посчитан

#274
(Правка: 3:03) 2:15, 17 сен. 2018

Suslik, а у Вас точно b правильный?

По тому что M * transpoze(j) это матрица 1 * 1.

j = {1, - k}
v = {w1, w2}
M = {m1, m2}

А = -j * transpoze(v) ={-1 * w1 + k * w2}

А вот B:

B = j * M  * transpoze(j)={1; -k} * {m1;m2} * traspoze(1; - k) = {1; -k} * {m1 - k * m2}

Если предположить что это число {m1 - k * m2}, то тогда остается l (Число) = A (число) / (матрица 2 *1)
Но матрица 1 * 1 это тоже матрица, и тогда там работает операция умножения матриц...

#275
4:48, 17 сен. 2018

vindast
> B = j * M  * transpoze(j)={1; -k} * {m1;m2} * traspoze(1; - k)
M — диагональная матрица

#276
5:44, 17 сен. 2018

b = m1 + k * k * m2


k = 1.0f / gearbox->getGearRatio()

inline void solve()
  {
    a = weel->angularVelocity - gearbox->angularVelocity / gearbox->getGearRatio();
    b = weel->invInertia + gearbox->invInertia / gearbox->getGearRatio() / gearbox->getGearRatio();

    l = -a / b;

    weel->angularVelocity += l * weel->invInertia;
    gearbox->angularVelocity -= l * gearbox->invInertia / gearbox->getGearRatio() / gearbox->getGearRatio();
  }

Верно?

#277
(Правка: 6:05) 6:04, 17 сен. 2018

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

и, ещё раз повторяю, чтобы проверить джойнт, просто после решения проверь, что его условие [cht]jv = c[/cht] выполняется точно из произвольных начальных данных.

#278
(Правка: 6:49) 6:33, 17 сен. 2018

Я сейчас все пересчитал, и все верно.

a = -j * v = |-1, k| * transpoze(|w1, w2|) = k * w2 - w1 или если вынести минус = w1 - w2 * k

a = weel->angularVelocity - gearbox->angularVelocity / gearbox->getGearRatio();

b = |1; -k| * |m1  ;  0 |  * transpoze(|1, -k|) = m1 + k^2 * m2
                  |  0 ; m2|

b = weel->invInertia + gearbox->invInertia / gearbox->getGearRatio() / gearbox->getGearRatio();

l = a / b или с выносом знака: l = - a / b

l = -a / b;

Часть импульса равная weel->invInertia уходит колесу, а часть равная gearbox->invInertia / gearbox->getGearRatio() / gearbox->getGearRatio() уходит коробке.

Что не так? Объясните. Результат очень похож на истинный, по крайней мере, выглядит очень похоже (опять же ).
Про якобиан только от Вас в первый раз услышал.

И условие j * v = 0 выполняется.

#279
7:23, 17 сен. 2018

vindast
> И условие j * v = 0 выполняется.
значит, плохо проверял

#280
16:34, 17 сен. 2018

Suslik, я поспал и перепроверил.
Лямбда верно посчитана. А вот импульсы не верно применяются.

#281
17:19, 17 сен. 2018

Я все пересчитал, а и б верно было посчитано.

M * transpoze(j) = transpoze(m1, -k * m2)

То есть:

    weel->angularVelocity += l * weel->invInertia;
    gearbox->angularVelocity -= l * gearbox->invInertia / gearbox->getGearRatio();

Но тогда все равно не выполняется условие.

Я не понимаю где я ошибся, а как построить якобиан я пока не разобрался.

#282
(Правка: 18:17) 18:14, 17 сен. 2018

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

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

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

PS ты в школе учишься или в институте?

#283
18:22, 17 сен. 2018

Suslik
> институте?
Я бросил институт после двух курсов)
Неужели я настолько тупой )

#284
(Правка: 18:39) 18:38, 17 сен. 2018

Suslik
> ещё все формулы с якобианом, которые я выписывал выше, предполагают, что у тебя
> угловые скорости — скаляр. если у тебя угловые скорости векторные, то формулы
> надо выписывать в проекции на ось коробки передач и делать дополнительные
> джойнты, обеспечивающие соосность.
Там все скаляры (для упрощения как раз и были введены эти тела тела).

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