Конфигурация корабля меняется динамически, поэтому я должен определить, какое подруливающее устройство включить, когда я хочу повернуть корабль по часовой стрелке или против часовой стрелки. Подруливающие устройства всегда выровнены по оси с судном (никогда не под углом) и включены или выключены. Вот одна из возможных настроек:
До сих пор я пытался визуализировать вектор огня и вектор направления к центру масс корабля:
К сожалению, я не очень далеко с этим.
mathematics
physics
migimunz
источник
источник
Ответы:
Успех! Вот оно, и оно вращается так, как должно:
Я сделал следующее: для каждого двигателя я вычисляю величину крутящего момента по отношению к центру масс.
Уравнение для крутящего момента крутящего момента, согласно википедии, таково
T = rF sin(theta)
, где:Когда игрок нажимает налево, я проверяю знак крутящего момента для этого двигателя - если он меньше нуля, я запускаю двигатель. Это как раз наоборот для поворота по часовой стрелке.
Вероятно, это можно улучшить, используя точечное произведение для вычисления косинуса угла между векторами, но это придется подождать до завтра.
Наконец, вот живая демонстрация .
источник
Общее выражение для 3D крутящего момента является кросс - продукт смещения и силы: Т = г ⨯ Р . В двух измерениях будет достаточно скалярного значения для крутящего момента, и, учитывая только четыре ортогональных ориентации для двигателей, мы можем записать в кусочной форме:
Здесь F - величина силы, создаваемой двигателями, rx и ry - x- и y-компоненты вектора от точки поворота до двигателя. Положительные моменты имеют тенденцию вращать корабль против часовой стрелки. Используя четыре формулы, приведенные выше, тривиально определить знак крутящего момента, создаваемого каждым двигателем.
Для скромно точного представления физики вам нужно знать не только знак тяги, но также ее общую величину и инерцию вращения. Более того, вы можете не просто активировать все правильно настроенные двигатели для вращения.
Как показано, полная мощность двигателей B, D и E увеличит скорость вращения, но также ускорит движение корабля вправо. Выключение D предотвратит это. Если вместо этого предусмотрено ускорение вправо, а вращение по часовой стрелке - нет, то наиболее эффективный способ - включить C и F на две трети полной мощности вместе с D.
Если это не выходит за рамки того, что вы пытаетесь сделать, вам придется написать какой-то решатель для уравнений движения, явно не простую задачу.
источник
Несколько разных вещей. Во-первых, мы должны признать, что это недостаточно ограниченная проблема. То есть существует множество различных комбинаций движителей, которые могут стрелять, приводя к вращению в одном направлении. Я предполагаю, что в вашей ситуации есть только два состояния для двигателей: «включено» и «выключено», и все двигатели выдают одинаковую силу.
Во-вторых, глядя на вашу модель, похоже, ваш «центр масс» на самом деле не является вашим центром масс. К счастью, это не повлияет на ваши расчеты крутящего момента. Однако это повлияет на ваши расчеты смещения центра масс. Я не уверен, если вы заботитесь о точности на этом уровне, так как ваш «центр масс», по крайней мере, ближайший квадрат к истинному центру масс.
В-третьих, если вы хотите рассчитать, как определенное подруливающее устройство повлияет на вращение, у вас все правильно, хотя вы используете неэффективную формулу. Крутящий момент можно рассчитать как
r x F
, который имеет величинуr*F*sin(theta)
. Однако вычисление углов в этом случае является неэффективным методом. Вместо этого вы должны использовать перекрестное определение крутящего момента напрямую, поскольку это будет намного проще, если использовать ваши представления. Поскольку все ваши векторы не имеют z-компонента, формула для перекрестного произведения значительно упрощается.Не изменяя результаты ваших вычислений, мы можем просто обновить ваш код
Это намного лучше (и быстрее).
Вы предлагаете в своем ответе, что ваше решение состоит в том, чтобы запустить все двигатели с крутящим моментом в правильном направлении. Теперь это в значительной степени решает вопрос, который вы задали. Тем не менее, я ожидаю, что в некоторой точке вдоль линии вы обнаружите, что ваша стратегия не столь удовлетворительна, если пользователь удерживает нажатой кнопку «Поворот», а все двигатели с положительным крутящим моментом вращаются, потенциально перемещая их сверху. вращать их (я не уверен в уровне детализации вашего моделирования, если вы действительно рассчитываете силы от движителей, или если вы просто визуально показываете их выстрелы, а затем вращаете вашу модель с постоянным ускорением или что-то в этом роде. Кстати, вы хотите, чтобы двигатели запускались хотя бы приблизительно точно).
Вы не учитываете чистую силу на корабле. Если бы у вас было произвольное количество движителей, это могло бы превратиться в довольно сложную проблему. Однако, поскольку наши двигатели имеют только два состояния, анализировать их довольно просто. Я точно не знаю, какая у нас цель, поэтому я могу представить себе два разных: во-первых, мы хотим минимизировать общую силу, сохраняя при этом крутящий момент в нужном направлении. Во-вторых, мы хотим максимизировать отношение крутящего момента к общей силе.
Кроме того, если бы вы могли представить себе дополнительный регулятор «громкости двигателя», который одновременно влияет на мощность всех двигателей, то вы можете установить этот элемент управления так, чтобы два ваших решения имели одинаковый крутящий момент, и вы видите, что второе решение может иметь только меньшее смещение, чем первое. Тем не менее, мы должны помнить, что если возможно запустить двигатели, чтобы вы только вращались и вообще не двигались, то оба решения будут одинаковыми.
Итак, мы собираемся перейти ко второму решению, основанному на аргументах предыдущего абзаца. Теперь, анализируя общую силу, мы можем просто отметить, что двигатели могут указывать только в четырех направлениях. Таким образом, общее усилие в направлении x - это просто количество движителей, указывающих влево, минус число, указывающее вправо, а также в направлении y.
После написания этой статьи мне нужно еще немного подумать об алгоритме, чтобы оптимизировать его. Я думаю, что остальная часть моего поста полезна как есть, поэтому я публикую ее, но я обновлю ее, когда найду лучший способ оптимизировать эту конфигурацию (я подумал о нескольких способах получения приблизительных ответов, но ни один из них не является точным).
источник