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