1

興味深い問題があります。ユーザーが携帯電話を横向き、縦向き、またはその間のどこに持っているかに関係なく、その角度を追跡しようとしています..

現在、SENSOR_ORIENTATION を使用して、ヨー、ロール、およびピッチを取得しています。また、ヨーを使用してz軸上のユーザーのビューポートの角度を取得しようとしており、ユーザーのロール(横、縦、またはその間)を修正するために、いくつかの簡単な計算を行いました..:

double roll = phoneOri.getRoll();
double yaw = phoneOri.getYaw()+roll;

     if (yaw>=360){
                yaw = (yaw - 360);
            }
            if (yaw<0){
                yaw = (yaw+360);    
            }

このコードはヨーを修正し、ロール位置が何であれ適切な角度を与えてくれます..
しかし、この種の数学はピッチを修正していないようです. 携帯電話を床に対して垂直に持っている場合、ロールやヨーに関係なく、常にピッチを 0 にしたいです。携帯電話の背面を空に向けて地面と平行にまっすぐに向けた場合、90 になりたいです。地面 -90;

ピッチロールとヨーを取得する方法は次のとおりです。

    double yaw;
    double pitch;
    double roll;

public void onSensorChanged(SensorEvent evt) {
            int type=evt.sensor.getType();
            if(type == Sensor.TYPE_ORIENTATION){
                yaw = evt.values[0];
                pitch = evt.values[1];
                roll = evt.values[2];
            }
            if (type == Sensor.TYPE_MAGNETIC_FIELD) {
                orientation[0]=(orientation[0]*1+evt.values[0])*0.5f;
                orientation[1]=(orientation[1]*1+evt.values[1])*0.5f;
                orientation[2]=(orientation[2]*1+evt.values[2])*0.5f;
            } else if (type == Sensor.TYPE_ACCELEROMETER) {
                acceleration[0]=(acceleration[0]*2+evt.values[0])*0.33334f;
                acceleration[1]=(acceleration[1]*2+evt.values[1])*0.33334f;
                acceleration[2]=(acceleration[2]*2+evt.values[2])*0.33334f;
            }
            if ((type==Sensor.TYPE_MAGNETIC_FIELD) || (type==Sensor.TYPE_ACCELEROMETER)) {
                float newMat[]=new float[16];

                //Toast toast = Toast.makeText(ctx.getApplicationContext(), "accel", Toast.LENGTH_SHORT);
                //toast.show();
                SensorManager.getRotationMatrix(newMat, null, acceleration, orientation);
                if(displayOri==0||displayOri==2){
                    SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_X*-1, SensorManager.AXIS_MINUS_Y*-1,newMat);
                }else{
                    SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X,newMat);
                }

                matrix=newMat;
                SensorManager.getOrientation (newMat, orientationValues); 
            }
        }

現在、次の結果が得られます。

ピッチ = -90ロール = 0 ;

ここに画像の説明を入力

ピッチ = 0ロール = 90 ;

ここに画像の説明を入力

ピッチ = 90ロール = -20 ;

ここに画像の説明を入力

ピッチ = 0ロール = -90 ;

これらの位置のいずれかで 0 のピッチを取得しようとしていますが、ユーザーが HORIZON 軸で電話を傾けると、それぞれ -90 から 90 の間のピッチを取得しようとしていますか?

何か案は?ああ、私のアプリケーションが横向きモードにロックされていることを追加する必要があります..

4

2 に答える 2

1

これらの定数には、おそらく累積エラーがあります。代わりに数学関数を使用してみてください...

于 2012-07-18T02:24:15.087 に答える
-1

興味深い問題、

ここで述べたように、(電話の向きに関係なく) x、y、z の絶対値を取得しようとしましたか?それを使用して、探している絶対 y 値を取得する必要があります。

public abstract void onSensorChanged (int センサー、float[] 値)

> 重要な注意: デバイスの画面の向きが変わると、軸が入れ替わります。スワップされていない値にアクセスするには、values[] でインデックス 3、4、および 5 を使用します。

于 2012-07-13T19:15:04.993 に答える