Расстояние, пройденное акселерометром

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

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

Спасибо.

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

3 ответа

Решение

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

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

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)

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

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

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

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

а также

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

Другие вопросы по тегам