因此,Android SensorManager中有几种方法可以让您的手机获得方向:
float[] rotational = new float[9];
float[] orientation = new float[3];
SensorManager.getRotationMatrix(rotational, whatever, whatever, whatever);
SensorManager.getOrientation(rotational, orientation);
这为您提供了一个名为“rotation”的旋转矩阵和一个名为“orientation”的3个方向角的数组。但是,我不能在我的AR程序中使用角度 - 我需要的是代表轴的实际矢量。
例如,在维基百科的这张图片中:
我基本上被赋予了α,β和γ角(虽然不完全是因为我没有N - 我被赋予了每个蓝轴的角度),我需要找到代表的向量X,Y和Z轴(图像中的红色)。有谁知道如何进行这种转换?维基百科上的指示非常复杂,我试图遵循它们并没有奏效。此外,我认为Android提供的数据可能与维基百科所期望的转换方向略有不同。
或者作为这些转换的替代方案,有没有人知道从相机的角度来看X,Y和Z轴的任何其他方法? (意思是,相机向下看什么向量?相机认为哪个向量“向上”?)
答案 0 :(得分:3)
Android中的旋转矩阵提供从body(a.k.a设备)框架到世界(a.k.a. inertial)框架的旋转。在屏幕上以横向模式显示正常的后置摄像头。这是平板电脑的原生模式,因此设备框架中有以下轴:
camera_x_tablet_body = (1,0,0)
camera_y_tablet_body = (0,1,0)
camera_z_tablet_body = (0,0,1)
在手机上,肖像是纯模式,将设备旋转到横向,顶部转向左侧是:
camera_x_phone_body = (0,-1,0)
camera_y_phone_body = (1,0,0)
camera_z_phone_body = (0,0,1)
现在应用旋转矩阵将把它放在世界框架中,所以(对于大小为9的旋转矩阵R []):
camera_x_tablet_world = (R[0],R[3],R[6]);
camera_y_tablet_world = (R[1],R[4],R[7]);
camera_z_tablet_world = (R[2],R[5],R[8]);
通常,您可以使用SensorManager.remapCoordinateSystem(),对于上面的电话示例,它将是Display.getRotation()= Surface.ROTATION_90并给出您提供的答案。 但如果你以不同的方式旋转(例如ROTATION_270)则会有所不同。
另外,另外一点:在Android中获取方向的最佳方法是侦听Sensor.TYPE_ROTATION_VECTOR事件。这些在大多数(即姜饼或更新的)平台上充满了最佳可能的方向。它实际上是四元数的向量部分。您可以使用此方法获取完整的四元数(最后两行是获取RotationMatrix的方法):
float vec[] = event.values.clone();
float quat[] = new float[4];
SensorManager.getQuaternionFromVector(quat, vec);
float [] RotMat = new float[9];
SensorManager.getRotationMatrixFromVector(RotMat, quat);
有关详情,请访问:http://www.sensorplatforms.com/which-sensors-in-android-gets-direct-input-what-are-virtual-sensors
答案 1 :(得分:1)
SensorManager.getRotationMatrix(rotational, null, gravityVals, geoMagVals);
// camera's x-axis
Vector u = new Vector(-rotational[1], -rotational[4], -rotational[7]); // right of phone (in landscape mode)
// camera's y-axis
Vector v = new Vector(rotational[0], rotational[3], rotational[6]); // top of phone (in landscape mode)
// camera's z-axis (negative into the scene)
Vector n = new Vector(rotational[2], rotational[5], rotational[8]); // front of phone (the screen)
// world axes (x,y,z):
// +x is East
// +y is North
// +z is sky
答案 2 :(得分:0)
你从getRotationMatrix收到的方向矩阵应该基于重力场和磁场 - 换句话说X点是东,Y - 北,Z - 地球的中心。 (http://developer.android.com/reference/android/hardware/SensorManager.html)
就你的问题而言,我认为三个旋转值可以直接用作向量,但是以相反的顺序提供值: “对于Euler或Tait-Bryan角度,从内在(旋转轴)转换为外在(静态轴)约定非常简单,反之亦然:只需交换操作的顺序。(α,β) ,γ)使用XYZ内在约定的旋转等效于使用ZYX外在约定的(γ,β,α)旋转;对于所有Euler或Tait-Bryan轴组合都是如此。 来源wikipedia
我希望这有帮助!