Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.03.2015, 09:11
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

deviceOrientation event
Делаю небольшую програмку в которой телефон должен подключиться по вебсокету к сайту, на котором появляется моделька телефона (пока что весьма схематичная). Смысл в том чтобы моделька крутилась в 3д повторяя положение телефона в пространстве, но с этими осями постоянно какая-то жесть происходит.

Вот так я подписываюсь на событие изменения ориентации:
var listener = function (event) {
            that.orientation.alpha = event.alpha;
            that.orientation.beta = event.beta + 180;
            that.orientation.gamma = event.gamma + 90;
        };
...
window.addEventListener('deviceorientation', listener, false);


Идея была в следующем: мы открываем сайт, там нарисована моделька. Мы берем телефон и размещаем его в пространстве так же как и модельку (вертикально) и тапаем по экрану телефона (это нужно чтобы синхранизировать оси телефона и модельки). Вообщем-то все работает, но только пока мы не переворачиваем телефон. Дальше начинает твориться какой-то ад, я пока не понял как работают эти оси а информации очень мало. Если кто-то работал с этим и представляет как сделать подобное - буду очень рад услышать. Кому интересно - могу дать демку (только если будет смотреть больше 1 человека могут быть проблемы т.к. сервер и демка пока это не обрабатывают)

При подписке делаю так чтобы не было отрицательных значений (так как изначально бета от - 180 до 180, а гамма от - 90 до 90)

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

Тут встало 2 проблемы:
1) Как быть с постепенно растущей погрешностью в положениях телефона и модельки? (я подумываю над вариантом раз в 2-3 секунды посылать точные значения)

2) Воизбежания скачка модельки при преодолении максимальных рубежей для осей расчет идет примерно так:
private getDelta():IOrientation {
        return {
            alpha: Message.calculateValue(this.orientation.alpha, this.oldOrientation.alpha, 360),
            beta: Message.calculateValue(this.orientation.beta, this.oldOrientation.beta, 360),
            gamma: Message.calculateValue(-this.orientation.gamma, -this.oldOrientation.gamma, 180)
        }
    }

private static calculateValue(newValue, oldValue, maxValue) {
        var delta = newValue - oldValue;
        return Math.min(maxValue - Math.abs(delta), Math.abs(delta)) * ((delta < 0) ? 1 : -1);
    }


Пишу на TypeScript если кому режет глаз - выложу js

Последний раз редактировалось tsigel, 17.03.2015 в 10:17.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как создать event, эмулирующий enter Artanis Events/DOM/Window 7 16.07.2019 06:40
swfupload не грузит в опера работает хроме в чем ошибка? kolobok416 Flash 0 02.06.2014 23:01
Событие event в FireFox yambbkru Firefox/Mozilla 2 12.02.2013 18:19
event + setTimeout fsingle Events/DOM/Window 2 02.05.2012 09:07
Отловить направление onmousemove event? jsuse Общие вопросы Javascript 20 29.01.2012 22:10