我正在开发一款需要根据设备的位置和方向移动图像的AR应用。
似乎Game Rotation Vector应该提供必要的数据来实现这一目标。 但是我似乎无法理解从GRV传感器获得的值是什么。例如,为了在Z轴上达到相同的值,我必须将设备旋转720度。这看起来很奇怪。
如果我能以某种方式将这些数字转换为从设备的参考系朝向x,y,z坐标的角度,我的问题就会得到解决。
我已经搜索了这个问题好几天了,没有找到任何有关GRV坐标含义以及如何使用它们的明智信息。
TL:DR GRV传感器的数量显示了什么?以及如何将它们转换为角度?
答案 0 :(得分:8)
作为docs状态,GRV传感器返回3D旋转矢量。这表示为三个组件编号,由下式给出:
x axis (x * sin(θ/2))
y axis (y * sin(θ/2))
z axis (z * sin(θ/2))
然而这令人困惑。每个分量都围绕该轴旋转,因此每个角度(θ,发音为θ)实际上是一个不同的角度,根本不清楚。
另请注意,在处理角度时,特别是在3D中,我们通常使用弧度,而不是度,因此theta是弧度。 This看起来是一个很好的介绍性解释。
但是它以格式给出的原因是它可以很容易地用于矩阵旋转,特别是作为quaternion。实际上,这些是四元数的前三个组件,即指定旋转的组件。第四个分量指定幅度,即距离原点(0,0)一点多远。因此,四元数将一般旋转信息转换为空间中的实际点。
这些可直接用于OpenGL,它是Android(以及世界其他地区)的3D库选择。检查this tutorial以获取一些OpenGL轮换信息,this one获取适用于一般四维编程的一般四元数理论,以及Google for Android的this example,其中显示了如何直接使用此信息
如果您阅读这些文章,您可以看到为什么以这种形式获得它以及为什么它被称为游戏旋转矢量 - 这就是3D程序员在此时使用数十年的游戏。
TLDR; This example非常好。
编辑 - 如何使用它来显示在3D空间中由此向量旋转的2D图像。
在上面的示例中,SensorManage.getRotationMatrixFromVector
将游戏旋转向量转换为旋转矩阵,可应用于旋转3D中的任何 。要将此旋转应用于2D图像,您必须考虑3D中的图像,因此它实际上是一个平面的一段,就像一张纸。因此,您将图像(在行话中称为纹理)映射到此平面线段上。
Here是一个关于OpenGL for Android中纹理化多维数据集的教程,带有示例代码和深入讨论。从立方体到飞机段只是一小步 - 它只是一个立方体的一个面!事实上,这是一个很好的资源,可以在Android上掌握OpenGL,我建议您阅读上一个和后续的教程步骤。
正如你提到的那样翻译。查看Google代码示例中的onDrawFrame
方法。请注意,使用gl.glTranslatef
和进行翻译,然后使用gl.glMultMatrixf
进行轮换。这就是你翻译和旋转的方式。
这些操作的应用顺序很重要。这是一种有趣的实验方法,请查看Livecodelab,这是一个在浏览器中运行的实时3D草图编码环境。特别是this tutorial鼓励对行动的顺序进行反思。显然,命令move
是一种翻译。