Могу ли я использовать кватернионы для управления вертолетом?

9

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

  • вращаться на себя, используя задний винт: вращение оси y
  • наклон влево и вправо для перехода влево или вправо: вращение оси z
  • наклоните вверх и вниз, чтобы двигаться назад или вперед: вращение оси x

Мне нужно иметь возможность контролировать каждую ось в отдельности. До сих пор я пытался использовать углы Эйлера, но независимо от того, какой порядок вращения я использую, я либо наталкиваюсь на замок карданного подвеса, либо некоторые оси «меняются местами».

Кажется, мне нужно использовать кватернионы, но я не знаю, как управлять каждой отдельной осью, поскольку кватернионы используют направление и угол. Должен ли я создать три кватерниона и умножить их вместе? Разве я не столкнулся бы с такими же проблемами?

Странно то, что если я использую свой палец, чтобы представить три оси своего вертолета (большой палец вверх = y, индекс = z, середина = x), я, похоже, не столкнусь с этими проблемами. Почему?

SUBB
источник
Если у вас есть доступ к графу сцены, жизнеспособной альтернативой будет иметь вложенные контейнеры для каждой оси, которые вы затем поворачиваете индивидуально.
bummzack
@ bummzack, да, я думал об этом. Однако разве это не то же самое, что объединить три матрицы вращения в определенном порядке?
SUBB
@Subb, вы правы, старайтесь не хранить повороты для каждой оси в отдельности, это будет иметь те же проблемы, что и углы Эйлера, независимо от того, что вы используете для этого, матрицы и кватернионы также пострадают от блокировки карданного подвеса.
Майк Земдер
@Maik Semder, как я могу контролировать высоту / рыскание / крен моего вертолета?
SUBB
@ 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
В настоящее время я использую вращение вертолета для преобразования вектора силы подъема, который направлен вверх в пространстве вертолета. Вы имеете в виду, что я должен сделать обратное, то есть изменить вектор напрямую, а затем повернуть вертолет?
SUBB
Я думаю, что вы должны сделать и то, что делаете сейчас, а затем внести РЕЗУЛЬТАТ изменения в вращении вертолета на основе нормального положения лопастей. Т.е. у вас есть 2 вращения; одна применяется к лопастям, а вторая представляет фактическое вращение вертолета. Очевидно, что все хранится в кватернионах.
замедленная