1

Android 用のシンプルな拡張現実ツールを実装しようとしています。必要なのは、自分の位置とデバイスの向き、および別のデバイスの位置を入力として取り、適切な場所に適切なサイズでアイコンを重ねてカメラ ビューを表示することだけです。

私は2つの場所で立ち往生しています:

デバイスの現在の方位角、ピッチ、およびロールの更新を取得するコードを作成しました。コードは次のようになります。

    private final SensorEventListener goodListener = new SensorEventListener() {
    private float[] magneticValues;
    private float[] accelerometerValues;

    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

    public void onSensorChanged(SensorEvent event) {
        switch (event.sensor.getType()) {
        case Sensor.TYPE_MAGNETIC_FIELD:
            magneticValues = event.values.clone();
            break;
        case Sensor.TYPE_ACCELEROMETER:
            accelerometerValues = event.values.clone();
            break;
        }

        if (magneticValues != null && accelerometerValues != null) {
            float[] outR = new float[9];
            float[] orientationValues = new float[3];

            SensorManager.getRotationMatrix(outR, null,
                    accelerometerValues, magneticValues);
            SensorManager.getOrientation(outR, orientationValues);

            double azimuth = Math.toDegrees(orientationValues[0]);
            double pitch = Math.toDegrees(orientationValues[1]);
            double roll = Math.toDegrees(orientationValues[2]);

        }
    }

ログを使用してこれらの値を読み取ると、比較的安定しているように見えますが、自然な軸のセットの周りの角度に対応していないようで、数値が何を表しているのかわかりません。これらの数値をどのように解釈すればよいですか?

http://www.devx.com/wireless/Article/42482/0/page/3のチュートリアルでは、はるかに単純なアプローチを採用していますが、機能させることができません。

デバイスの方位角、ピッチ、ロール、および自分の緯度と経度、および他のデバイスの緯度と経度を取得したら、画面上のどこにアイコンを配置するかをどのように決定できますか? これは、カメラの視野を無限円錐として想像し、それを地球の表面に投影し、他の場所が投影された領域内にあるかどうかを確認する必要がある複雑な幾何学問題のようですが、これは非常に複雑に思えます。私が見落としているより良い方法はありますか?

4

1 に答える 1

1

あなたの質問に対する直接的な回答ではありませんが、mixare source codeを見てみることができます。

興味のあるコア コードは、次のクラスにあります: https://github.com/mixare/mixare/blob/master/src/org/mixare/MixView.java 行番号 212 以降。

ご覧のとおり、コードは方位角、ピッチ、ロールを使用せず、マトリックスを操作しています。

幾何学の問題に関しては、「[カメラの FOV] を地球の表面に投影する」と言うとき、私は理解できません。FOV は、ユーザーを囲む仮想球体に投影されていると言えます。

于 2012-06-11T11:33:20.530 に答える