我已经编写了一个JS SDK,监听移动设备的旋转,并提供3个输入:
α:角度范围在0到360度之间
β:角度范围在-180到180度之间
γ:角度范围在-90到90度之间。
关于设备旋转的文档请参考此处。
我尝试使用欧拉角确定设备的方向,但遇到了万向节锁定效应,当设备朝上时,计算会失控。这促使我使用四元数,它不受万向锁定效应的影响。
我发现这个js库可以将α、β和γ转换为四元数,因此对于以下值:
α:81.7324
β:74.8036
γ:-84.3221
我得到了ZXY 顺序的四元数:
w : 0.7120695154301472
x : 0.6893688637611577
y : -0.10864439143062626
z : 0.07696733776346154
代码:
使用从四元数反射正确设备方向得出的4D CSS矩阵来可视化设备方向(演示,使用移动设备):
使用欧拉角和开发者工具进行错误可视化(演示,使用移动设备):
我想编写一个方法,输入α、β和γ,并输出设备是否处于以下任一方向之一:
- 竖屏 - 倒立竖屏 - 左横屏 - 右横屏 - 屏幕朝上 - 屏幕朝下
将每个方向定义为围绕相关轴的±45°范围。
我应该采取什么方法?
α:角度范围在0到360度之间
β:角度范围在-180到180度之间
γ:角度范围在-90到90度之间。
关于设备旋转的文档请参考此处。
我尝试使用欧拉角确定设备的方向,但遇到了万向节锁定效应,当设备朝上时,计算会失控。这促使我使用四元数,它不受万向锁定效应的影响。
我发现这个js库可以将α、β和γ转换为四元数,因此对于以下值:
α: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矩阵来可视化设备方向(演示,使用移动设备):
![这里输入图片描述](https://istack.dev59.com/zn8BF.webp)
![这里输入图片描述](https://istack.dev59.com/HDrnt.webp)
- 竖屏 - 倒立竖屏 - 左横屏 - 右横屏 - 屏幕朝上 - 屏幕朝下
将每个方向定义为围绕相关轴的±45°范围。
我应该采取什么方法?