Як визначити, які тяги включити для обертання корабля?


47

Конфігурація корабля динамічно змінюється, тому я повинен визначити, який тяги включати, коли я хочу обертати судно за годинниковою або проти годинникової стрілки. Виштовхувачі завжди осі вирівняні з кораблем (ніколи під кутом) і не вмикаються або вимикаються. Ось одна з можливих налаштувань:

http://i.stack.imgur.com/GSBSH.png

Я намагався поки що візуалізувати вектор стрільби та вектор напрямку до центру маси корабля:

http://i.stack.imgur.com/ZzNzi.png

На жаль, я до цього не надто далеко.


7
Ви прямуєте в правильному напрямку з силовими векторами. Спробуйте знайти формули для АНГУЛЯРНОЇ швидкості, оскільки ви намагаєтесь обертати корабель навколо центру маси.
Amplify91

Я забуваю, як саме це зробити, але в основному його справедливі сили в кожній точці en.wikipedia.org/wiki/Center_of_mass і особливо en.wikipedia.org/wiki/Parallel_axis_theorem
CobaltHex

1
Я мав абсолютно таку ж ідею! Одна порада, яка може вам полегшити те, що вам потрібно обчислити кутове та лінійне прискорення лише один раз для кожного тяги, тому обчислення можуть бути такими ж складними, як ви хочете.
Маркус фон Броаді

@ Amplify91, ваш коментар ралі допоміг мені зрозуміти, дякую!
migimunz

1
@migimunz Я швидше думав про обчислення прискорень на штовхачі, а не за натиснутою клавішею (група штовхачів). Крім того, давати гравцеві вибір того, які рушії слід активувати, на якій натиснутою клавіші може бути цікаво (деякі люди будуть торгувати швидше, обертаючись, щоб обертатися на місці)
Маркус фон Броаді,

Відповіді:


22

Успіху! Ось воно і обертається як слід: введіть тут опис зображення

Що я зробив, це наступне: для кожного тяги я обчислюю величину крутного моменту по відношенню до центру маси.

private function thrustTorque():Float
{
    // distToCom is the distance vector between the thruster and center of mass
    // fire angle is a unit vector representing the direction of the thruster
    var distAngle = Math.atan2(distToCOM.y, distToCOM.x);
    var fireAngle = Math.atan2(dir.y, dir.x);
    var theta = fireAngle - distAngle;
    var torque = distToCOM.length * Math.sin(theta);
    return torque;
}

Рівняння величини крутного моменту, згідно з Вікіпедією, є T = rF sin(theta), де:

  • r - відстань між рушієм і СОМ
  • F - величина прикладеної сили (я залишаю це, роблячи вигляд, що це лише одна, тому що мене хвилює лише знак).
  • theta - кут між двома векторами

Коли гравець натискає ліворуч, я перевіряю знак крутного моменту для цього тяги - якщо він менший за нуль, я запускаю тягу. Це просто навпаки для повороту за годинниковою стрілкою.

Можливо, це можна покращити, використовуючи крапковий добуток для обчислення косинуса кута між векторами, але це доведеться почекати до завтра.

Нарешті, ось демонстрація наживо .


Поблизу там я думаю. Здається, не точно в центрі маси. Використовуючи лише стрілки вліво / вправо, корабель може легко вийти з екрана. Дуже близько, хоча. Можливо, точка, з якої ви вимірюєте, трохи не вийшла. Або це може бути питання про терміни, оскільки, здається, через деякий час стабілізується до хорошого віджиму. Хоча приємна робота.
MichaelHouse

Я не думаю, що це стосується цієї логіки. Тут немає нічого, що гарантує, що транспортний засіб не отримає чистої поступальної сили від стрільби з набору тузів, вибраних цим механізмом. Якщо підтримка чистої поступальної сили не є вимогою, вона вимагатиме можливості модулювати силу окремих штовхачів (і, ймовірно, це стане набагато складніше вирішити проблему)
Тревор Пауелл,

@TrevorPowell, точно. Для простоти (а також веселощів, оскільки від того, наскільки добре працює ваш корабель, буде залежати від того, наскільки ви добре його спроектували), я вирішив, що тяги включаються або вимикаються. Я, мабуть, включу поріг, щоб ті, які викликають занадто мало крутного моменту (а отже, і занадто багато бічного руху), не були включені, але саме те, наскільки це "занадто багато / мало", буде, ймовірно, визначатися методом спроб та помилок.
migimunz

3
Те, що ви хочете зробити, щоб уникнути обчислень кута, - це використовувати перпендикулярний крапковий добуток (отриманий з визначення поперечного продукту крутного моменту T = r поперечний F, якщо ви використовуєте 3D-вектори з z = 0). Ви берете вектор (-ry, rx), перпендикулярний r з однаковою величиною, і обчислюєте крапковий добуток цього вектора з F. Результат T = rx * Fy - ry * Fx. Тоді abs (T) - величина крутного моменту, і його знак вказує напрямок: T> 0 проти годинникової стрілки, T <0 - за годинниковою стрілкою.
Жорен

1
Причину, чому це працює, легко зрозуміти інтуїтивно: r точка F = r F cos θ. Якщо повернути r проти годинникової стрілки на 90 градусів і взяти крапковий добуток, ви отримаєте r F sin θ, тому що cos (θ - 90˚) = sin (θ).
Жорен

14

Загальна вираз для 3D крутного моменту є крос - продукт зміщення і сили: Т = гР . У двох вимірах буде достатньо скалярного значення крутного моменту, і, враховуючи лише чотири ортогональні орієнтації для рушіїв, ми можемо записати кусково:

  • Сила в напрямку + x: T = F * (-ry)
  • Сила в напрямку -x: T = F * (ry)
  • Сила в напрямку + y: T = F * (rx)
  • Сила в напрямку -y: T = F * (-rx)

Тут F - величина сили, що створюється штовхачами, rx і ry - x- і y-компоненти вектора від точки повороту до тяги. Позитивні крутні моменти мають тенденцію обертати корабель проти годинникової стрілки. Використовуючи чотири формули, наведені вище, тривіально вивести знак крутного моменту, який створює кожен дросель.

Для скромно точного подання фізики потрібно знати не тільки знак тяги, а й її загальну величину та інерцію обертання. Крім того, можливо, ви не просто хочете активувати всі правильно вирівняні тяги для обертання.

Космічний корабель

Як намальовано, повна потужність для тягачів B, D і E дозволить максимально обертати, але також прискорить корабель праворуч. Вимкнення D запобіжить цьому. Якщо натомість призначене прискорення праворуч, але обертання за годинниковою стрілкою не є, найефективніший спосіб перейти - це включення як C, так і F на дві третини повної потужності разом з D.

Якщо це не виходить за рамки того, що ви намагаєтеся зробити, вам доведеться написати якийсь розв'язувач для рівнянь руху, явно не просте завдання.


7

Кілька різних речей. По-перше, ми повинні визнати, що це недостатньо обмежена проблема. Тобто, існує багато різних комбінацій тяжів, які можуть вести вогонь і призводити до обертання в одному напрямку. Я припускаю, що у вашій ситуації є лише два стани для дроселів, "увімкнено" і "вимкнено", і всі виштовхувачі виходять однаковою силою.

По-друге, очні очі на вашу модель, схоже, що ваш "центр маси" насправді не є вашим центром маси. На щастя, це не вплине на ваші розрахунки щодо крутного моменту. Однак це вплине на ваші розрахунки щодо центру масового переміщення. Я не впевнений, якщо ви дбаєте про точність на цьому рівні, оскільки ваш "центр маси" є принаймні найближчим квадратом до справжнього центру маси.

По-третє, якщо ви хочете порахувати, як певний тяга вплине на обертання, ви маєте це правильно, хоча ви використовуєте неефективну формулу. Крутний момент можна обчислити як 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.

Після написання цього питання мені доведеться подумати ще про алгоритм його оптимізації. Я думаю, що решта моєї публікації є корисною, як є, тому я публікую її, але я оновлю, коли знайду найкращий спосіб оптимізувати цю конфігурацію (я продумав кілька способів отримати приблизні відповіді, але жоден з них не є точним).


Дякую за відповідь (і швидше і чіткіше рішення для обчислення крутного моменту). Червоне коло не є судновим СОМ, хоча це живлення. Я використовую двигун фізики і просто прикладаю локальний імпульс до корабля. Я добре, що рішення не є ідеальним, оскільки це дуже цікаво грати з різними конфігураціями, але я хотів би знати, що ви придумали.
migimunz

1
Ви можете обчислити крутний момент з довільної точки відліку. Отримане число зміниться, але поки ви обертаєте корабель навколо цієї точки, який не повинен бути центром маси, фізична поведінка не буде. Насправді, без інформації про масовий розподіл, центр маси є самовільним і не може бути обчислений як такий.
Маркс Томас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.