Форум программистов, компьютерный форум, киберфорум
Наши страницы
Механика
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Nordicus666
2 / 2 / 0
Регистрация: 05.04.2016
Сообщений: 220
1

Нецентральное прикладывание импульса

01.02.2018, 11:10. Просмотров 1059. Ответов 108
Метки нет (Все метки)

здравствуйте снова, господа
Fulcrum, привет
новый вопрос, гугл на который не даёт ответов (только нецентральные столкновения шаров, т.е. без вращения), имеется какой нибудь объект, имеется точка (относительно его центра масс) в которую прикладываем импульс, есть импульс (вектор), как этот импульс раскладывается на скорость и на вращение объекта?
на текущий момент у меня работает так:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def applyImpulseAtPoint(self, impulse, point):
        if (not isinstance(impulse, Vector3f)):
            raise TypeError("Oops!");
        if (not isinstance(point, Vector3f)):
            raise TypeError("Oops!");
        pos = self.gameObject.getRealPosition();
        if ((point - pos).isZeroVector() or impulse.isCollinearTo(point - pos)):
            self.applyImpulse(impulse);
        else:
            forward = self.gameObject.forward();
            right = self.gameObject.right();
            up = self.gameObject.up();
 
            pointLocal = point - pos;
 
            pointX = pointLocal.projectOnFlat(forward);
            pointY = pointLocal.projectOnFlat(right);
            pointZ = pointLocal.projectOnFlat(up);
 
            impulseX = impulse.projectOnFlat(forward);
            impulseY = impulse.projectOnFlat(right);
            impulseZ = impulse.projectOnFlat(up);
 
            linearImpulse = impulse.projectOnVector(pointLocal);
            self.applyImpulse(linearImpulse);
 
            angularImpulseX = impulseX.projectOnVector(pointX.getNormalInFlatWith(impulseX));
            angularImpulseY = impulseY.projectOnVector(pointY.getNormalInFlatWith(impulseY));
            angularImpulseZ = impulseZ.projectOnVector(pointZ.getNormalInFlatWith(impulseZ));
 
            if (not pointX.isZeroVector()):
                self.angularVelocity.x += angularImpulseX.magnitude() / pointX.magnitude();
            if (not pointY.isZeroVector()):
                self.angularVelocity.y += angularImpulseY.magnitude() / pointY.magnitude();
            if (not pointZ.isZeroVector()):
                self.angularVelocity.z += angularImpulseZ.magnitude() / pointZ.magnitude();

в чём я застопорился: если приходящий импульс сразу раскладывать(проектировать) на радиус-вектор, что даст нам ту часть импульса, что влияет на объект линейно (т.е. на скорость), а так же на перпендикуляр к радиус-вектору (в плоскости с вектором импульса), что даст нам ту часть импульса, что влияет на вращение объекта в оси, перпендикулярной к радиус-вектору и перпендикуляру к радиус-вектору (т.е. векторное произведение), но это кватернион, а нужно в углах эйлера, следовательно нужны проекции импульса на три плоскости, нормалями которых являются три оси объекта, но если уже перпендикулярную радиус-вектору часть импульса спроектировать на плоскости, то проекции не будут перпендикулярны радиус-векторам в этих плоскостях и что делать с этим - не пойму, ибо если снова привести их в вид перпендикулярный радиус-векторам в плоскостях, то что делать с остатком импульсов в плоскостях? получается часть импульса теряется, а если с самого начала не раскладывать(проектировать) на радиус-вектор и его перпендикуляр, а сразу спроектировать на плоскости, а после работать уже в них, то тогда непонятно как обрабатывать три (по одному из каждой плоскости) части импульса, которые должны изменить скорость объекта, ибо если просто сложить их - получается много, взять среднее - мало, вот и непонятно что делать :c
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2018, 11:10
Ответы с готовыми решениями:

Сохранение импульса. Во сколько раз модуль импульса тела при броске больше модуля импульса в верхней точке траектории
Тело брошено под углом 60град. к горизонту со скоростью, модуль которой равен...

Найти приращение импульса тела и среднее значение импульса за время полета
Тело массой m бросили под углом к горизонту с начальной скоростью Vo. Спустя...

Нецентральное упругое столкновение шаров
Помогите пожалуйста с задачкой. Важен сам процесс решения...

Упругое нецентральное столкновение двух разных шаров
Имеются 2 абсолютно упругих без силы трения бла-бла шара разных диаметров и...

Момент импульса
Помогите решить задачку) Найти отношение моментов инерции однородного шара...

108
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
01.02.2018, 11:32 2
Nordicus666, привет
Цитата Сообщение от Nordicus666 Посмотреть сообщение
если приходящий импульс сразу раскладывать(проектировать)
Начнем с того что ничто никуда не раскладывается. Правило сложения нецентральных сил - сила параллельно переносится в центр масс с добавлением момента. Момент это векторное произведение силы на плече (радиус-ветор точки приложения). Дальше просто векторно суммируем все силы (одна сумма) и все моменты (вторая сумма). Ну а с учетом что импульс это сила умноженная на время приложения то они суммируются точно также. Получаем приращения импульса и момента вращения которые прибавляем соответственно к импульсу и моменту тела. Дальше импульс делим на массу, получаем скорость. Модуль момента делим на момент инерции относительно оси. Получаем угловую скорость.

Добавлено через 9 минут
Важный момент - с импульсами правило сложения нецентральных сил будет работать только пока поворот объекта за время приложения пренебрежимо мал - т.е. с мелким шагом по времени. Иначе будет нарушаться закон сохранения энергии.
0
Nordicus666
2 / 2 / 0
Регистрация: 05.04.2016
Сообщений: 220
01.02.2018, 11:39  [ТС] 3
про силы не понял к чему это тут, если я с ними не работаю в функции прикладывания импульса, т.е. там от времени вообще нет зависимости
а так я запутался уже где что, где силы, где моменты, где что складывать, где что умножать (понял только конец, где деление на массу и момент инерции (который я, походу, решил брать всё таки константным для универсальности проги, т.е. что б объект во вращении вокруг центра масс вёл себя как сфера), можете пошагово расписать или перефразировать? а я пошёл дальше долбить вики пока c:
0
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
01.02.2018, 11:41 4
Цитата Сообщение от Nordicus666 Посмотреть сообщение
про силы не понял к чему это тут
К тому что приращение импульса это произведение силы на время приложения(импульс силы). Вот импульсы приложенных сил мы и суммируем на самом деле, пользуясь допущением что изменение положения тела за время приложения пренебрежимо мало.
0
Nordicus666
2 / 2 / 0
Регистрация: 05.04.2016
Сообщений: 220
01.02.2018, 11:44  [ТС] 5
ну, это я знаю, только я при столкновении не силу ж прикладываю, а импульс, т.е. от времени не зависит у меня (как я уже понял, я что то делаю не так, но пока что хотя б с разбором вектора импульса надо разобраться)
0
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
01.02.2018, 11:54 6
Цитата Сообщение от Nordicus666 Посмотреть сообщение
можете пошагово расписать или перефразировать?
т.е. по порядку - у тела есть два свойства - импульс и момент вращения. У неподвижного тела оба равны 0. При взаимодействии они изменяются. С поступательной составляющей все просто - приложенные импульсы тупо векторно прибавляем к импульсу тела. С вращательной чуток сложнее - перед тем как прибавить к моменту тела векторно домножаем на радиус-вектор точки приложения относительно центра масс. Дальше вот этот импульс тела делим на массу получаем скорость. С угловой скоростью все чуток сложнее - ось вращения это вектор момента построенный из центра масс, угловая скорость - модуль момента поделенный на момент инерции относительно оси вращения. Все координаты в ГСК. Это в первом приближении.

Во втором (чтобы получить финты ушами в духе эффекта Джанибекова который со сферой не получится) придется учесть что получаемый момент вращения может быть разложен на оси по разному. (т.е угловые скорости изменяются и без взаимодействия с другими телами сохраняя при этом один и тот же суммарный момент вращения)
0
Nordicus666
2 / 2 / 0
Регистрация: 05.04.2016
Сообщений: 220
01.02.2018, 12:03  [ТС] 7
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Правило сложения нецентральных сил - сила параллельно переносится в центр масс с добавлением момента.
всё вроде дошло, только это не могу понять пока (что такое момент - знаю, уже в голове плотно эта статья из вики засела, не понимаю как и что переносить надо, что значит "с добавлением" и т.п.)

Добавлено через 2 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
С поступательной составляющей все просто - приложенные импульсы тупо векторно прибавляем к импульсу тела.
таки как получить эту "поступательную составляющую"?

Добавлено через 1 минуту
у меня изначально имеется только один вектор - импульс, который не лежит в прямой радиус-вектора, как из него получить поступательную составляющую? проектировать на радиус-вектор?
0
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
01.02.2018, 12:16 8
Цитата Сообщение от Nordicus666 Посмотреть сообщение
таки как получить эту "поступательную составляющую"?
Она уже есть - это приложенный импульс. просто добавляешь его к импульсу тела. ну для примеру возьмем рычажные весы которые подвесим центром на пружинные а на рычажные подвесим по телу одинаковой массы на оба конца. пружинные весы будут растянуты одинаково как не смещай тела по рычагам и как бы при при этом не был наклонен рычаг. Т.е. поступательная составляющая от точки приложения не зависит. Т.е. берешь приложенный импульс и просто прибавляешь к импульсу тела где бы он ни был приложен и как бы он ни был направлен.
Но вот если линия приложения не через центр масс проходит то при этом возникает момент вращения (вернее становится ненулевым). Который равен векторному произведению плеча на радиус-вектор точки приложения проведенный из центра масс. Вот это произведение и добавляем к моменту тела. Отдельно ловить проходит не проходит тоже не надо. Если проходит то векторное произведение равно нулю.

Добавлено через 5 минут
т.е. для каждого приложенного момента dP
C++
1
2
3
 P+=dP;
 L+=(ApplyPoint-MassCenter)%dP; // %- векторное умножение
// все координаты в ГСК.
0
Nordicus666
2 / 2 / 0
Регистрация: 05.04.2016
Сообщений: 220
01.02.2018, 13:25  [ТС] 9
1) я про вторую ситуацию и говорил изначально, первую даже не рассматриваю из за её банальности (потому видимо и не понял изначально вашего пред. сообщения)
2) а если я храню не момент тела, а его скорость в радианах вокруг глобальных осей координат (т.е. в эйлерах, получается), то каким образом мне полученный из импульса момент преобразовать в три угла? гугл вообще пустой на эту тему.. почему в гугле так мало на данные темы физики, только обобщённо есть и всё :c
0
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
01.02.2018, 13:29 10
Цитата Сообщение от Nordicus666 Посмотреть сообщение
то каким образом мне полученный из импульса момент преобразовать в три угла?
Хранить нужно именно вектор момента. Потому что он сохраняется а не угловые скорости. А скорости вычислять из момента.
0
Nordicus666
2 / 2 / 0
Регистрация: 05.04.2016
Сообщений: 220
01.02.2018, 13:32  [ТС] 11
ну ладно, изменить то тип хранимых данных быстро, ибо работы с ними ведётся не много, но вопрос за вычислением углов эйлера, до сих пор остаётся главным
0
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
01.02.2018, 13:42 12
Цитата Сообщение от Nordicus666 Посмотреть сообщение
но вопрос за вычислением углов эйлера, до сих пор остаётся главным
Угловые скорости по осям могут изменяться даже без взаимодействия с другими телами. в том то и дело.
0
Nordicus666
2 / 2 / 0
Регистрация: 05.04.2016
Сообщений: 220
01.02.2018, 13:48  [ТС] 13
ну фиг его знает, в том же юнити (проверил только что) если задаёшь угловую скорость - она постоянна (до столкновения и если поставить angularDrag (пассивное гашение вращения) на 0)(она в гск и в углах эйлера там хранится, если что)
0
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
01.02.2018, 13:52 14
Цитата Сообщение от Nordicus666 Посмотреть сообщение
ну фиг его знает, в том же юнити (проверил только что) если задаёшь угловую скорость - она постоянна (до столкновения и если поставить angularDrag (пассивное гашение вращения) на 0)(она в гск и в углах эйлера там хранится, если что)
Ну юнити не есть физически реальный движок.
https://ru.wikipedia.org/wiki/%D0%AD...BE%D0%B2%D0%B0
В любом случае при взаимодействии нужно суммировать моменты а не угловые скорости а уже из моментов получать скорости.
0
Nordicus666
2 / 2 / 0
Регистрация: 05.04.2016
Сообщений: 220
01.02.2018, 15:18  [ТС] 15
я и не претендую на реалистичность, что б тот же эффект джанибекова соблюдался (не особо хочу сейчас углубляться в эту тему), но вопрос в вычислении линейного импульса из изначального, а так же вычислении углов эйлера (либо же, если вообще их обходить и хранить угловую скорость в моменте импульса (он же аксиальный вектор, как мне кажется, его направление - ось, а его длина - скорость вращения) то её надо тогда как то преобразовывать либо в углы эйлера либо в кватернион и воздействовать уже на скорость, потому ни на один из вопросов ответ ещё не получен, ни каким образом из импульса получить линейную его часть, ни каким образом из импульса получить скорость объекта в углах эйлера

Добавлено через 13 минут
если что я имел ввиду, что мне не обязательно что б соблюдался эффект (а то сейчас перечитал своё сообщение и выглядит так, как будто мне надо, что б соблюдался эффект джанибекова)
0
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
01.02.2018, 15:30 16
Цитата Сообщение от Nordicus666 Посмотреть сообщение
либо в кватернион и воздействовать уже на скорость
Ну можно в кватернион. Направление кватерниона и есть вектор момента. угловая скорость - она же угол кватерниона это модуль вектора момента поделенный на момент импульса. Угол умножаешь на время. На этот кватернион каждый кадр домножаешь кватернион ориентации тела.
В углы эйлера чуток сложнее. Во первых определится относительно каких осей - локальных или глобальных будешь скорости считать. Берешь раскладку момента на оси (для ГСК это просто кооординаты вектора момента, для ЛСК - скалярные произведения вектора момента с векторами осей. ) Потом делишь на моменты инерции относительно этих осей. Вот тебе и угловые скорости в углах Эйлера. Их тоже на время домножаешь. Вообще теорема Эйлера доказывает что сумму вращений вокруг разных осей можно представить как вращение вокруг одной оси (ну в общем кватерниона). На самом деле эйлеровы углы это тоже 3 кватерниона. просто оси в записи опускают - это оси ГСК.
0
Nordicus666
2 / 2 / 0
Регистрация: 05.04.2016
Сообщений: 220
01.02.2018, 15:34  [ТС] 17
да это и так понятно(что углы эйлера это три кватерниона), просто получается всё таки надо проектировать на плоскости, перпендикулярные осям ГСК? (да, угловая скорость, по юнити, в углах эйлера в ГСК)
0
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
01.02.2018, 16:02 18
Цитата Сообщение от Nordicus666 Посмотреть сообщение
просто получается всё таки надо проектировать на плоскости,
Оно и так в ГСК. Т.е. координаты вектора момента - это его проекции на оси ГСК. Вот эти координаты и делишь на моменты инерции относительно осей параллельных ГСК проходящих через центр масс. А проецировать на оси ГСК
нужно эллипсоид энерции. Кстати если так скорости из момента пересчитывать кажый кадр вырисуется и эффект Джанибекова по идее, его причина в том что при повороте проекции эллипсоида энерции на оси ГСК меняется, а соответственно и угловые скорости.
При плавающем (замеряемом) шаге по времени кватернионы кстати удобнее. Меньше пересчета при умножении угловой скорости на время чем при генерации матрицы поворота по углам Эйлера.
0
Nordicus666
2 / 2 / 0
Регистрация: 05.04.2016
Сообщений: 220
01.02.2018, 16:10  [ТС] 19
хм, получается X-компонента момента импульса делить на момент инерции это и есть угловая скорость вокруг оси Х?
0
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
01.02.2018, 16:13 20
Цитата Сообщение от Nordicus666 Посмотреть сообщение
хм, получается X-компонента момента импульса делить на момент инерции это и есть угловая скорость вокруг оси Х?
Да. Только делить на момент инерции относительно оси параллельной ГСК и проходящей через центр масс. А он зависит от поворота тела - эллипсоид энерции вместе с телом вертится.
0
01.02.2018, 16:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2018, 16:13

Определение импульса
Шарик массо

Изменение импульса
Шар брошен в сторону горизона, под углом 60 градусов с начальной скоростью 20...

Определение импульса
Шарик массой 0.3 кг ударился о стенку и отскочил от нее. Определить импульс р1,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru