iPhone тригонометрия для борьбы с ориентацией - PullRequest
3 голосов
/ 30 ноября 2010

Я пытаюсь написать приложение дополненной реальности. Я использую координаты компаса, гироскопа и 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 измеряет поворот телефона от портрета до пейзажа.

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

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

1 Ответ

0 голосов
/ 01 декабря 2010

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

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


Обновление:

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

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

...