Мне интересно, есть ли у кого-нибудь элегантный способ вычисления следующего сценария.
У меня есть объект (n) количество квадратов, случайных форм, но мы будем притворяться, что они все прямоугольники.
Мы имеем дело с отсутствием гравитации, поэтому рассмотрим объект в космосе сверху вниз. Я прикладываю силу к объекту на определенном квадрате (как показано ниже).
Как рассчитать угол поворота, основываясь на прилагаемой силе, в месте применения. Если применить в центральной площади, он будет идти прямо. Как оно должно вести себя, когда я двигаюсь дальше от центра? Как рассчитать скорость вращения?
Ответы:
Вы пытаетесь рассчитать крутящий момент. Крутящий момент зависит от приложенной силы F, точки приложения и центра масс объекта.
1) Центр масс . Определите центр масс объекта.
2) Точка приложения : определите точку, в которой действует сила.
3) Момент рука : расстояние между двумя точками, определенными выше.
4) Угловая сила : разделите вашу силу F на два ортогональных вектора: один параллельный линии в 3) и один перпендикулярный. Параллельная составляющая не влияет на момент импульса. Перпендикулярный делает. Вы можете рассчитать параллельную составляющую по векторной проекции.Вы можете вычесть это из оригинала, чтобы получить перпендикулярный компонент. В псевдокоде (
dot
означает точечное произведение)5) Крутящий момент : перпендикулярная составляющая силы, умноженная на длину плеча момента.
Чтобы получить от крутящего момента до угловой скорости:
1) Момент инерции : определение степени инерции вращения данного объекта. Например, для вращения длинного стержня требуется больше крутящего момента, чем сферы той же массы. Если вас не волнует реализм, вы можете притворяться, что момент инерции относительно массы, или вы можете полностью игнорировать форму и массу объекта.
2) Угловое ускорение :
3) Угловая скорость : угловая скорость будет увеличиваться, пока крутящий момент применяется. Таким образом, формула будет примерно иметь вид: «Угловая скорость в момент времени T является совокупной суммой углового ускорения вплоть до T ». Это выражается в псевдокоде как
источник
orientation += angularVelocity * elapsedSeconds
является неправильной, поскольку она переоценивает скорость в течение временного шага, а это означает, что разные частоты кадров будут давать разные ориентации. Правильная формула будет:float oldVelocity = angularVelocity; angularVelocity += angularAcceleration * elapsedSeconds; orientation += 0.5f * (angularVelocity + oldVelocity) * elapsedSeconds;
. Кроме того, поскольку гравитации нет, я предлагаю вместо этого использовать «центр масс». +1 за очень хорошее объяснение, хотя.если силы не слишком сильны, гораздо проще имитировать вращение, используя несколько точек и пружин, соединяющих их. в этом случае вы просто предполагаете, что ваша форма состоит из нескольких точек, соединенных пружинами. каждая точка представляет массу, а все остальное в форме имеет массу, равную нулю.
на рисунке выше черная точка представляет массы, а красная линия - пружины. затем, чтобы применить силу, нужно просто применить ее к ближайшей точке, и вы увидите, что ваш объект будет вращаться так, как вам нравится. чтобы ваша форма выглядела как сплошная структура, лучше определить пружины с высоким значением демпфирования и высоким значением k.
источник