Несколько разных вещей. Во-первых, мы должны признать, что это недостаточно ограниченная проблема. То есть существует множество различных комбинаций движителей, которые могут стрелять, приводя к вращению в одном направлении. Я предполагаю, что в вашей ситуации есть только два состояния для двигателей: «включено» и «выключено», и все двигатели выдают одинаковую силу.
Во-вторых, глядя на вашу модель, похоже, ваш «центр масс» на самом деле не является вашим центром масс. К счастью, это не повлияет на ваши расчеты крутящего момента. Однако это повлияет на ваши расчеты смещения центра масс. Я не уверен, если вы заботитесь о точности на этом уровне, так как ваш «центр масс», по крайней мере, ближайший квадрат к истинному центру масс.
В-третьих, если вы хотите рассчитать, как определенное подруливающее устройство повлияет на вращение, у вас все правильно, хотя вы используете неэффективную формулу. Крутящий момент можно рассчитать как r x F
, который имеет величину r*F*sin(theta)
. Однако вычисление углов в этом случае является неэффективным методом. Вместо этого вы должны использовать перекрестное определение крутящего момента напрямую, поскольку это будет намного проще, если использовать ваши представления. Поскольку все ваши векторы не имеют z-компонента, формула для перекрестного произведения значительно упрощается.
Не изменяя результаты ваших вычислений, мы можем просто обновить ваш код
private function thrustTorque():Float
{
var torque = distToCOM.x*dir.y-distToCOM.y*dir.x;
return torque;
}
Это намного лучше (и быстрее).
Вы предлагаете в своем ответе, что ваше решение состоит в том, чтобы запустить все двигатели с крутящим моментом в правильном направлении. Теперь это в значительной степени решает вопрос, который вы задали. Тем не менее, я ожидаю, что в некоторой точке вдоль линии вы обнаружите, что ваша стратегия не столь удовлетворительна, если пользователь удерживает нажатой кнопку «Поворот», а все двигатели с положительным крутящим моментом вращаются, потенциально перемещая их сверху. вращать их (я не уверен в уровне детализации вашего моделирования, если вы действительно рассчитываете силы от движителей, или если вы просто визуально показываете их выстрелы, а затем вращаете вашу модель с постоянным ускорением или что-то в этом роде. Кстати, вы хотите, чтобы двигатели запускались хотя бы приблизительно точно).
Вы не учитываете чистую силу на корабле. Если бы у вас было произвольное количество движителей, это могло бы превратиться в довольно сложную проблему. Однако, поскольку наши двигатели имеют только два состояния, анализировать их довольно просто. Я точно не знаю, какая у нас цель, поэтому я могу представить себе два разных: во-первых, мы хотим минимизировать общую силу, сохраняя при этом крутящий момент в нужном направлении. Во-вторых, мы хотим максимизировать отношение крутящего момента к общей силе.
Кроме того, если бы вы могли представить себе дополнительный регулятор «громкости двигателя», который одновременно влияет на мощность всех двигателей, то вы можете установить этот элемент управления так, чтобы два ваших решения имели одинаковый крутящий момент, и вы видите, что второе решение может иметь только меньшее смещение, чем первое. Тем не менее, мы должны помнить, что если возможно запустить двигатели, чтобы вы только вращались и вообще не двигались, то оба решения будут одинаковыми.
Итак, мы собираемся перейти ко второму решению, основанному на аргументах предыдущего абзаца. Теперь, анализируя общую силу, мы можем просто отметить, что двигатели могут указывать только в четырех направлениях. Таким образом, общее усилие в направлении x - это просто количество движителей, указывающих влево, минус число, указывающее вправо, а также в направлении y.
После написания этой статьи мне нужно еще немного подумать об алгоритме, чтобы оптимизировать его. Я думаю, что остальная часть моего поста полезна как есть, поэтому я публикую ее, но я обновлю ее, когда найду лучший способ оптимизировать эту конфигурацию (я подумал о нескольких способах получения приблизительных ответов, но ни один из них не является точным).