2012-01-18 124 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