Вот как это делается в хроме и хроме:
codepen
Существенная часть состоит в том, что когда мы применяем gamma
преобразование угла, осьуже повернут предыдущим beta
преобразованием угла.Поэтому нам нужно применить угол поворота гаммы не к оси (0, 0, 1)
, а к преобразованной оси, которая учитывает угол бета.
Источник:
function degreesToRadians (deg) {
return deg * Math.PI / 180;
}
class EulerAngles {
constructor(alpha, beta, gamma) {
this.alpha = alpha;
this.beta = beta;
this.gamma = gamma;
}
toRotate3DString() {
const gammaAxisY = -Math.sin(degreesToRadians(this.beta));
const gammaAxisZ = Math.cos(degreesToRadians(this.beta));
const axis = {
alpha: [0, 1, 0],
beta: [-1, 0, 0],
gamma: [0, gammaAxisY, gammaAxisZ]
};
return (
"rotate3d(" +
axis.alpha.join(",") +
"," +
this.alpha +
"deg) " +
"rotate3d(" +
axis.beta.join(",") +
"," +
this.beta +
"deg) " +
"rotate3d(" +
axis.gamma.join(",") +
"," +
this.gamma +
"deg)"
);
}
}
function ready(fn) {
if (
document.attachEvent
? document.readyState === "complete"
: document.readyState !== "loading"
) {
fn();
} else {
document.addEventListener("DOMContentLoaded", fn);
}
}
ready(() => {
let phone = document.querySelector(".phone");
window.addEventListener("deviceorientation", event => {
console.log(event);
const eulerAngles = new EulerAngles(event.alpha, -90 + event.beta, event.gamma)
phone.style.transform = eulerAngles.toRotate3DString();
});
});