Мне нужен способ получить углы Эйлера для поворота в глобальной системе координат из локальной системы. Я использую c #, wpf 3d и гироскоп. У меня есть шар на экране, который должен двигаться так же, как гироскоп. Поскольку гироскоп отправляет движение относительно себя, мне нужно использовать кватернионы, чтобы сохранить состояние объекта и обновить его, но я застрял. Если я сделаю следующее:
var qu=eulerToQ(Gyro.X,Gyro.Y,Gyro.Z);
GlobalQu = Quaternion.Multiply(qu, GlobalQu);
ЭТО вращается правильно на одной оси. Когда я вращаюсь на A в одном направлении, а затем на B в другом, вращение объекта и гироскопа больше не в одном направлении, потому что вышеописанное работает для абсолютных вращений (относительно мира).
Например:
var qu=eulerToQ(KeyboardValue1,KeyboardValue2,KeyboardValue3);
GlobalQu = qu;
Это работает, потому что я увеличиваю значения крена, шага, рыскания, т.е. значения клавиатуры через клавиатуру всегда на глобальной оси. Гироскоп отправляет вращения по локальной оси.
Смена порядка вращения кватернионов не помогает
var qu=eulerToQ(Giro.X,Giro.Y,Giro.Z);
GlobalQu = Quaternion.Multiply(GlobalQu,qu);