Как использовать CoreMotion для получения ориентации устройства в пространстве

StackOverflow https://stackoverflow.com//questions/24018260

Вопрос

У меня здесь мы думали и искали и не можем найти хорошее направление, чтобы посмотреть ... Я ищу разработать алгоритм для перемещения в 360 изображении (например, сфера), используя движение устройства.

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

Любая идея или источник, которого я могу посмотреть?

Спасибо и удачи всем с Swift :)

Это было полезно?

Решение

Я вижу два простых способа реализации этого без особых математических хлопот:

  1. Используйте углы Эльтера, т.е. Свойство кант-ролла CMattitude . Определите сопоставление между шириной изображения и измеренным углом и заботиться о сингулярности при 180 ° / -180 °. Недостаток этого подхода:
      .
    • Возможная опасность Gimbal lock Когда пользователи начинают перемещать свои устройства хаотическими способами.
    • То же самое относится к расширению к полному 3D-представлению.
  2. Используйте Нахождение нормального вектора на 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.

Надеюсь, это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top