我尝试使用deviceorientation事件实现一个指南针。我想使用旋转来旋转一个面向观看方向的箭头。当deviceorientation发生变化时,我只是在旋转图像。
在iOS上,通过执行以下操作,这就像魅力一样工作:
if (typeof DeviceOrientationEvent.requestPermission === "function") {
//@ts-ignore
DeviceOrientationEvent.requestPermission()
.then(permissionState => {
if (permissionState === "granted") {
this.compassActive = true;
window.addEventListener(
"deviceorientation",
eventData =>
this.zone.run(() => {
if(!this.compassActive){
return false;
}
//@ts-ignore
this.rotatePlayerIcon(eventData.webkitCompassHeading);
}),
false
);
}
})
.catch(console.error);因为DeviceOrientationEvent.webkitCompassHeading给了我一个顺时针世界的显示装置的旋转。
我在Android上也尝试过同样的方法,但是我找不到一个基于世界的解决方案。webkitCompassHeading在android上不存在,所以我尝试只使用eventData.alpha。但这给出了0的基础上的旋转,它是当事件是发射,而不是基于世界北部。
我发现的所有指南似乎都过时了。
我如何在机器人上得到顺时针方向的指南针,就像在iOS上那样?
发布于 2020-03-15 15:31:51
问题是alpha不是绝对的,意味着0不是北的,而是0是设备在激活时所指向的位置。
修复基于铬的浏览器的最佳方法,就像大多数标准的Android浏览器一样,使用来自AbsoluteOrientationSensor的W3C通用传感器API多填充。Github
我所用的项目是基于打字本的。下面是一个打字稿的例子:
import {AbsoluteOrientationSensor} from 'motion-sensors-polyfill'
const options = { frequency: 60, referenceFrame: 'device' };
const sensor = new AbsoluteOrientationSensor(options);
sensor.addEventListener('reading', e => {
this.zone.run(() => {
var q = e.target.quaternion;
let alpha = Math.atan2(2*q[0]*q[1] + 2*q[2]*q[3], 1 - 2*q[1]*q[1] - 2*q[2]*q[2])*(180/Math.PI);
if(alpha < 0) alpha = 360+ alpha;
this.alpha = 360 - alpha;
this.rotatePlayerIcon(360 - alpha)
})
});
sensor.start();发布于 2020-03-10 19:39:10
贝娄,你会看到一个指南针的vtm地图。它还包括一个箭头。除了通常的磁强计-加速度计传感器,我建议使用位置轴承,因为传感器一点也不准确,而且很容易得到disrupted.the的指南针,好处是它包括代码,使它旋转平稳,因为传感器的原始输出经常是噪音。
对于这代码来说,它是vtm-mapsforge罗盘的原始版本。
https://stackoverflow.com/questions/60624644
复制相似问题