Я сейчас сталкиваюсь с более математической проблемой. Я разрабатываю приложение, которое заинтересовано в ускорении по осям X и Y. Другими словами, я хочу отслеживать ускорение, которое идет влево или вправо и вперед или назад.
Если устройство лежит на столе лицом вверх, все ускорения в нужном направлении видны в значениях ускорения этих осей. Возникает проблема, если устройство не находится в таком положении и имеет определенный поворот вокруг оси X или Y (шаг, крен).
Мне нужна матрица вращения (Rm), которую я могу умножить на вектор ускорения (x), чтобы получить новый калиброванный вектор (x '), с которым могут работать другие классы: x' = Rm * x . Это должно быть вычислено из опорного вектора (0,0, -1) и текущего вектора силы тяжести устройства.
Я знаю, что это как-то связано с углами Эйлера, но я не могу понять, как я могу их вычислить и с их помощью создать свою матрицу вращения. Я также знаю, что в классе CMAttitude есть матрица вращения, но я хотел бы получить более глубокое понимание того, как эта матрица вычисляется.
Пример:
Представьте, что вы хотите позабавиться, как сильно вы тормозите на своем велосипеде. Если ваш iPhone установлен на велосипеде с дисплеем, направленным вверх, вы можете прочитать ускорение по значению y вектора ускорения. Другие классы в вашем проекте предполагают, что ускорение при торможении всегда можно увидеть в этом значении.
Проблема в том, что когда iPhone находится в портретном режиме, дисплей указывает на вас. Тогда торможение увеличит не значение y, а значение z. Поэтому вам нужно повернуть значение ускорения на -90 градусов вокруг оси x.
Мне нужна эта матрица вращения для произвольного вращения устройства. Я знаю, что невозможно вычислить вращение вокруг оси z по гравитационным векторам, но, если длинные вращения по осям x и y сведены на нет, я в порядке.
Большое спасибо за вашу помощь