Кілька різних речей. По-перше, ми повинні визнати, що це недостатньо обмежена проблема. Тобто, існує багато різних комбінацій тяжів, які можуть вести вогонь і призводити до обертання в одному напрямку. Я припускаю, що у вашій ситуації є лише два стани для дроселів, "увімкнено" і "вимкнено", і всі виштовхувачі виходять однаковою силою.
По-друге, очні очі на вашу модель, схоже, що ваш "центр маси" насправді не є вашим центром маси. На щастя, це не вплине на ваші розрахунки щодо крутного моменту. Однак це вплине на ваші розрахунки щодо центру масового переміщення. Я не впевнений, якщо ви дбаєте про точність на цьому рівні, оскільки ваш "центр маси" є принаймні найближчим квадратом до справжнього центру маси.
По-третє, якщо ви хочете порахувати, як певний тяга вплине на обертання, ви маєте це правильно, хоча ви використовуєте неефективну формулу. Крутний момент можна обчислити як 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.
Після написання цього питання мені доведеться подумати ще про алгоритм його оптимізації. Я думаю, що решта моєї публікації є корисною, як є, тому я публікую її, але я оновлю, коли знайду найкращий спосіб оптимізувати цю конфігурацію (я продумав кілька способів отримати приблизні відповіді, але жоден з них не є точним).