【发布时间】:2019-11-08 04:48:11
【问题描述】:
我编写了一个监听移动设备旋转的 JS SDK,提供 3 个输入:
α : 角度可以在 0 到 360 度之间
β : -180 到 180 度之间的角度
γ : -90 到 90 度之间的角度
Documentation for device rotation
我曾尝试使用欧拉角来确定设备方向,但遇到了gimbal lock effect,当设备指向上方时计算会爆炸。这导致我使用Quaternion,它不受云台锁定效果的影响。
我发现 this js library 将 α、β 和 γ 转换为四元数,因此对于以下值:
α : 81.7324
β : 74.8036
γ : -84.3221
我得到了 ZXY 顺序的这个四元数:
w:0.7120695154301472
x:0.6893688637611577
y:-0.10864439143062626
z:0.07696733776346154
代码:
var rad = Math.PI / 180;
window.addEventListener("deviceorientation", function(ev) {
// Update the rotation object
var q = Quaternion.fromEuler(ev.alpha * rad, ev.beta * rad, ev.gamma * rad, 'ZXY');
// Set the CSS style to the element you want to rotate
elm.style.transform = "matrix3d(" + q.conjugate().toMatrix4() + ")";
}, true);
使用从四元数派生的 4d CSS 矩阵可视化设备方向反映了正确的设备方向 (DEMO, use mobile):
错误使用 Euler Angels 和开发人员工具 (DEMO, use mobile) 进行可视化:
我想编写一个方法来获取 α、β 和 γ 并在设备处于以下方向之一时输出:
- 肖像
- 倒立的肖像
- 横向左侧
- 横向右侧
- 显示出来
- 向下显示
将每个方向定义为围绕相关轴的 +- 45° 范围。
我应该采取什么方法?
【问题讨论】:
标签: javascript android ios mobile sensors