2012-04-12 10 views
1

座標(0、0、0)を指すOpenGLで描画された3D矢印があり、GPSの位置と方向に応じて特定のGPS位置を指しています。OpenGLの3Dオブジェクトを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を使用することですか?

ありがとうございました。

答えて

0

これは純粋に数学的問題であるようです。

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

3D回転行列の使い方を知っていますか?もしそうでなければ、彼らはどのように動作するかを知るべきでしょう。

+0

私は自分のコードの一部を表示するように質問を編集しましたので、私が尋ねていることを人々が理解できるようになりました。私は昨日できませんでした。 – richartidus

0

ベアリングを計算してから矢印を回転させるのは複雑です。私はOpenGLではなく2Dで同じことをしました。レーダーサンプル(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は、複雑な数学の世話をするレーダーサンプルからメソッドGeoUtils.bearingを使用して計算されます。 mOrientationは、センサーリスナーからの方向です。だから、アイデアはあなたが指したいGPS位置の方位(mBearing)と電話の現在の方位(mOrientation)の違いを計算することです。これにより、bearingToToargetという角度が与えられます。次に、y軸に沿って矢印を描く前に、その角度で中心を中心にビューを回転させます。これは、bearingToTarget度で回転された矢印を描画するのと同じです。

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

+0

私は自分のコードのいくつかを表示するように質問を編集しました。私は、人々が私がよく尋ねていることを理解できるように、私は昨日できませんでした。 – richartidus

+0

コードが正しいように見えます。あなたはそれを実行するときに正確に何が動作していないのですか? – Josh

+0

矢印は、電話が特定の位置に保たれている場合を除き、丸くなりますが、電話を少し動かすと矢印が狂ってしまいます。私は、携帯電話のセンサーが問題だと思う、getOrientation関数は非常に異なるデータを与え、必要でなければ矢印を動かさない方法を見つけることができない – richartidus

関連する問題