Тригонометрия iPhone для работы с ориентацией

Я пытаюсь написать приложение дополненной реальности. Я использую компас, гироскоп и координаты GPS для создания наложений. Все работает отлично, за исключением того, когда пользователь выходит из портретного режима. Должна быть простая проблема с триггером, которую я не могу понять.

Чтобы определить, находится ли координата в поле зрения, я использую значение азимута и наклона центральной точки iPhone, которые вычисляются при запуске программы. Азимут определяется как движение влево и вправо, когда телефон направлен вверх, а наклон — движение вверх и вниз, когда телефон направлен вверх. Затем я обновляю это значение данными гироскопа и компаса по мере их обновления. Поэтому, если я правильно обновлю наклон и азимут центральной точки, все должно работать.

Проблема в том, что когда iPhone поворачивается, его определение азимута и наклона остается неизменным по отношению к телефону. Таким образом, наклон по-прежнему определяется как верхняя часть телефона, даже если телефон находится сбоку.

Я пробовал делать что-то вроде этого:

self.centerPoint.azimuth = (degToRad(angleX)*cosZ) + (degToRad(angleY)*sinZ);
self.centerPoint.inclination = (degToRad(angleY)*cosZ) + (degToRad(angleX)*sinZ);

где degToRad(x) преобразует градусы в радианы, cosZ и sinZ — это cos и sin угла z от гироскопа соответственно, а angleX и angleY ​​— это углы x и y от гироскопа. Угол X от гироскопа измеряет угол вверх-вниз, угол Y измеряет влево-вправо, а угол Z измеряет поворот телефона от портретной ориентации к альбомной.

Кажется, не работает. Когда я поворачиваю телефон в сторону, наклон резко возрастает. Есть триггеры, которые могут помочь?

Я должен добавить, что обычно, рассматривая только портретную ориентацию, я использовал: азимут = degToRad (уголX) и наклон = degToRad (уголY). Это работает для портретной ориентации. Мне просто нужно умножить это на какой-то коэффициент, чтобы учесть другой угол.


comment
Веб-сайт Apple Stack Exchange?   -  person Shoe    schedule 30.11.2010
comment
Нет, это вопрос программирования, а не вопрос программного обеспечения Apple.   -  person Jeff B    schedule 01.12.2010


Ответы (1)


Прошло много времени с тех пор, как я решил эту проблему, но если это просто вопрос перехода от портрета к ландшафту, не могли бы вы просто поменять местами значения азимута и наклона по мере необходимости?

В конце концов, они оба являются просто углами, рассчитанными одинаково, и только метка действительно отличает их. Возможно, вам лучше просто пометить их angle1 и angle2, а затем использовать один или другой в других расчетах в зависимости от ориентации телефона.


Обновление:

Глядя на это снова, я думаю, что ваша проблема в том, что вы используете неправильный датчик. Данные гироскопа возвращают радианы в секунду и являются мерой скорости вращения, которая вам не нужна.

Вместо этого, я думаю, вам нужно использовать измерение отношения, предоставленное CMAttitude. Класс CMAttitude предоставляет данные о крене, тангаже и рыскании, которые позволяют вычислить физическую ориентацию устройства. Метод multiplyByInverseOfAttitude: выглядит так, будто обеспечивает изменение ориентации устройства между любыми двумя образцами.

person TechZen    schedule 30.11.2010
comment
Да, я думал об этом. Что, если телефон находится под углом 30 градусов, а не в портретной или альбомной ориентации? Но если ничего не получится, я сделаю это. - person Mike; 01.12.2010