Я пытаюсь сделать упрощенный симулятор вертолета (на данный момент это куб) в 3D, и у меня возникли некоторые проблемы с вращением. Вертолет может вращаться вдоль трех осей:
- вращаться на себя, используя задний винт: вращение оси y
- наклон влево и вправо для перехода влево или вправо: вращение оси z
- наклоните вверх и вниз, чтобы двигаться назад или вперед: вращение оси x
Мне нужно иметь возможность контролировать каждую ось в отдельности. До сих пор я пытался использовать углы Эйлера, но независимо от того, какой порядок вращения я использую, я либо наталкиваюсь на замок карданного подвеса, либо некоторые оси «меняются местами».
Кажется, мне нужно использовать кватернионы, но я не знаю, как управлять каждой отдельной осью, поскольку кватернионы используют направление и угол. Должен ли я создать три кватерниона и умножить их вместе? Разве я не столкнулся бы с такими же проблемами?
Странно то, что если я использую свой палец, чтобы представить три оси своего вертолета (большой палец вверх = y, индекс = z, середина = x), я, похоже, не столкнусь с этими проблемами. Почему?
Ответы:
Вы должны иметь возможность использовать матрицу или кватернион для хранения текущей ориентации вашего вертолета. Проблема, с которой вы сталкиваетесь, заключается в том, как вы применяете изменение высоты тона / рыскания / крена для вертолета.
Я думаю, что вы хотите применить тангаж / рыскание / крен для вертолета в локальном пространстве каждый кадр. Вы можете сделать это, взяв изменение шага / рыскания / крена для этого кадра и построив матрицу вращения (вы можете сделать это с углами Эйлера). Затем вы поворачиваете предыдущую ориентацию вертолета на эту матрицу (с предыдущей ориентацией, представленной в виде матрицы или кватерниона). Это даст вам ориентацию для нового кадра.
Представление ориентации вертолета как кватерниона имеет то преимущество, что интерполяция между кватернионами намного проще, чем интерполяция между матрицами. Поэтому, если в будущем у вас будет текущая ориентация, и вы захотите выяснить поворот за кадр, который приведет вас к новой ориентации в нужное время, представление кватерниона может быть более дружественным для вас.
источник
В основном вы можете использовать любое другое представление поворотов, кроме углов Эйлера. Матрицы, кватернионы и даже углы осей будут делать то, что вы хотите.
Вы правы, у вас будут такие же проблемы. Ключ заключается в том, чтобы сохранить текущую ориентацию (матрицу, кватернион) вашего объекта и применить только дельту при изменении ориентации.
Если вы хотите повернуть на 10 градусов вокруг y, просто создайте для этого дельта- матрицу / кватернион и пост-умножьте ее на текущую ориентацию (если вы используете пост-умножение для матриц). Если вы умножите его наоборот, он будет вращать систему вокруг мировой оси y, а не вокруг оси y объекта.
Я считаю этот ресурс очень полезным, он также поставляется с исходным кодом и очень хорошо объясняет теорию.
источник
Проблема, я думаю, вы, возможно, видите, это разница в векторах вращения оси и скорости (а также в том, что вы упускаете направление). Когда вертолет наклоняется вперед, чтобы двигаться вперед, движущая сила лопастей вертолета толкает воздух как вниз, так и назад под перпендикулярным углом к тому, что вы назвали осью X.
У вас есть четвертая степень свободы, которую вы пропустили: скорость лопастей контролирует объем выдвигаемого воздуха, который также контролирует величину подъемной силы, создаваемой вертолетом.
Но даже в этом случае ваши «наклон влево и вправо» и «наклон вверх и вниз» обычно управляют вертолетом в данном самолете. Иными словами, вертолет не должен лететь вниз, когда он наклоняется вперед, назад или в сторону, но может потребоваться изменить величину подъемной силы, и скорость будет контролироваться «противоположной» стороной правого треугольника, образованного соединение вертолета с землей прямой линией вниз (сила тяжести) и гипотенуза (подъем). Это должно дать ваш вектор скорости для использования.
Вы должны быть в состоянии использовать кватернионы для этого, но не основывайте свои значения кватернионов на наклоне самого вертолета - попробуйте использовать силы движения, которые генерирует вертолет.
источник