1

座標 (0, 0, 0) を指す OpenGL で描画された 3D 矢印があり、GPS の位置と方向に応じて特定の GPS 位置を指すようにします。

(携帯電話の向きで)方位角を計算し、(磁北ではなく)実際の北になるように調整してみました。

SensorManager.getOrientation(remappedRotationMatrix, orientation);

    // convert radians to degrees
    float azimuth = orientation[0];
    azimuth = azimuth * 360 / (2 * (float) Math.PI);
    GeomagneticField geoField = new GeomagneticField(
                 Double.valueOf(loc.getLatitude()).floatValue(),
                 Double.valueOf(loc.getLongitude()).floatValue(),
                 Double.valueOf(loc.getAltitude()).floatValue(),
                 System.currentTimeMillis());
    // converts magnetic north into true north
    azimuth -= geoField.getDeclination();

次に、自分の場所からポイントしたい場所までの方位を取得します。

    target.setLatitude(42.806484);
    target.setLongitude(-1.632482);

    float bearing = loc.bearingTo(target); // (it's already in degrees)
    if (bearing < 0) {
        bearing = bearing + 360;
    }

    float degrees = bearing - azimuth;
    if (degrees < 0) {
        degrees = degrees + 360;
    }

矢印を回転させる角度を計算します

gl.glRotatef(degrees, 0.0f, 1.0f, 0.0f);
arrow.draw(gl);

何とかする方法はありますか?GPS 位置を OpenGL 座標に変換し、それを指すために GLU.gluLookAt を使用する別の可能性はありますか?

ありがとう。

4

2 に答える 2

0

これは純粋に数学の問題のようです。

あなたの質問はかなり漠然としています。シーンがどのように設定され、何を望んでいるのかをより正確に理解しないと、私はあなたを助けることができないと思います.

3D 回転行列の使い方を知っていますか? そうでない場合は、おそらくそれらがどのように機能するかを学ぶ必要があります。

于 2012-04-12T23:06:09.493 に答える
0

方位を計算して、得られた角度で矢印を回転させるのは複雑ではありません。OpenGLではありませんが、2Dでも同じことをしました。Radar サンプル (http://apps-for-android.googlecode.com/svn/trunk/Radar/) に基づいてコードを作成しました。2D矢印を描く方法は次のとおりです。

    double bearingToTarget = mBearing - mOrientation;

    // Draw an arrow in direction of target
    canvas.rotate((float) bearingToTarget, center, center);
    final int tipX = center;
    final int tipY = center-radius;
    canvas.drawLine(center, center, tipX, tipY, mArrowPaint);
    final int tipLen = 30;
    final int tipWidth = 20;
    Path path = new Path();
    path.moveTo(tipX, tipY);
    path.lineTo(tipX + tipWidth/2, tipY + tipLen);
    path.lineTo(tipX - tipWidth/2, tipY + tipLen);
    path.lineTo(tipX, tipY);
    path.close();
    canvas.drawPath(path, mArrowPaint);
    canvas.restore();

mBearing は、複雑な計算を処理する Radar サンプルの GeoUtils.bearing メソッドを使用して計算されます。mOrientation は、センサー リスナーからの方向です。つまり、ポイントしたい GPS 位置の方位 (mBearing) と電話の現在の向き (mOrientation) の差を計算するという考え方です。これにより、角度「bearingToTarget」が得られます。次に、y 軸に沿って矢印を描く前に、ビューをその中心を中心にその角度だけ回転させます。これは、bearingToTarget 度だけ回転した矢印を描画するのと同じです。

矢印を描画する前に、画面の中心を中心に、bearToTarget 度だけビューを回転させることで、OpenGL で同じロジックを適用できるはずです。どの点を中心に回転するかは、ビューの設定方法によって異なります。簡単にするために、矢印の始点を原点にします。次に、glRotatef を使用して原点を中心に簡単に回転できます。それ以外の場合は、最初に回転の中心に移動し、回転してから再び移動する必要があります (これは、ポイントを中心とした回転の一般的な OpenGL 手法です)。

于 2012-04-12T23:21:38.250 に答える