Казалось бы, это должно быть что-то легкое, но мне просто не повезло.Использование Core Motion для определения высоты и азимута телефона
Что я хочу, чтобы иметь возможность делать, это использовать движок ядра, чтобы отслеживать, где находится камера телефона (для своего рода приложения с дополненной реальностью). Пользователь будет указывать телефон на контрольную точку (как бы снимая ее) и нажать кнопку, чтобы «выровнять» позицию телефона с объектом. Теперь, когда пользователь указывает камеру телефона на другие объекты, мне нужно определить высоту изменения телефона (от -90º до + 90º) и азимута (от 0º до 360º).
Углы Эйлера, данные CMAttitude, по-видимому, не являются тем, что мне нужно. Я попытался кэшировать CMAttitude, полученный, когда пользователь нажимает «align». Затем, когда пользователь перемещает телефон вокруг, я получаю новый CMAttitude и использовать multiplyByInverseOfAttitude для определения отличия от эталонного отношения.
- (void)checkForMotion {
CMMotionManager *motionMgr = appDelegate.motionMgr;
CMDeviceMotion *deviceMotion = motionMgr.deviceMotion;
CMAttitude *attitude = deviceMotion.attitude;
if (referenceAttitude != nil)
{
[attitude multiplyByInverseOfAttitude: referenceAttitude];
double deltaAlt = attitude.pitch;
double deltaAzm = attitude.roll;
// Do something with deltaAlt and deltaAz
}
else
{
NSLog(@"Getting new referenceAttitude");
self.referenceAttitude = attitude;
}
}
Но это просто не дает правильных результатов. Если телефон удерживается вертикально (длинная ось вверх), то deltaAlt отлично работает. Пока телефон заострен на горизонте (alt = 0), то и deltaAzm является правильным. Однако, если телефон, если он указал (скажем) на 45º в небо, тогда, когда я перемещаю телефон по азимуту, компонент высоты изменяется также. Эти два переплетены так, как я не могу понять.
Есть ли какая-то простая математика, которая мне нужна, чтобы дразнить их отдельно? Опять же, я бы подумал, что это будет необходимой потребностью в приложении с дополненной реальностью, но я не смог найти примеров, которые это делают.
Вы уже обнаружили какие-либо решения проблемы? –