2013-05-26 10 views
6

「回転ベクトルセンサー」の出力を正しく使用する方法を知りたいと思います。現在、私は次のことを考え出し、デバイスがどこを指しているのかを知るために、横向きモードで横になっているresult[]からヨーとピッチを計算したかったのです。しかし、私は結果に問題があります。ヨー演算はきわめて正確ですが、ピッチは奇妙な動作をしています。データの使い方を誰かが正しい方向に向けることができるかもしれません。私が知りたいもう一つのことは、デバイスの向き(横または縦)がこのセンサーの出力に影響を与えるかどうかということです。前もって感謝します。回転ベクトルセンサーの使用

private double max = Math.PI/2 - 0.01; 
private double min = -max; 

private float[] rotationVectorAction(float[] values) { 
    float[] result = new float[3]; 
    float vec[] = values; 
    float quat[] = new float[4]; 
    float[] orientation = new float[3]; 
    SensorManager.getQuaternionFromVector(quat, vec); 
    float[] rotMat = new float[9]; 
    SensorManager.getRotationMatrixFromVector(rotMat, quat); 
    SensorManager.getOrientation(rotMat, orientation); 
    result[0] = (float) orientation[0]; 
    result[1] = (float) orientation[1]; 
    result[2] = (float) orientation[2];  
    return result; 
} 

private void main() { 
    float[] result = rotationVectorAction(sensorInput); 
    yaw = result[0]; 
    pitch = result[1]; 
    pitch = (float) Math.max(min, pitch); 
    pitch = (float) Math.min(max, pitch); 
    float dx = (float) (Math.sin(yaw) * (-Math.cos(pitch))); 
    float dy = (float) Math.sin(pitch); 
    float dz = (float) (Math.cos(yaw) * Math.cos(pitch)); 
} 

とOpenGL ES 2.0に私の周りに私のカメラを移動するために、これを設定します。

Matrix.setLookAtM(mVMatrix, 0, 0, 0, 0, dx, dy, dz, 0, 1, 0); 

答えて

4

最後に私はそれを自分で解決しました。ピッチが適切に動作しない理由は、INPUTとOUTPUTとの差がSensorManager.getQuaternionFromVector(quat, vec);からです。この方法では、ベクトルvec(x|y|z|w)、出力quat(w|x|y|z)のようになります。私の場合、ちょうどquat配列の最初の値を最後に移動しなければならず、それは魅力的なように機能しました。

+2

コードを追加できますか?お願いします。 –

0

私はこの質問の一部に答えることができます。

センサの向きは、常にデバイスのデフォルトの向きに相対的であるため、センサの出力には影響しません。しかし、北を指しているコンパスの矢印のような画面上のものを描画するには、デバイスの向きを考慮する必要があります。なぜなら、デバイスが表示されているキャンバスの座標系が回転しているからです。デフォルトの方向。

+0

助けてくれてありがとう、私はこの部分を世話したと確信しています。 – dima

2

上記のソウルーションは私を助けませんでした。 をdocsとしています。SensorManager.getRotationMatrixFromVector()ROTATION_VECTORセンサーから返される回転ベクトルを求めています。

private float[] rotationVectorAction(float[] values) 
{ 
    float[] result = new float[3]; 
    float vec[] = values; 
    float[] orientation = new float[3]; 
    float[] rotMat = new float[9]; 
    SensorManager.getRotationMatrixFromVector(rotMat, vec); 
    SensorManager.getOrientation(rotMat, orientation); 
    result[0] = (float) orientation[0]; //Yaw 
    result[1] = (float) orientation[1]; //Pitch 
    result[2] = (float) orientation[2]; //Roll 
    return result; 
} 
+0

ありがとう!すごい仕事! –

関連する問題