Чи можна використовувати кватерніони для управління вертольотом?


9

Я намагаюся зробити спрощений вертоліт (на даний момент це куб) моделювання в 3D, і у мене виникають деякі проблеми з обертанням. Вертоліт може обертатися вздовж трьох осей:

  • обертати на себе за допомогою заднього гвинта: обертання осі y
  • нахил вліво і вправо, щоб перейти вліво або вправо: z обертання осі
  • нахил вгору і вниз, щоб рухатися назад або вперед: х обертання осі

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

Мені здається, що мені потрібно використовувати кватерніони, але я не знаю, як контролювати кожну окрему вісь, оскільки кватерніони використовують напрямок і кут. Чи слід створити три кватерніони та помножити їх разом? Чи не закінчився би тими ж проблемами?

Дивна річ - якщо я використовую пальцем, щоб зобразити три осі мого вертольота (великий палець вгору = y, індекс = z, середина = х), я, здається, не стикаюся з цими проблемами. Чому?


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

@bummzack, так, я про це думав. Однак хіба це не те, що об'єднувати три матриці обертання в певному порядку?
субб

Ви маєте рацію @Subb, намагайтеся не зберігати обертання для кожної осі окремо, це матиме ті самі проблеми, що і кути Ейлера, незалежно від того, що ви для цього використовуєте, також матриці та кватерніони будуть страждати від блокування Gimbal Lock.
Майк Семдер

@Maik Semder, то як я можу забезпечити управління висотою / посівом / рухом мого вертольота?
субб

@Subb @ Flip's і моя відповідь в основному розповіла вам, як це зробити.
Майк Семдер

Відповіді:


4

Ви повинні мати можливість використовувати або матрицю, або кватерніон, щоб зберігати поточну орієнтацію свого вертольота. Проблема, з якою ви стикаєтеся, полягає в тому, як ви застосуєте до вертольота зміни нахилу / позіхання / кочення.

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

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


Ось як я це зробив, застосуйте поступові оновлення до матриці, яка представляє локальну -> світову трансформацію. Не забудьте нормалізувати матрицю, через кілька сотень кадрів вона покаже артефакти округлення, якщо цього не зробити.
Патрік Х'юз

Крім того, щоб відповісти на останнє запитання, чому проблема блокування карданного виду не бачиться, використовуючи вашу руку, щоб зобразити осі x / y / z, це тому, що ви, ймовірно, застосовуєте значення висоти тону, посіву та кочення до локального кадру руки довідник. Побудова матриці обертання з кутами ейлера починається з обертання навколо світу x, потім з отриманого y, а потім з отриманого z (фактичний порядок x / y / z може відрізнятися в порядку). Спробуйте застосувати обертання таким чином, і ви можете почати бачити, як виглядає фіксатор каркаса.
Фліп

3

В основному ви можете використовувати будь-яке інше подання обертів, але кути Ейлера. Матриці, кватерніони навіть кути осі будуть робити те, що ти хочеш.

Should I create three quaternions and multiply them together? Wouldn't I end up with the same problems?

Ви маєте рацію, у вас виникла б однакова проблема. Ключ - зберігати поточну орієнтацію (матрицю, кватерніон) вашого об'єкта та застосовувати лише дельту при зміні орієнтації.

Коли ви хочете повернути на 10 градусів навколо y, просто створіть для цього матрицю / кватерніон дельти і помножте її на поточну орієнтацію (якщо ви використовуєте пост множення для матриць). Якщо ви помножите її навпаки, вона буде обертати систему навколо осі y у світі, а не навколо осі y об'єкта.

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


-1

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

У вас є четверта ступінь свободи, яку ви пропустили: швидкість лопатей контролює об'єм повітря, що виштовхується, який також контролює кількість підйому гелікоптера.

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

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


Але це насправді не відповідає на питання. Просто додавання більше їжі для роздумів.
bummzack

В даний час я використовую обертання вертольота для перетворення вектора сили підйому, спрямованого вгору в просторі вертольота. Ви маєте на увазі, що я повинен робити реверс, тобто змінювати вектор безпосередньо, а потім обертати вертоліт?
субб

Я думаю, вам слід зробити і те, і що ви робите зараз, а потім внести будь-які РЕЗУЛЬТАТИ зміни обертання вертольота на основі нормальних лопатей. Тобто у вас є 2 обертання; один прикладається до лопатей, а другий - реальне обертання вертольота. Очевидно, що все зберігається в Кватерніонах.
deceleratedcaviar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.