如何在 Android 中使用 Game Rotation Vector 中的数字?

How to use the numbers from Game Rotation Vector in Android?

我正在开发一个 AR 应用程序,它需要根据设备的位置和方向移动图像。

看来 Game Rotation Vector 应该提供必要的数据来实现这一点。 但是我似乎无法理解我从 GRV 传感器获得的值显示了什么。例如,为了在 Z 轴上达到相同的值,我必须将设备旋转 720 度。这似乎很奇怪。

如果我能以某种方式将这些数字转换为从设备参考系到 x、y、z 坐标的角度,我的问题就会得到解决。

我用谷歌搜索了这个问题好几天了,但没有找到任何关于 GRV 坐标的含义以及如何使用它们的合理信息。

TL:DR GRV 传感器的数字表示什么?以及如何将它们转换为角度?

作为docs状态,GRV传感器返回一个3D旋转矢量。这表示为组成它的三个组件编号,由下式给出:

  1. x axis (x * sin(θ/2))
  2. y axis (y * sin(θ/2))
  3. z axis (z * sin(θ/2))

然而,这令人困惑。每个分量都是围绕该轴的旋转,因此每个角度(θ 发音为 theta)实际上是一个不同的角度,这一点根本不清楚。

另请注意,在处理角度时,尤其是在 3D 中,我们通常使用弧度而不是度数,因此 theta 以弧度为单位。 This 看起来是一个很好的介绍性解释。

但之所以以格式提供给我们,是因为它可以很容易地用于矩阵旋转,尤其是作为 quaternion。事实上,这些 四元数的前三个分量,这些分量指定旋转。第 4 个分量指定幅度,即它离原点 (0, 0) 有多远。因此四元数将一般旋转信息转换为 space.

中的实际点

这些可以直接在 OpenGL 中使用,OpenGL 是 Android(以及世界其他地方的)首选 3D 库。检查 Google 的 this tutorial out for some OpenGL rotations info, this one for some general quaternion theory as applied to 3D programming in general, and this example 是否有 Android,它确切地显示了如何直接使用此信息。

如果您阅读了这些文章,就会明白为什么以这种形式获得它以及为什么将其称为游戏旋转矢量 - 这是 3D 程序员几十年来在游戏中使用的东西。

TLDR; This example 非常棒。

Edit - 如何使用它来显示由该矢量在 3D 中旋转的 2D 图像 space。

在上面的示例中,SensorManage.getRo‌tationMatrixFromVecto‌r 将游戏旋转矢量转换为旋转矩阵,可用于在 3D 中旋转任何东西。要将此旋转应用于 2D 图像,您必须考虑 3D 图像,因此它实际上是平面的一部分,如 sheet 纸。因此,您可以将图像(在行话中称为纹理)映射到该平面段上。

Here 是 Android 的 OpenGL 纹理立方体教程,包含示例代码和深入讨论。从立方体到平面部分只有一小步——它只是立方体的一个面!事实上,这是在 Android 上掌握 OpenGL 的好资源,我建议您也阅读之前和后续的教程步骤。

正如你提到的翻译。查看 Google 代码示例中的 onDrawFrame 方法。请注意,有使用 gl.glTranslatef 的翻译,然后 使用 gl.glMultMatrixf 的旋转。这就是平移和旋转的方式。

应用这些操作的顺序很重要。这是一个有趣的试验方法,查看 Livecodelab, a live 3D sketch coding environment which runs inside your browser. In particular this tutorial 鼓励对操作顺序的反思。显然命令move是一个翻译