我正在创建一个地图应用程序,包括显示您面向哪个方向的位置箭头,如下所示:
我SensorManager.getOrientation()
使用第一个返回值:azimuth 直接从中获取方向.当手机被按住以使屏幕指向地平线以上时,并且在纵向中,箭头正常工作.然而:
下面精心构造和科学的图像显示了我的意思(蓝色是用户面对的,红色是箭头方向,屏幕大致面向用户的脸,Google地图完全符合我的要求):
(请注意,使用谷歌地图,如果自动旋转关闭,它就无法成功执行列表中的最后两个操作.但我甚至还没有达到那个阶段.一次只做一件事.)
它似乎只是使用Y轴指向方向,如下所示:http://developer.android.com/reference/android/hardware/SensorEvent.html,当我希望它使用Z轴指向的反向,大部分时间,和手机平坦时的Y. 但是,考虑到getOrientation()
返回的值,我必须编写复杂的案例来解决一些问题,而面向电话的用例是无法解决的.我确信有一种更简单的方法.
这是我的代码(其中lastAcceleration和lastMagneticField都来自内部传感器):
float[] rotationMatrix = new float[9];
if(SensorManager.getRotationMatrix(rotationMatrix, null, lastAcceleration, lastMagneticField)){
float[] orientMatrix = new float[3];
SensorManager.getOrientation(rotationMatrix, orientMatrix);
orientation = orientMat[0]*180/(float)Math.PI;
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?有更简单的方法吗?
编辑:只是为了澄清,我假设用户正在将设备放在他们面前,屏幕指向他们.除此之外,我显然无法分辨是否只有其中一个旋转.此外,我正在使用用户移动时的动作,但这是在他们静止的时候.
你有没有调用remapCoordinateSystem?否则,只有在垂直握住手机时才能获得正确的值.对于这种情况当手机被按住,因此屏幕的面向水平与地平线,你无法让用户面对.因为要获得面,你必须将传感器读数的z值投影到世界坐标的xy平面中,当设备水平放置时它为零.
更准确地说,如果你想让手机朝向,那么手机必须与水平方向倾斜至少约25度,你必须调用remapCoordinateSystem.以下代码将为您提供上面最后2张图片的所需内容.
码
float[] rotationMatrix = new float[9];
if(SensorManager.getRotationMatrix(rotationMatrix, null, lastAcceleration, lastMagneticField)){
float[] orientMatrix = new float[3];
float remapMatrix = new float[9];
SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, remapMatrix);
SensorManager.getOrientation(remapMatrix, orientMatrix);
orientation = orientMat[0]*180/(float)Math.PI;
}
Run Code Online (Sandbox Code Playgroud)
假设手机平放,getOrientation会为您提供正确的值.因此,如果手机垂直握持,则必须重新映射坐标以获得平坦位置.在几何上,您将手机-z轴向下投影到世界xy平面,然后计算此投影向量与世界y轴之间的角度.
这看起来很棘手。我正在为 Android 开发一个 PNS,并且面临着一个类似的问题,我仍然需要光线:如何获得加速度计轴和运动矢量之间的旋转?
\n\n问题是,在我看来,如果用户不移动,绝对不可能找到用户面对的方向(而不是设备)。也就是说,人类身上没有传感器,那么如果设备保持在绝对相同的位置但用户旋转了 90\xc2\xb0 呢?我看不出有什么办法可以找到这个。
\n\n我可以建议(这实际上适合我的问题)是你可以(我不知道你在代码中实际做了什么)使用用户的动作来确定他的标题。让我解释。假设您有一个第一个位置 A。用户前往 B。然后您可以构建 AB 向量并获取用户在 B 处停止时的航向。然后您必须将代码限制为方向到达目的地时他所面对的。
\n\n我知道这不如谷歌地图那么好,但你知道谷歌为此使用了什么吗?我的意思是他们只使用加速器和磁场传感器吗?
\n 归档时间: |
|
查看次数: |
9940 次 |
最近记录: |