所以在 Android SensorManager 中有几个方法可以获取手机的方向:
float[] rotational = new float[9];
float[] orientation = new float[3];
SensorManager.getRotationMatrix(rotational, whatever, whatever, whatever);
SensorManager.getOrientation(rotational, orientation);
这为您提供了一个称为“旋转”的旋转矩阵和一个称为“方向”的 3 个方向角的数组。但是,我不能在我的 AR 程序中使用角度 - 我需要的是代表轴的实际矢量。
例如,在这张来自维基百科的图片中:
我基本上得到了 α、β 和 γ 角(虽然不完全是因为我没有 N - 我得到了每个蓝色轴的角度),我需要找到代表的向量X、Y 和 Z 轴(图像中的红色)。有谁知道如何进行这种转换?维基百科上的说明非常复杂,我尝试按照它们进行操作,但没有奏效。此外,我认为 Android 为您提供的数据的顺序或格式可能与维基百科上的转换说明所期望的略有不同。
或者作为这些转换的替代方法,有谁知道从相机的角度获取 X、Y 和 Z 轴的其他方法吗? (意思是,相机向下看的向量是什么?相机认为“向上”的向量是什么?)
最佳答案
Android 中的旋转矩阵提供从 body (又名设备)框架到世界(又名惯性)框架的旋转。一个普通的后置摄像头以横向模式出现在屏幕上。这是平板电脑的 native 模式,因此设备框架中有以下轴:
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 事件。这些在大多数(即 Gingerbread 或更新的)平台上都充满了最佳方向。它实际上是四元数的向量部分。您可以使用它获得完整的四元数(最后两行是获得 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
关于Android:来自方向/旋转角度的轴向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8905000/