Russian Qt Forum
Ноябрь 26, 2024, 04:24
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
Алгоритмы
>
Пружина
Страниц: [
1
]
2
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Пружина (Прочитано 22280 раз)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Пружина
«
:
Октябрь 08, 2015, 16:35 »
Добрый день
Есть объект закрепленный в нижней точке. Под действием какой-то силы F (точка ее приложения известна, вверху) движок поворачивает объект (отклоняет от исходного положения). Известно все что угодно:
- текущая линейная и угловая скорости
- текущая сила и текущий момент вращения
- текущие и начальные положения
- масса, точка крепления, точка приложения силы
Нужно: симитировать поведение пружины, (изменив силу и/или момент вращения) т.е. объект поворачивается до какого-то предела, пружина не дает дальше. А если сила перестала действовать, то объект должен вернуться в исходное состояние, возможно с какими-то "пере-колебаниями". Пользователь задает жесткость пружины и насколько быстро затухают пере-колебания. Задавать еще какие-то параметры можно.
Начал делать по аналогии с маятником - не выходит. Объект или вообще проворачивается (если жесткость мала) или сразу же возникают пере-колебания (хотя силу никто не убирал) которые никогда не затухают.
Спасибо
[OFF]Народная примета: когда нужен научный работник - его никогда нет. Сидит играется в дустовские макросы
[/OFF]
«
Последнее редактирование: Октябрь 08, 2015, 16:38 от Igors
»
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Пружина
«
Ответ #1 :
Октябрь 08, 2015, 17:12 »
Цитировать
Начал делать по аналогии с маятником - не выходит. Объект или вообще проворачивается (если жесткость мала) или сразу же возникают пере-колебания (хотя силу никто не убирал) которые никогда не затухают.
Возьмите 4 пружины с затуханием b (
F
= -k(
r
-
r
0) - b*
v
) (
v
- скорость) и привяжите их одним концом к какой либо точке на вершине тела, а другими к плоскости.
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
AzazelloAV
Гость
Re: Пружина
«
Ответ #2 :
Октябрь 08, 2015, 20:28 »
Цитата: Igors от Октябрь 08, 2015, 16:35
Добрый день
Есть объект закрепленный в нижней точке. Под действием какой-то силы F (точка ее приложения известна, вверху) движок поворачивает объект (отклоняет от исходного положения). Известно все что угодно:
- текущая линейная и угловая скорости
- текущая сила и текущий момент вращения
- текущие и начальные положения
- масса, точка крепления, точка приложения силы
Нужно: симитировать поведение пружины, (изменив силу и/или момент вращения) т.е. объект поворачивается до какого-то предела, пружина не дает дальше. А если сила перестала действовать, то объект должен вернуться в исходное состояние, возможно с какими-то "пере-колебаниями". Пользователь задает жесткость пружины и насколько быстро затухают пере-колебания. Задавать еще какие-то параметры можно.
Начал делать по аналогии с маятником - не выходит. Объект или вообще проворачивается (если жесткость мала) или сразу же возникают пере-колебания (хотя силу никто не убирал) которые никогда не затухают.
Спасибо
[OFF]Народная примета: когда нужен научный работник - его никогда нет. Сидит играется в дустовские макросы
[/OFF]
Извените Игорь, что меня много на сейчас.
Я вам расскажу про свой опыт, не претендуя нивкоем случае на какой-то разворот событий.
Повторюсь - считайте это моими мыслями, которые я говорю сам себе.
Только системный подход. Нету всего лишь. Нелья пользоваться формулами. Нельзя - нужно описывать объект динамически и силы, которые действуют на него точно также. Это дифуры. Именно они, дифференциальные уравнения. Это будет проще, вы всё равно к ним вернётесь, не к формулам.
Почему. Вы запросто можете заменить формулы диф. уравнениями, числовые методы решений есть немерянно, они же не ручками решаются. Это раз.
Во вторых, потеря точности, а точнее накапливаемая ошибка (с дифурами точно такая же проблема, но....)
В третих - вы не учитываете объект, к которому прилаживаете силу. А он может изменятся - в частности, в центре масс, и тогда формулы пружины идут лесом (в плане кручения, наклона и т.д.). Я понимаю, что как бы не нужно, сейчас. Но поверьте, без учёта всего этого - нерешаемая задача. Без динамики вы никуда не уедете.
«
Последнее редактирование: Октябрь 08, 2015, 20:35 от AzazelloAV
»
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Пружина
«
Ответ #3 :
Октябрь 08, 2015, 21:27 »
Цитировать
Нелья пользоваться формулами.
В смысле нельзя
Цитировать
Нельзя - нужно описывать объект динамически и силы, которые действуют на него точно также. Это дифуры. Именно они, дифференциальные уравнения.
Если имеется в виду динамика (классическая механика) то она, конечно, использует язык диф. уравнений) Но насколько я в курсе, тот физический движок, под капотом, и считает дифуры) Так что всё нормуль) Пользователь лишь задаёт эти силы.
Цитировать
Почему. Вы запросто можете заменить формулы диф. уравнениями, числовые методы решений есть немерянно, они же не ручками решаются. Это раз.
Это наивное заблуждение..( Я, например, стараюсь максимально ручками, а уж если совсем никак, то уж численные методы и программирование( Куда деться(
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Пружина
«
Ответ #4 :
Октябрь 10, 2015, 06:01 »
Цитата: m_ax от Октябрь 08, 2015, 17:12
Возьмите 4 пружины с затуханием b (
F
= -k(
r
-
r
0) - b*
v
) (
v
- скорость) и привяжите их одним концом к какой либо точке на вершине тела, а другими к плоскости.
Может Вы имели ввиду деформацию куба, но так задача не стоит - нужен просто доворот, т.е. линейная операция.
Проблемы как раз с затуханием (b). Я думал так: это типа сила трения, она может полностью затормозить движение объекта, но не может направить его в противоположную сторону. Поэтому b должно быть от 0 до 1. Но это почему-то не работает
Попробовал бОльшие значения b - уже на 2 все норм. Почему- хз, перепроверил неск раз, никакой ошибки не нашел
Да, и вот еще: объясните почему момент вращения здесь совершенно не роялит? (сила приложена в верхней точке)
Спасибо
«
Последнее редактирование: Октябрь 10, 2015, 06:04 от Igors
»
Записан
AzazelloAV
Гость
Re: Пружина
«
Ответ #5 :
Октябрь 10, 2015, 08:28 »
Цитата: m_ax от Октябрь 08, 2015, 21:27
Это наивное заблуждение..( Я, например, стараюсь максимально ручками, а уж если совсем никак, то уж численные методы и программирование( Куда деться(
Вы имеете в виду аналитическое решение? Ну так это не про нас, вы же не думаете, что здесь есть люди, которые могут сами описать систему диф. уравнениями. Я не могу, это другой уровень, я могу только готовые брать.
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Пружина
«
Ответ #6 :
Октябрь 11, 2015, 13:59 »
Цитировать
Проблемы как раз с затуханием (b). Я думал так: это типа сила трения, она может полностью затормозить движение объекта, но не может направить его в противоположную сторону. Поэтому b должно быть от 0 до 1.
Чиво? По чему до единицы? Хотя мне эти цмфры вообще ни о чём не говорят.. Коэффициент b - размерная величина. Вы в чём его мерите? Для оценки величины затухания (пусть даже грубой) можно рассмотреть одномерную модель осциллятора с затуханием (школьная задачка) см. аттач. Вот и выбирайте какой вариант зависимости Вам нужен.
Цитировать
Может Вы имели ввиду деформацию куба, но так задача не стоит - нужен просто доворот, т.е. линейная операция.
Какой ещё доворот и какая деформация куба? Я вообще о другом.. Я вот о чём: см. другой аттач. (сининьким - это пружинки)
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Пружина
«
Ответ #7 :
Октябрь 11, 2015, 14:41 »
Цитата: AzazelloAV от Октябрь 10, 2015, 08:28
Цитата: m_ax от Октябрь 08, 2015, 21:27
Это наивное заблуждение..( Я, например, стараюсь максимально ручками, а уж если совсем никак, то уж численные методы и программирование( Куда деться(
Вы имеете в виду аналитическое решение? Ну так это не про нас, вы же не думаете, что здесь есть люди, которые могут сами описать систему диф. уравнениями. Я не могу, это другой уровень, я могу только готовые брать.
Я имею в виду, что перед тем как тупо в лоб засовывать теорию в численные методы, нужно максимально ручками её для этого "подготовить". Что-то, возможно решить аналитически ну или полуаналитически, что то, возможно, упростить (в разумных пределах), а уже потом, года уже станет ясно что всё, дальше только численно, только тогда применять ч.м. Это существенно может ускорить дальнейшие расчёты. Существенно.
Цитировать
я могу только готовые брать.
Вот есть один маленький примерчик по этому поводу: Система из двух дифуров (оч. простых) и одно алгебраическое уравнение, ну и + граничные условия к дифурам. Так вот, если это тупо в лоб решать (численно), то ответа вы не получите, или будете ждать его долго-долгоо.. Но если перед тем как это всё вгонять в комп сделать несколько выкладок, то время на последующие вычисления резко сокращается (~msec).
Вот я об этом и говорю.
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Пружина
«
Ответ #8 :
Октябрь 11, 2015, 16:31 »
Цитата: m_ax от Октябрь 11, 2015, 13:59
Какой ещё доворот и какая деформация куба?
Доворот - линейная, обратимая операция, куб поворачивается в пр-ве, но не меняет свою форму/геометрию. Деформация - в общем случае нелинейное и необратимое преобразование, напр изгиб куба или хотя бы изменение одной из его вершин. Хотя после этого он уже и не куб.
Цитата: m_ax от Октябрь 11, 2015, 13:59
Я вообще о другом.. Я вот о чём: см. другой аттач. (сининьким - это пружинки)
А что это? Откуда взялись 4 синенькие пружинки? Зачем их четыре
Цитата: m_ax от Октябрь 11, 2015, 13:59
Для оценки величины затухания (пусть даже грубой) можно рассмотреть одномерную модель осциллятора с затуханием (школьная задачка) см. аттач. Вот и выбирайте какой вариант зависимости Вам нужен.
Толку от приведенного Вами дифура ноль (стандартная ситуация). Я не должен менять позицию/скорость/ускорение как хочу, потому что в сцене есть еще много чего что может их изменить. Я должен рассчитать силу и отдать ее движку, а он уж разрулит все остальное.
Цитата: m_ax от Октябрь 11, 2015, 13:59
Чиво? По чему до единицы? Хотя мне эти цмфры вообще ни о чём не говорят.. Коэффициент b - размерная величина
Вернемся к человеческому ур-ю пружины
Цитировать
F = -k(r - r0) - b*v) (v - скорость)
Пусть первая компонента k(r - r0) близка к нулю. Масса константа, пусть = 1. Так что выходит, b > 1 направляет объект в противоположную сторону? Где ошибка в моих рассуждениях?
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Пружина
«
Ответ #9 :
Октябрь 11, 2015, 16:56 »
Цитировать
А что это? Откуда взялись 4 синенькие пружинки? Зачем их четыре
Вы же сами писали:
Цитировать
Нужно: симитировать поведение пружины, (изменив силу и/или момент вращения) т.е. объект поворачивается до какого-то предела, пружина не дает дальше. А если сила перестала действовать, то объект должен вернуться в исходное состояние, возможно с какими-то "пере-колебаниями".
Вот 4 пружины будут возвращать тело после действия внешней силы. Затухание в пружинах введено для того, чтоб заглушить колебания этого тела. А 4 их для устойчивости)
Цитировать
Я не должен менять позицию/скорость/ускорение как хочу, потому что в сцене есть еще много чего что может их изменить.
А их и не нужно изменять. Это сила упругости зависит от текущих скорости, координаты и т.д.. См. уравнение (1).
Цитировать
Пусть первая компонента k(r - r0) близка к нулю. Масса константа, пусть = 1. Так что выходит, b > 1 направляет объект в противоположную сторону? Где ошибка в моих рассуждениях?
В отсутствии знания школьной физики) Случай b > 0 говорит о том, что сила сопротивления всегда направленна против скорости движения тела. Это значит, что оно (тело) если на него не будет действовать внешняя сила, остановится, за время порядка обратной gamma (см. решение ур. 2).
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Пружина
«
Ответ #10 :
Октябрь 12, 2015, 10:45 »
Цитата: m_ax от Октябрь 11, 2015, 16:56
Вот 4 пружины будут возвращать тело после действия внешней силы. Затухание в пружинах введено для того, чтоб заглушить колебания этого тела. А 4 их для устойчивости)
А зачем мне делать через то самое место, если я могу иметь всего одну пружину и выразить силу через угол поворота - или вообще работать с угловой скоростью?
Цитата: m_ax от Октябрь 11, 2015, 16:56
В отсутствии знания школьной физики) Случай b > 0 говорит о том, что сила сопротивления всегда направленна против скорости движения тела. Это значит, что оно (тело) если на него не будет действовать внешняя сила, остановится, за время порядка обратной gamma (см. решение ур. 2).
Ну вот, наколотили понтов - а ведь все гораздо проще, и знание дифуров необязательно. Положим массу = 1, чтобы она не путалась под ногами
Цитировать
v += a * t; // может лучше dt
На каждом шаге ускорение добавляется к скорости. Пусть v = 1, a = -3, t = 1. Новая скорость v = 1 - 3 = -2. Следующий шаг v = -2 +3 (противоположно скорости). Новая скорость опять +1. Итого: колебания никогда не затухают - что бы ни говорили вумные дифуры
Конечно если уменьшить t то может все станет норм, но такой свободы действий нет.
Ладно, сейчас кое-как работает, но беда в том что оба параметра: stiffness (жесткость) и damping (затухание) пользователю очень трудно настроить. Он знает величину (порядок) сил, напр 100. Какое значение жесткости ему выставлять? После десятка-двух проб удается нащупать - ага, вроде жесткость тоже 100 дает разумный рез-т. Теперь сила 10. Но с жесткостью 10 (по аналогии) поведение уже совсем другое. Опять эксперименты... Теперь он решил сделать кубик повыше - оба-на, все развалилось
А с затуханием еще хуже - ведь начиная с какого-то значения оно начинает работать "наоборот". Что бы Вы посоветовали?
Спасибо
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Пружина
«
Ответ #11 :
Октябрь 12, 2015, 11:06 »
А как насчет буллета или ньютона? Там !может быть! подобный функционал.
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Пружина
«
Ответ #12 :
Октябрь 12, 2015, 11:08 »
Цитата: Racheengel от Октябрь 12, 2015, 11:06
А как насчет буллета или ньютона? Там !может быть! подобный функционал.
Так это вся песня внутри Bullet
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4747
Re: Пружина
«
Ответ #13 :
Октябрь 12, 2015, 16:41 »
Цитата: Igors от Октябрь 12, 2015, 10:45
Цитировать
v += a * t; // может лучше dt
На каждом шаге ускорение добавляется к скорости. Пусть v = 1, a = -3, t = 1. Новая скорость v = 1 - 3 = -2. Следующий шаг v = -2 +3 (противоположно скорости). Новая скорость опять +1. Итого: колебания никогда не затухают - что бы ни говорили вумные дифуры
откуда во второй итерации +3 если должно быть -3? a * t = -3, фиксированная величина, скорость будет стремиться к -бесконечности.
Записан
Изучением C++ вымощена дорога в Qt.
UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Пружина
«
Ответ #14 :
Октябрь 12, 2015, 20:47 »
Цитировать
На каждом шаге ускорение добавляется к скорости. Пусть v = 1, a = -3, t = 1. Новая скорость v = 1 - 3 = -2. Следующий шаг v = -2 +3 (противоположно скорости). Новая скорость опять +1. Итого: колебания никогда не затухают
У меня просто слов нет..(
Ничего здесь посоветовать не могу..
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Страниц: [
1
]
2
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...