2012-01-18 12 views
2

だからアンドロイド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軸(画像の赤色)を表すベクトルを見つける必要があります。誰もこの変換を行う方法を知っていますか? Wikipediaの指示は非常に複雑で、私の試みはうまくいかない。また、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

0

あなたはgetRotationMatrixから受け取る姿勢行列は、重力場と磁気に基づくべきである(意味は、?見下ろすカメラがどのようなベクトルであるか、そしてどのようなベクトルは、「アップ」であることをカメラ考えるん)フィールド - 言い換えれば、Xは東、Y - 北、Zは地球の中心を指します。 (http://developer.android.com/reference/android/hardware/SensorManager.html)

質問のポイントまで、私は3つの回転値をベクトルとして直接使用することができますが、 "EulerまたはTait-Bryanのいずれの角度に対しても、組み込みの(回転軸)から外部(静的軸)の変換への変換は非常に簡単です。逆もまた同様です。 XYZ固有の規約を使用した(α、β、γ)回転は、ZYX外部慣習を使用した(γ、β、α)回転と同等で、これはすべてのオイラーまたはTait-Bryan軸の組み合わせに当てはまります。 ソースwikipedia

この情報が役立ちますようにお願いいたします。

+0

しかし、これらの3つの値はどのようなベクトルになりますか?カメラの前方、上方、右側の3種類のベクトルが必要です。 getRotationMatrix()によって返される行列には9個の値がありますが、必要な3つのベクトルに変換する方法を理解できません。 – Dasmowenator

2

Androidの回転行列は、本体(a.k.aデバイス)フレームからワールド(慣性フレーム)フレームへの回転を提供します。通常の背面を向いているカメラは、画面上にランドスケープモードで表示されます。電話で

camera_x_tablet_body = (1,0,0) 
camera_y_tablet_body = (0,1,0) 
camera_z_tablet_body = (0,0,1) 

、肖像画である左指すようになってネイティブモード、上部と風景にデバイスの回転である:これには、装置フレームの次の軸を有し、タブレットのネイティブモードです。

今([]サイズ9の回転行列Rのため)ので、世界のフレームでこれを置く回転行列を適用
camera_x_phone_body = (0,-1,0) 
camera_y_phone_body = (1,0,0) 
camera_z_phone_body = (0,0,1) 

:一般的に

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イベントを待機することです。これらは、ほとんどの(つまり、ジンジャーブレッドまたはそれより新しい)プラットフォームで可能な限り最良の方向性で満たされています。実際には四元数のベクトル部分です。あなたはこれを使用して完全な四元数を取得することができます(と最後の2行は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

関連する問題