2017-01-05 6 views
1

Любой, у кого есть опыт работы с DeviceOrientationEvent и удобный телефон/планшет?DeviceOrientationEvent: как бороться с сумасшедшей гаммой, когда бета подходы/хиты 90deg?

Выполнение следующих фрагментов кода на устройстве с гироскопом. Я заметил, что гамма (вращающаяся влево/вправо вдоль оси Y) становится большой и непредсказуемой, поскольку бета приближается к 90 дэгу (устройство направляется вверх). Я предполагаю, что это gimbal-lock.

var data, raf, alpha = document.getElementById("alpha"), 
 
    beta = document.getElementById("beta"), 
 
    gamma = document.getElementById("gamma"); 
 

 
window.addEventListener("deviceorientation", processData); 
 
window.addEventListener('click', togglePause); 
 
updateText(); 
 

 
function processData(e) { 
 
    data = e; 
 
} 
 

 
function updateText() { 
 
    if (data) { 
 
    alpha.textContent = Math.round(data.alpha); 
 
    beta.textContent = Math.round(data.beta); 
 
    gamma.textContent = Math.round(data.gamma); 
 
    } 
 
    raf = requestAnimationFrame(updateText); 
 
} 
 

 
function togglePause(e) { 
 
    if (raf) { 
 
    cancelAnimationFrame(raf); 
 
    raf = null; 
 
    window.removeEventListener("deviceorientation", processData); 
 
    } else { 
 
    window.addEventListener("deviceorientation", processData); 
 
    raf = requestAnimationFrame(updateText); 
 
    } 
 
}
body { 
 
    font: normal 30px/200% sans-serif; 
 
    margin: 20px; 
 
    cursor: default; 
 
} 
 
span { 
 
    font-size: 50px; 
 
    vertical-align: middle; 
 
}
<body> 
 
    alpha: <span id="alpha">null</span> 
 
    <br>beta: <span id="beta">null</span> 
 
    <br>gamma: <span id="gamma">null</span> 
 
    <br>[tap to pause/resume] 
 
</body>

https://jsfiddle.net/1us8p1ad/show

Мой вопрос: Как я могу предсказуемо трек влево/вправо ориентации устройства с помощью гамма? Гамма - единственное значение, о котором я забочусь - не требуется 3d-пространство.

Я рассмотрел использование матрицы вращения и кватерниона, как обсуждалось here, но не получивших действительных результатов. Фактически, примеры на странице github автора также ломаются, когда бета достигает 90deg! То же самое и с этим MDN tutorial - проверьте это на своем устройстве: когда он прямо вверх, мяч уходит в шок. Как эти аберрации остались незамеченными!

+0

Помогает ли это [CodePen] (https://codepen.io/u01jmg3/pen/WRxJEX)? Он использует углы Кватерниона по углам Эйлера, чтобы избежать блокировки карданного вала. – u01jmg3

+0

@ u01jmg3 благодарит за ваш ответ - этот код еще все еще сталкивается с проблемой блокировки - вы заметите, что если вы держите устройство прямо вверх и вниз, скручивание его не влияет. Напротив, если вы уложите свое устройство в плоское место, скручивание его влево/вправо приводит к желаемому результату. – calipoop

ответ

1

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

Моим решением было преобразовать значения альфа/бета/гамма в матрицу вращения, а затем извлечь данные из одного из значений матрицы. Код, который я использовал, получил here от W3C.

Примечание. Я пробовал использовать кватернионы, но полученные значения не были полезны для движения только в одном направлении.

+0

У вас есть код, который вы можете использовать, который производит матрицу вращения? – u01jmg3

+1

@ u01jmg3 конечно! Я обновил свой ответ, включив источник кода, который я использовал. Вся дискуссия на этой странице очень важна для понимания моей проблемы. – calipoop