Как использовать CoreMotion для получения ориентации устройства в пространстве
-
21-12-2019 - |
Вопрос
У меня здесь мы думали и искали и не можем найти хорошее направление, чтобы посмотреть ... Я ищу разработать алгоритм для перемещения в 360 изображении (например, сфера), используя движение устройства.
Так что, если пользователь указывает на устройство перед ним, он получает определенную точку происхождения изображения.Когда он перемещает устройство вокруг него, панорамное изображение движется в зависимости от него.
Любая идея или источник, которого я могу посмотреть?
Спасибо и удачи всем с Swift :)
Решение
Я вижу два простых способа реализации этого без особых математических хлопот:
- Используйте углы Эльтера, т.е. Свойство кант-ролла CMattitude . Определите сопоставление между шириной изображения и измеренным углом и заботиться о сингулярности при 180 ° / -180 °. Недостаток этого подхода:
- .
- Возможная опасность Gimbal lock Когда пользователи начинают перемещать свои устройства хаотическими способами.
- То же самое относится к расширению к полному 3D-представлению.
- Используйте Нахождение нормального вектора на iOS-устройство ), проецируйте его на плоскость Saface Земли и возьмите Delta« Углы »для панорамы цилиндрики.
Проекция сферы еще проще в этом случае, так как вы можете использовать номинальный вектор напрямую.
Другие советы
благодаря Кей, я мог бы быть на правильном пути, чтобы достичь этого эффекта.
Я делаю этот ответ, чтобы обеспечить более подробную информацию о тех, кто ищет то же самое.
Сначала вам нужно создать объект CMMotionManager.
Затем используйте StartDevicemotionUpDateStoue, чтобы обрабатывать события движения.
[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
[self processMotion];
}];
.
в процессе процесса вам просто нужно получить отношение на основе предыдущего:
// Get attitude difference with previous one
CMAttitude *currentAttitude = self.motionManager.deviceMotion.attitude;
[currentAttitude multiplyByInverseOfAttitude:self.referenceAttitude];
.
Благодаря этому вы знаете новый угол, сделанный пользователем с момента последнего обновления. Тогда где вы обрабатываете свой вид, вы преобразуете новый угол EULER в объем пикселей, которые вам нужно переместить изображение. Просто будьте осторожны на углом EULER варьируются между -180, 180 и приведены в рад Apple.Это может быть удобно:
#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))
.
Так что в моем случае я просто рассчитываю новое смещение X, потому что я просто двигаюсь на оси x.
Надеюсь, это поможет.