19

从...开始...

window.addEventListener("deviceorientation", handleDeviceTilt);
function handleDeviceTilt(event){
// Here we can use event.beta, event.gamma
// Note that we don't need event.alpha because that's just the compass as we
// don't need to know which way is north to build a simple bubble-level app
// or similar apps.
}

...在这种情况下betagamma只要手机或平板电脑与地面平行(比如放在桌子上),这些值就很好用。但是当手机或平板电脑与墙壁平行时,我们无法获得现实的价值。gamma当设备直立/垂直(即纵向模式)时会变得特别疯狂,这是握住移动设备的最常见方式。

请通过查看此处的立方体来观察 Android 设备的问题

在此处输入图像描述

我们需要计算真实角度,以便我们可以在应用程序中准确使用倾斜信息。问题是,

为了解锁所谓的万向节锁,计算realBetarealGamma(可能通过使用Math.cos()和 或通过其他方法)之类的真实角度的最简单方法是什么?Math.sin()这可以在没有矩阵和/或四元数的情况下完成吗?我的猜测是“是”,因为 gamma 中的“失真”在某种程度上与 beta 成正比。如果四元数是唯一的解决方案,那么我们究竟如何获得realGammaactualGamma使用fixedCorrectGamma它们?

注 1:PlayStore 上有一个水平仪应用程序,可以完美显示设备的真实倾斜角度。所以有证据证明它是可行的。然而,截至 2021 年,似乎没有可用于此类用 javascript 编写的应用程序的开源代码。

注2:这里已经提到了这个问题。

注 3:精度是必需的。我们越接近精确的角度越好。alpha为简单起见可以省略。

这有什么用?

通过解决这个问题,我们可以deviceorientation用来制作类似的东西, 在此处输入图像描述


...或者例如,我们可以在垂直赛车游戏中使用伽玛来驾驶汽车。 在此处输入图像描述


您可以通过在移动设备上访问此处(或通过查找类似内容)来观察实际问题。打开显示 [显示方向角度] 的开关,观察 γ ( gamma)beta接近 90 度。还可以查看当您尝试将设备保持在完全直立的位置时 Gyro-Cube 会发生什么。

最后的想法,

我们可能需要一些神秘的数学魔法。

4

1 回答 1

-2

恐怕仅通过deviceorientation事件获得您正在寻找的信息是不可能的,因为您自己说的原因是:gimbal lock

有成群结队的数学家在这方面进行研究,我们可以从他们的研究中了解到,万向节锁定问题的唯一解决方案就是避免它:当我们开始靠得太近时,我们必须改变方法。

获得该角度的另一种方法(仅在手机几乎垂直时才有效,因此正是我们需要替代方法时)可能是使用devicemotion数据而不是deviceorientation数据。

window.addEventListener("devicemotion", event => {
  const { x } = event.accelerationIncludingGravity;

  const radiantsRes = Math.asin(x / 9.80665);
  const degreesRes = (radiantsRes * 180) / Math.PI;

  console.log(degreesRes.toFixed(2), radiantsRes.toFixed(10))
});

于 2021-11-06T18:27:54.560 回答