API演示->图形->指南针
只有在不更改设备自然方向时才能正常工作。大多数手机是竖屏,大多数10英寸平板电脑是横屏。如果您更改了方向,则需要将其旋转90度。我希望看到这个系统的三维解决方案。
100%确定需要使用remapCoordinateSystem()方法。
如果我能看到说明如何计算这些轴映射(理论数学)的代码,那就太好了。
我试图理解,但我忘记了所有线性代数知识。
在这里它说为什么我们必须使用,但没有告诉我们如何!
float R[] = new float[9];
// X (product of Y and Z) and roughly points East
// Y: points to Magnetic NORTH and tangential to ground
// Z: points to SKY and perpendicular to ground
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
看起来这些坐标是指这个位置:- 设备在桌子上放置(x 和 y 轴在桌子上)
只有当
getWindowManager().getDefaultDisplay().getRotation() == Surface.ROTATION_0
问题是如何完成这段代码:-那些 case 分支。
switch (mScreenRotation) {
case Surface.ROTATION_0:
Log.v("SurfaceRemap", "0 degree");
axisX = SensorManager.AXIS_X;// is this valid?
axisY = SensorManager.AXIS_Y;// is this valid?
break;
case Surface.ROTATION_90:
Log.v("SurfaceRemap", "90 degree");
// examples says remapCoordinateSystem(inR, AXIS_Y, AXIS_MINUS_X, outR);
axisX = SensorManager.AXIS_Y;
axisY = SensorManager.AXIS_MINUS_X;
break;
case Surface.ROTATION_180:
Log.v("SurfaceRemap", "180 degree");
break;
case Surface.ROTATION_270:
Log.v("SurfaceRemap", "270 degree");
break;
default:
Log.v("SurfaceRemap", "don't know the mScreenRotation value: "+mScreenRotation+" you should never seen this message!");
break;
}
boolean remapped = SensorManager.remapCoordinateSystem(R, axisX, axisY, R);
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);// All three angles above are in radians and positive in the counter-clockwise direction.
inclination = SensorManager.getInclination(I);
编辑: 我编写了一个小测试应用程序,在屏幕上显示屏幕旋转:0、90、270度(现在无法进行180度的旋转)。
看起来,如果旋转0没有改变(axisX = SensorManager.AXIS_X; axisY = SensorManager.AXIS_Y;
),那么90度应该是:
axisX = SensorManager.AXIS_MINUS_Y;
axisY = SensorManager.AXIS_X;
谷歌文档中存在错误数值!问题在哪里?!
getRotationMatrix 返回以下结果:
X被定义为向量积Y.Z(它切向设备当前位置的地面并大致指向东方)。
Y在设备当前位置的地面上切向并指向磁北极。
Z指向天空并垂直于地面。
看上面的手机!我想从左到右,背后相机对准地面。
getOrientation 返回以下结果:
X被定义为向量积Y.Z(它切向设备当前位置的地面并大致指向西方)。
Y在设备当前位置的地面上切向并指向磁北极。
Z指向地球中心并垂直于地面。
values[0]
: 方位角,绕Z轴旋转。
values[1]
: 俯仰角,绕X轴旋转。
values[2]
: 横滚角,绕Y轴旋转。
手机应该怎么摆放?
最后我想要像飞机一样的角度数值。我的手机(我)朝向北方:(偏航角是方位角)
if ScreenRotation = 0 degree
Pitch axis = -orientationAxisX = rotationAxisX
Roll axis = orientationAxisY = rotationAxisY
Yaw axis = orientationAxisZ = -rotationAxisZ
axisZ = SensorManager.AXIS_Y
添加到屏幕旋转中?因此,如果屏幕被旋转,方位角和俯仰角在相机(AR)位置仍然可以正常工作? - unlimited101