gpt4 book ai didi

android - 如何获得与人类方向匹配的Android手机方向?

转载 作者:IT老高 更新时间:2023-10-28 22:03:39 24 4
gpt4 key购买 nike

我正在制作一个 map 应用程序,包括显示你所面对方向的位置箭头,如下所示:

Map with a blue arrow

我直接从 SensorManager.getOrientation() 获取方向,使用第一个返回值:方位角。当握住手机使屏幕指向地平线上方并且纵向时,箭头可以正常工作。然而:

  • 当手持手机使屏幕指向地平线以下时,箭头指向的方向与用户所面对的方向相差 180 度。
  • 当您握住手机时,屏幕的朝向与地平线齐平,箭头不知道它指向的方向。 Azimuth 根本不会返回有意义的结果。
  • 当手机向左或向右倾斜(或以横向模式握住)时,箭头向左或向右倾斜。

下面精心构建且科学的图像显示了我的意思(其中蓝色是用户面向,红色是箭头方向,屏幕大致面向用户的面部,Google map 完全符合我的要求):

Graph of what happens vs what I want

(请注意,使用 Google map ,如果关闭自动旋转,它不会成功执行列表中的最后两个操作。但我什至还没有到那个阶段。一次一件事。)

看起来好像只是使用 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;
}

我做错了什么?有没有更简单的方法来做到这一点?

编辑:为了澄清,我假设用户将设备放在他们面前,并且屏幕指向他们。除此之外,我显然无法判断它们是否只有一个旋转。另外,我使用的是用户移动时的 Action ,但这是针对他们静止时的。

最佳答案

你调用 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;
}

假设手机平放,getOrientation 会为您提供正确的值。因此,如果手机垂直握持,则必须重新映射坐标才能获得平坦位置。在几何上,您将手机 -z 轴向下投影到世界 xy 平面,然后计算此投影向量与世界 y 轴之间的角度。

关于android - 如何获得与人类方向匹配的Android手机方向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10221567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com