2012-01-18 121 views
2

所以这是在Android的SensorManager几个方法,让您的手机的定位:Android:从方向/旋转角度的轴矢量?

float[] rotational = new float[9]; 
float[] orientation = new float[3]; 
SensorManager.getRotationMatrix(rotational, whatever, whatever, whatever); 
SensorManager.getOrientation(rotational, orientation); 

这给你所谓的“旋转”旋转矩阵和3个方向角的阵列称为“方向”。但是,我不能在我的AR程序中使用角度 - 我需要的是代表轴的实际矢量。

例如,在维基百科这一形象:
Euler Angles from Wikipedia
我基本上报错α,β,γ角(虽然不完全是因为我没有一个N - 我被给予每个蓝轴的角度),我需要找到代表X,Y和Z轴的向量(图像中的红色)。有谁知道如何做这种转换?维基百科上的指示非常复杂,我试图遵循它们的方法并未奏效。另外,我认为Android给您的数据可能与维基百科的转换方向预期的顺序或格式略有不同。或者作为这些转换的替代方案,有没有人知道从照相机的角度来获取X,Y和Z轴的其他方法? (意思是,什么载体是相机低头?什么载体并相机认为是“涨”?)

回答

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 
+0

编辑:我想这会工作,但它不会 – Dasmowenator 2012-04-16 03:22:06

0

您从getRotationMatrix收到方向矩阵应根据重力场和磁场场 - 换句话说X点东,Y - 北,Z - 地球的中心。 (http://developer.android.com/reference/android/hardware/SensorManager.html)

为了您的问题,我认为三个旋转值可以直接作为一个向量使用,但提供的值相反的顺序: “对于Euler或Tait-Bryan角度,从内在(旋转轴)转换为外部(静态轴)惯例非常简单,反之亦然:只需交换操作的顺序即可。使用XYZ内在约定的(α,β,γ)旋转相当于使用ZYX外部惯例的(γ,β,α)旋转;所有Euler或Tait-Bryan轴组合都适用。 来源wikipedia

我希望这有助于!

+0

但这3个值给你什么矢量?我需要3种不同的矢量 - 相机的前进,上和右矢量。由getRotationMatrix()返回的矩阵有9个值...但我无法弄清楚如何将它们转换为我需要的3个向量。 – Dasmowenator 2012-04-16 02:59:20

2

Android中的旋转矩阵提供从主体(也称为设备)框架到世界(又名惯性)框架的旋转。屏幕上以横向模式显示普通的背面照相机。这是一个平板纯模式,所以具有在装置框架下面轴:

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) 

现在将所述旋转矩阵会把这个世界帧,所以(对于旋转矩阵R []大小9):

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.remapCoor dinateSystem()对于上面的电话例子来说是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