Физика пружины. Как узнать момент вращения через кватернион?
Здравствуйте. Пишу симуляцию пружины при помощи ODE и Panda3D для визуализации. С простым движением всё просто: прикладывается сила пропорционально расстоянию, вычитается сила пропорционально скорости и тело плавно возвращается в заданную точку. Если пропорционально скорости не вычитывать, тело совершает гармонические колебания в окрестностях заданной точки. С вращением и моментом полное... Ни матрицы вращения, ни их производные, ни их арккосинусы и арксинусы не дают результата. В лучшем случае тело раскручивается вокруг 0Z, в худшем совершает случайные вращения и улетает в космос. Держаться заданного угла не хочет ни в какую.
Самая успешная реализация вращения у меня пока учитывает вращение только по 0X и 0Y. У тела получаем квартернион и прикладываем момент пропорционально X или Y. Само собой любое отклонение вокруг оси Z влечёт раскручивание и полёт в космос. Если тело вокруг Z не вращается, тело успешно держит заданный угол при прикладывании внешних сил.
Как рассчитать момент, необходимый для поворота в направлении заданном кватернионом, чтобы тело придерживалось заданного угла?
Вы имеете в виду тензор инерции? Это не кватернион.
Штука заковыристая (пока разбираешься), но по сути совершенно аналогична линейной механике: как вы получаете вектор ускорения делением вектора силы на инерцию, так же точно вы получаете вектор углового ускорения делением вектора момента силы на тензор инерции. И никаких левых дёрганий не получится - сама мать природа позаботится (при правильном оформлении тензора инерции, разумеется).
В частных случаях вращения строго по координатным осям операции с тензором эквивалентны операциям со скалярными моментами инерции по соответствующим осям - Ixx, Iyy, Izz.
⃗α=⃗M/Ix
Значит я плохо пояснил, что мне нужно. И момент инерции тогда тут не при чём. Вкратце: есть два тела, одно закреплено жестко в ориентации Q0=(w=1,x=0,y=0,z=0) и никуда не двигается, второе закреплено с ним шаровым шарниром и пружиной, которая не даёт ему отклониться от Q. И мне нужно узнать момент Torque относительно глобальных осей в зависимости от вектора ориентации второго тела заданного кватернионом Q2.
До сих пор не понимаю.
Q0 - это единичный кватернион, то есть нулевой поворот (откуда? какова начальная ориентация для всех поворотов, включая нулевой?), то есть никуда особенно тело 1 не повёрнуто, точнее не понятно куда оно вообще повёрнуто. Далее начинается шарманка. Пока что могу себе представить, что центр тела 1 является центром вращения для тела 2. Шаровой шарнир имеет 3 степени свободы во всех трёх плоскостях. То есть не ограничивает тело 2 никак, кроме как расстоянием до центра вращения. Тело 2 может быть повёрнуто как угодно и даже кому угодно. А где вы тут пружинку-неонку вставили? И что такое Q? Q0 вы определили как нулевой поворот, а Q (я подозреваю - тоже кватернион) не определяли, то есть это любое возможное направление. Чего там ограничивает "любое возможное направление тела" кому бы то ни было - совсем не понятно. Вы бы хоть черновичок схемки подкинули... Чтобы вашу конструкцию разглядеть одним глазком.
Упоминая Q я имел в виду кватернион, задающий направление, к которому пружина стремится повернуть второе тело. В простейшем случае он совпадает с Q0. В идеальном случае второе тело совершает гармонические колебания, которые должны гаситься, если в программе сделать дополнительную поправку на гасящий момент Torque с учётом угловой скорости. Амплитуда колебаний определяется начальным положением второго тела.
i67.fastpic.ru/big/2014/0730/bc/46a217b24553e9af9d...
Вся эта эпопея связана с тем, что в Open Dinamic Engine, который просчитывает физику, пока нет поддержки ограничений. Этот недостаток я решил исправить написанием библиотеки, которая рассчитывает реакции пружин.
Спасибо!
Я верно понимаю, что демпферы для красной и лимонной осей(пружин) вы сделали нормально. А вот демпфер для синей у вас даёт странную реакцию. Так?
Ладно. Не то, чтобы я знаю кто такой ODE, но попробуйте заново сформулировать задачку уже в терминах чертежа (на котором вы очень зря не подписали оси и прочие нужные буквы). Я любопытствовал кинематикой, а щас ковыряю Unity3D, так что постараюсь сообразить.
Дэвид Барафф в своём курсе лекций описывает это всё дело: www.cs.cmu.edu/~baraff/sigcourse/notesd1.pdf
Момент инерции это диагональная матрица, которая задается в момент создания тела. Это этакая "масса" для вращательного движения.
Спасибо, находил эту книгу. Перечитал ещё раз.
К сожалению ни формулы, ни примера, который бы подтолкнул меня к решению проблемы я не нашёл. Тело упрямо раскручивается вокруг своей оси 0Z и улетает в космос.
Кватернион - весьма абстрактная вещь. Всё равно как спросить "какой угол образует с координатными осями число фиолетовый цвет". Вы имеете в виду "как найти Эйлеровы углы из ориентации, заданной неким кватернионом"?