如何使用Android中游戏旋转矢量中的数字?

Mik*_*e G 2 android vector accelerometer augmented-reality gyroscope

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

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

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

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

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

r3f*_*Utr 8

正如文档所述,GRV传感器返回3D旋转矢量.这表示为三个组件编号,由下式给出:

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

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

另请注意,在处理角度时,特别是在3D中,我们通常使用弧度,而不是度,因此theta是弧度.看起来像一个很好的介绍性解释.

但是它以格式给出的原因是它可以很容易地用于矩阵旋转,特别是作为四元数.实际上,这些四元数的前三个组件,即指定旋转的组件.第4个分量指定幅度,即距离原点(0,0)的距离.因此四元数将一般旋转信息转换为空间中的实际点.

这些可直接用于OpenGL,这是Android(以及世界其他地方)的3D库选择.查看本教程中的一些OpenGL轮换信息,这个适用于一般四元数理论,适用于一般的3D编程,以及Google for Android的这个例子,它直接显示了如何使用这些信息.

如果您阅读这些文章,您可以看到为什么以这种形式获得它以及为什么它被称为游戏旋转矢量 - 这就是3D程序员此时已经使用了几十年的游戏.

TLDR; 这个例子很棒.

编辑 - 如何使用它来显示在3D空间中由此向量旋转的2D图像.

在上面的示例中,SensorManage.getRo?tationMatrixFromVecto?r将游戏旋转矢量转换为旋转矩阵,可以应用于旋转3D中的任何内容.要将此旋转应用于2D图像,您必须考虑3D中的图像,因此它实际上是一个平面的一段,就像一张纸.因此,您将图像(在行话中称为纹理)映射到此平面线段上.

是一个关于OpenGL for Android中纹理化多维数据集的教程,包含示例代码和深入讨论.从立方体到飞机段只是一小步 - 它只是一个立方体的一个面!事实上,这是在Android上掌握OpenGL的一个很好的资源,我建议您也阅读上一个和后续的教程步骤.

正如你提到的翻译也.请查看onDrawFrameGoogle代码示例中的方法.请注意,有使用转换gl.glTranslatef利用旋转gl.glMultMatrixf.这是您翻译和旋转的方式.

重要的是这些操作的应用顺序.这是一个有趣的实验方法,请查看Livecodelab,这是一个在浏览器中运行的实时3D草图编码环境.特别是本教程鼓励对操作的顺序进行反思.显然命令move是翻译.

  • 在此答案中对四元数的描述有点令人困惑,甚至可能是错误的。如果我们表示“四元数的虚部”,即GRV报告的三个条目,符号v = [x,y,z],则向量v / || v || 是定义“旋转轴”的单位向量。角度2arcsin || v || $是相对于Android开发人员网站上提供的固定全局框架,设备已绕着该轴逆时针旋转的逆时针角度。 (2认同)