Расстояние, пройденное акселерометром - PullRequest
7 голосов
/ 11 июля 2011

Я хочу перемещать объекты на экране iPhone (прямоугольник, круг и т. Д.), Перемещая iPhone. Например, я перемещаю iPhone вдоль оси X, а объект движется вдоль оси X. То же самое для оси Y, Z.

Как я могу это сделать? Могу ли я получить алгоритм для этого?

Спасибо.

P.S: Я посмотрел некоторое время и кажется, что это возможно с помощью акселерометра.

Ответы [ 3 ]

13 голосов
3 голосов
/ 11 июля 2011

Не легко сделать точно.Акселерометр сообщает только ускорение , а не движение.Вы можете попытаться (численно) интегрировать ускорение с течением времени, но вы, скорее всего, в конечном итоге столкнетесь с накопительными ошибками, которые приводят к непреднамеренному движению.

Псевдокод, явно не проверенный:

init:
    loc = {0, 0, 0}    ; location of object on screen
    vel = {0, 0, 0}    ; velocity of object on screen
    t = 0              ; last time measured

step:
    t0 = time          ; get amount of time since last measurement
    dt = t0 - t
    accel = readAccelerometer()
    vel += accel * dt  ; update velocity
    loc += vel * dt    ; update position
    displayObjectAt(loc)
2 голосов
/ 28 ноября 2011

Почему бы вам не использовать само ускорение вместо сдвинутого расстояния? Например; Если ваше ускорение составляет 1.4G на восток, ваш объект должен двигаться на восток 14 пикселей в секунду, пока ваше ускорение не изменится.

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

Также смотрите:

http://www.freescale.com/files/sensors/doc/app_note/AN3397.pdf

и

Использование акселерометра, гироскопа и компаса для расчета движения устройства в трехмерном мире

...