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