Это небольшая предыстория и введение в проблему:
У меня есть некоторая функциональность в моем приложении для iOS, основанном на движении и местоположении, которому в качестве входных данных требуется матрица вращения. Некоторый графический вывод зависит от этой матрицы. При каждом движении устройства графический вывод меняется. Это часть кода, которая делает это:
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical
toQueue:motionQueue
withHandler:
^(CMDeviceMotion* motion, NSError* error){
//get and process matrix data
}
В этой структуре доступны только 4 кадра:
XПроизвольныйZВертикальный
XArbitraryCorrectedZVertical
XMagneticNorthZVertical
XTrueNorthZVertical
Мне нужно иметь другую ссылку, f.e. значение гироскопа вместо севера, и эти кадры не могут предложить мне именно то, что я хочу.
Чтобы достичь своей цели, я использую следующую структуру:
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryCorrectedZVertical
toQueue:motionQueue
withHandler:
^(CMDeviceMotion* motion, NSError* error){
//get Euler angles and transform it to rotation matrix
}
Вы можете спросить меня, почему я не использую встроенную матрицу вращения? Ответ прост. Мне нужно сделать какую-то собственную систему отсчета, и я могу сделать это, вставив измененные значения углов.
Эта проблема:
Чтобы получить матрицу поворота из углов Эйлера, нам нужно составить матрицу для каждого угла, а затем перемножить их. Для трехмерного случая у нас будет матрица для каждой оси (3 из них). После этого перемножаем матрицы. Проблема в том, что результат зависит от порядка умножения. XYZ не равно ZYX. Википедия говорит мне, что существует 12 вариантов, и я не знаю, какой из них лучше. правильный для реализации iOS. Мне нужно знать, в каком порядке мне нужно их умножить. Кроме того, мне нужно знать, какие углы обозначают X, Y, Z. Например, X — крен, Y — тангаж, Z — рыскание.
На самом деле, эта проблема была решена Apple много лет назад, но у меня нет доступа к .m-файлам, и я не знаю, какой порядок умножения является правильным для iOS-устройства.
Аналогичный вопрос был опубликован здесь, но заказ с этот математический пример в решении мне не подходит.